解决 Graphql 的异步函数无法 return 通过具有 rdf 数据的 Stardog 服务器查询的数据

Resolve asynchronous function of Graphql not able to return data queried over Stardog server having rdf data

我正在尝试使用 graphql 查询 stardog 服务器,下面是我的代码。

import {
  GraphQLSchema,
  GraphQLObjectType,
  GraphQLInt,
  GraphQLString,
  GraphQLList,
  GraphQLNonNull,
  GraphQLID,
  GraphQLFloat
} from 'graphql';

import axios from 'axios';

var stardog = require("stardog");

let Noun = new GraphQLObjectType({
      name: "Noun",
      description: "Basic information on a GitHub user",
      fields: () => ({
          "c": {
       type: GraphQLString,
       resolve: (obj) => {
        console.log(obj);
          }
        }
     })
});

const query = new GraphQLObjectType({
      name: "Query",
      description: "First GraphQL for Sparql Endpoint Adaptive!",
      fields: () => ({
        noun: {
          type: Noun,
          description: "Noun data from fibosearch",
          args: {
            noun_value: {
              type: new GraphQLNonNull(GraphQLString),
              description: "The GitHub user login you want information on",
            },
          },
          resolve: (_,{noun_value}) => {
              var conn = new stardog.Connection();

              conn.setEndpoint("http://stardog.edmcouncil.org");
              conn.setCredentials("xxxx", "xxxx");
                conn.query({
                    database: "jenkins-stardog-load-fibo-30",
                    query: `select ?c  where {?s rdfs:label '${noun_value}'. ?c rdfs:subClassOf ?s}`,  
                    limit: 10,
                    offset: 0
                },
                function (data) {
                       console.log(data.results.bindings);
                       return data.results.bindings;
                });  
              }
            },
          })
      });

const schema = new GraphQLSchema({
  query
});

export default schema;

查询成功执行,我可以在控制台上看到结果,但是 function(data) 中的 return data.results.bindings; 没有将此结果返回到 [=15] 下的 Noun 类型系统=] 并且返回的 obj 显示为空,而不是从 GraphQL 查询返回的结果 bindings。如果有人可以帮助我弄清楚我在这里缺少什么,那就太好了。

提前致谢, 亚什帕尔

在您的查询中,noun字段的resolve函数是一个异步操作(查询部分)。但是你的代码是同步的。因此,实际上没有任何内容会立即从 resolve 函数中得到 returned。这导致没有任何内容传递给 Noun GraphQL 对象类型的解析函数。这就是为什么当你打印 obj.

时你会得到 null

对于 resolve 函数中的异步操作,您必须 return 一个以预期结果解析的承诺对象。你也可以使用 ES7 async/await 特性;在这种情况下,您必须声明 resolve: async (_, {noun_value}) => { // awaited code}.

使用 Promise,代码如下所示:

resolve: (_,{noun_value}) => {
  var conn = new stardog.Connection();

  conn.setEndpoint("http://stardog.edmcouncil.org");
  conn.setCredentials("xxxx", "xxxx");
  return new Promise(function(resolve, reject) {
    conn.query({
      database: "jenkins-stardog-load-fibo-30",
      query: `select ?c  where {?s rdfs:label '${noun_value}'. ?c rdfs:subClassOf ?s}`,  
      limit: 10,
      offset: 0
    }, function (data) {
      console.log(data.results.bindings);
      if (data.results.bindings) {
        return resolve(data.results.bindings);
      } else {
        return reject('Null found for data.results.bindings');
      }
    });
  });
}