Search code examples
node.jsrepositoryrdfpayloadgraphdb

Graphdb.js node.js one server.repository connection multiple queries through Rest APIs


I am using nodejs and graphdbjs. My question is can I have one repository active and set two queries (payloads as in this case) that will be run on demand as REST APis. For example

const server = new ServerClient(serverConfig);
const readTimeout = 30000;
const writeTimeout = 30000;
const repositoryClientConfig = new RepositoryClientConfig(['http://localhost:7200/repositories/V2'], {}, '', readTimeout, writeTimeout);
server.getRepository('V2',repositoryClientConfig).then(repository => {  
  repository.registerParser(new SparqlJsonResultParser());

    const payload = new GetQueryPayload()
      .setQuery('select * where {?s ?p ?o}')
      .setQueryType(QueryType.SELECT)
      .setResponseType(RDFMimeType.SPARQL_RESULTS_JSON)
      .setLimit(100);
    repository.query(payload).then((stream) => {
       stream.on('data', (bindings) => {
            var test = Object.values(bindings);
         var element = {id: test[0].id.replace(/['"]+/g, ''), name: test[1].id.replace(/['"]+/g, '')}
        });
        stream.on('end', () => {          
        restapp.get('/getallIDs', function(req,res)  {
        res.send(element);
        });
        restapp.listen(3000, function () {
             console.log('App listening on port 3000!');
        });
        }); 
});




const payload2 = new GetQueryPayload()
  .setQuery('select * where {?s ?p ?o}')
  .setQueryType(QueryType.SELECT)
  .setResponseType(RDFMimeType.SPARQL_RESULTS_JSON)
  .setLimit(100);
  repository2.query(payload2).then((stream2) => {
    stream2.on('data', (bindings2) => {
    var test2 = Object.values(bindings2);
    var i2=0;
    test2.forEach(function(key,value){
      if (i2%2==1){
      return true;}
      var element2 = {id: test2[0].id.replace(/['"]+/g, ''), name: test2[1].id.replace(/['"]+/g, '')}
      i++;
      head2.table.push(element2);
    });       
    });
    stream2.on('end', () => {
    restapp2.get('/getidby', function(req,res)  {
      res.send(head2);
    });
    restapp2.listen(3000, function () {
       console.log('App listening on port 3000!');
    });
    });       

I want only to have one session and multiple payloads, and in case the user hits the correct url then it returns something as json. As of now I get an error I cannot explain:

{"level":"error","time":1572863035018,"name":"RDFRepositoryClient","repositoryUrl":"http://localhost:7200/repositories/V2","msg":"Cannot retry execution","v":1}
Error: Request failed with status code 400
    at createError (/home/estathop/eclipse-workspace/test/node_modules/axios/lib/core/createError.js:16:15)
    at settle (/home/estathop/eclipse-workspace/test/node_modules/axios/lib/core/settle.js:17:12)
    at RedirectableRequest.handleResponse (/home/estathop/eclipse-workspace/test/node_modules/axios/lib/adapters/http.js:211:9)
    at RedirectableRequest.emit (events.js:210:5)
    at RedirectableRequest._processResponse (/home/estathop/eclipse-workspace/test/node_modules/follow-redirects/index.js:269:10)
    at ClientRequest.RedirectableRequest._onNativeResponse (/home/estathop/eclipse-workspace/test/node_modules/follow-redirects/index.js:50:10)
    at Object.onceWrapper (events.js:300:26)
    at ClientRequest.emit (events.js:210:5)
    at HTTPParser.parserOnIncomingClient [as onIncoming] (_http_client.js:583:27)
    at HTTPParser.parserOnHeadersComplete (_http_common.js:115:17) 

Any help on achieving what I am trying to do ? my next step after this is getting the id from the restful service and forming the payload accordingly Thank you, sorry if my questions is dummy but I am new to this field


Solution

  • The best structured way is to have distinct files, one is the main node app.js

        var express = require('express');
    var restapp = express();
    var queryController = require('./controllers/queryController')
    
    restapp.use(queryController)
    
    restapp.listen(3001, function () {
        console.log('Αpp listening on port 3001!');
    });
    

    and as it is implied you imported the queryController.js which includes the code that does every distinct query you need to the graphdb server

    var express = require('express');
    var router = express.Router()
    
    const {ServerClient, ServerClientConfig} = require('graphdb').server;
    const {RDFMimeType} = require('graphdb').http;
    const {RepositoryClientConfig} = require('graphdb').repository;
    const {SparqlJsonResultParser} = require('graphdb').parser;
    const {GetQueryPayload} = require('graphdb').query;
    const {QueryType}= require('graphdb').query;
    const serverConfig = new ServerClientConfig('http://localhost:7200', 0, {
        'Accept': RDFMimeType.SPARQL_RESULTS_JSON
    });
    
    router.get('/hi', (req, res) => {
          res.send('hi')
    })
    
    
    
    router.get('/getallids', (req, res) => {
        head = {};
        table = [];
        head.table = table;
        const server = new ServerClient(serverConfig);
        const readTimeout = 30000;
        const writeTimeout = 30000;
        const repositoryClientConfig = new RepositoryClientConfig(['http://localhost:7200/repositories/V2'], {}, '', readTimeout, writeTimeout);
        server.getRepository('V2',repositoryClientConfig).then(repository => {  
            repository.registerParser(new SparqlJsonResultParser());     
            const payload = new GetQueryPayload()
            .setQuery('select * where {?p ?o ?k}')
            .setQueryType(QueryType.SELECT)
            .setResponseType(RDFMimeType.SPARQL_RESULTS_JSON)
            .setLimit(100);
            repository.query(payload).then((stream) => {
                    stream.on('data', (bindings) => {
                    var test = Object.values(bindings);
                    var i=0;
                    test.forEach(function(key,value){
                        test2 = Object.values(key);
                        if (i%2==1){
                        return true;}
                        var element = {id: test[0].id.replace(/['"]+/g, ''), name: test[1].id.replace(/['"]+/g, '')}
                        i++;
                        head.table.push(element);
                    });       
                });
                stream.on('end', () => {  
                        res.send(head);   
                });       
            }).catch(err => console.log(err));
        });
    })
    
    
    router.get('/getid/:id', (req, res) => {
        const params = req.params;
        head = {};
        table = [];
        head.table = table;
        const server = new ServerClient(serverConfig);
        const readTimeout = 30000;
        const writeTimeout = 30000;
        const repositoryClientConfig = new RepositoryClientConfig(['http://localhost:7200/repositories/V2'], {}, '', readTimeout, writeTimeout);
        server.getRepository('V2',repositoryClientConfig).then(repository => {  
            repository.registerParser(new SparqlJsonResultParser());     
            const payload = new GetQueryPayload()
            .setQuery('select'+Object.values(params)+'where {?p ?o ?k}')
            .setQueryType(QueryType.SELECT)
            .setResponseType(RDFMimeType.SPARQL_RESULTS_JSON)
            .setLimit(100);
            repository.query(payload).then((stream) => {
                    stream.on('data', (bindings) => {
                    var test = Object.values(bindings);
                    var i=0;
                    test.forEach(function(key,value){
                        test2 = Object.values(key);
                        if (i%2==1){
                        return true;}
                        var element = {key: test[0].id.replace(/['"]+/g, ''), value: test[1].id.replace(/['"]+/g, '')}
                        i++;
                        head.table.push(element);
                    });       
                });
                stream.on('end', () => {
                        res.send(head);  
                });       
            }).catch(err2 => console.log(err2));
        });
    })
    module.exports = router;