HyperGraphQL-跨多个服务联合SPARQL

HyperGraphQL-跨多个服务联合SPARQL,graphql,sparql,ontology,Graphql,Sparql,Ontology,我不确定这是否是我使用HyperGraphQL的方式,或者我对SPARQL/RDF的有限知识,任何指点都会非常感激 我正在尝试设置多个SPARQL端点,并希望能够创建一个能够跨越这些端点的图形 我尝试使用以下chinook.db,并将此数据拆分为3个不同的SPARQL服务,如下所示: 我正试图创建一个跨越这些服务边界的SPARQL链接,例如,订单中的客户对象服务有一个到人力资源服务中的员工对象的链接,这样当我查询客户时,我就能够得到(订单)客户.SupportedRep-->(人力资源)员工。

我不确定这是否是我使用HyperGraphQL的方式,或者我对SPARQL/RDF的有限知识,任何指点都会非常感激

我正在尝试设置多个SPARQL端点,并希望能够创建一个能够跨越这些端点的图形

我尝试使用以下
chinook.db
,并将此数据拆分为3个不同的SPARQL服务,如下所示:

我正试图创建一个跨越这些服务边界的SPARQL链接,例如,
订单中的
客户
对象
服务有一个到
人力资源
服务中的
员工
对象的链接,这样当我查询
客户
时,我就能够得到
(订单)客户.SupportedRep-->(人力资源)员工
。基本上,我应该能够获得支持该客户的员工详细信息

我已按如下方式设置配置:

1。chinook.json

2:Schema文件:chinook.graphql

请注意我是如何建立上述关系的,这就是我遇到的问题:

SupportRep:Employees@service(id:“chinook hr sparql”)

此外,在TTL文件中的我的数据中,我已通过手动编辑值来更改SupportRep的链接,使其具有指向HR系统URI的链接,以显示以下内容:

<http://localhost:7002/resource/CUSTOMERS/1> rdf:type owl:NamedIndividual ,
                                                      vocab:CUSTOMERS ;
                                             vocab:CUSTOMERS_ADDRESS "Av. Brigadeiro Faria Lima, 2170" ;
                                             vocab:CUSTOMERS_CITY "São José dos Campos" ;
                                             vocab:CUSTOMERS_COMPANY "Embraer - Empresa Brasileira de Aeronáutica S.A." ;
                                             vocab:CUSTOMERS_COUNTRY "Brazil" ;
                                             vocab:CUSTOMERS_CUSTOMERID 1 ;
                                             vocab:CUSTOMERS_EMAIL "luisg@embraer.com.br" ;
                                             vocab:CUSTOMERS_FAX "+55 (12) 3923-5566" ;
                                             vocab:CUSTOMERS_FIRSTNAME "Luís" ;
                                             vocab:CUSTOMERS_LASTNAME "Gonçalves" ;
                                             vocab:CUSTOMERS_PHONE "+55 (12) 3923-5555" ;
                                             vocab:CUSTOMERS_POSTALCODE "12227-000" ;
                                             vocab:CUSTOMERS_STATE "SP" ;
                                             vocab:CUSTOMERS_SUPPORTREPID <http://localhost:7003/resource/EMPLOYEES/3> ;
                                             rdfs:label "CUSTOMERS #1" .
有人能帮我理解我的方法有什么问题吗,或者我如何解决这个问题

更新1:

我终于设法让日志工作起来,下面是我在日志上看到的内容:

[pool-5-thread-1] DEBUG org.hypergraphql.datafetching.SPARQLEndpointExecution  - SELECT * WHERE { VALUES ?x_1 { <http://localhost:7002/resource/CUSTOMERS/11> }  OPTIONAL { ?x_1 <http://localhost:7002/resource/vocab/CUSTOMERS_SUPPORTREPID> ?x_1_1 .?x_1_1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://localhost:7003/resource/vocab/EMPLOYEES> . OPTIONAL { ?x_1_1 <http://localhost:7003/resource/vocab/EMPLOYEES_FIRSTNAME> ?x_1_1_1 . }  }  } 
[pool-5-thread-1] DEBUG org.apache.jena.riot.web.HttpOp  - [1] GET http://localhost:7003/sparql?query=SELECT++*%0AWHERE%0A++%7B+VALUES+%3Fx_1+%7B+%3Chttp%3A%2F%2Flocalhost%3A7002%2Fresource%2FCUSTOMERS%2F11%3E+%7D%0A++++OPTIONAL%0A++++++%7B+%3Fx_1++++%3Chttp%3A%2F%2Flocalhost%3A7002%2Fresource%2Fvocab%2FCUSTOMERS_SUPPORTREPID%3E++%3Fx_1_1+.%0A++++++++%3Fx_1_1++a+++++++++++++++++++++%3Chttp%3A%2F%2Flocalhost%3A7003%2Fresource%2Fvocab%2FEMPLOYEES%3E%0A++++++++OPTIONAL%0A++++++++++%7B+%3Fx_1_1++%3Chttp%3A%2F%2Flocalhost%3A7003%2Fresource%2Fvocab%2FEMPLOYEES_FIRSTNAME%3E++%3Fx_1_1_1+%7D%0A++++++%7D%0A++%7D%0A
[pool-5-thread-1]DEBUG org.hypergraphql.datafetching.sparqlendompecution-选择*WHERE{VALUES?x_1{}可选{x_1?x_1_1.}
[pool-5-thread-1]DEBUG org.apache.jena.riot.web.HttpOp-[1]得到http://localhost:7003/sparql?query=SELECT++*%在这里,0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2F本地主机%3A7003%2Fresource%2Fvocab%2FEMPLOYEES%3E%0A++++++++++++%7B++%3Fx_1_1++%3Chttp%3A%2F%2Flocalhost%3A7003%2Fresource%2Fvocab%2FEMPLOYEES_FIRSTNAME%3E++%3Fx_1_1++%7D%0A++%7D%0A%7D%7D%
因此,它实际上调用了外部
SPARQL端点
,而
http://localhost:7003/sparql
对这件事一无所知

{VALUES?x_1{}


我们如何解决这个问题?

我终于明白了
HyperGraphQL
生成这些
SPARQL
的方法如下所示

SELECT * WHERE { VALUES ?x_1 { <http://localhost:7002/resource/CUSTOMERS/11> }  OPTIONAL { ?x_1 <http://localhost:7002/resource/vocab/CUSTOMERS_SUPPORTREPID> ?x_1_1 .?x_1_1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://localhost:7003/resource/vocab/EMPLOYEES> . OPTIONAL { ?x_1_1 <http://localhost:7003/resource/vocab/EMPLOYEES_FIRSTNAME> ?x_1_1_1 . }  }  } 
选择*WHERE{VALUES?x_1{}可选{?x_1?x_1_1。?x_1_1.可选{?x_1_1?x_1_1.}
这实际上是发送的

http://localhost:7003/sparql?query=

因此它基本上期望在
7003
上有一个图表,包含像这样的
?x_1?x_1_1.

我通过将客户主数据和此关系从
7002
上的
Orders SYS
复制到
7003
上的
HR SYS
上,使其正常工作

然而,我认为这破坏了
SPARQL
联合的目的

java.util.concurrent.ExecutionException: HttpException: 400 HTTP 400 error making the query:
 Parse error:  SELECT  * WHERE   { VALUES ?x_2 { <http://localhost:7002/resource/CUSTOMERS/11> }     OPTIONAL       { ?x_2    <http://localhost:7002/resource/vocab/CUSTOMERS_SUPPORTREPID>  ?x_2_1 .         ?x_2_1  a                     <http://localhost:7003/resource/vocab/EMPLOYEES>         OPTIONAL           { ?x_2_1  <http://localhost:7003/resource/vocab/EMPLOYEES_FIRSTNAME>  ?x_2_1_1 }       }   }   
Lexical error at line 3, column 11.  Encountered: " " (32), after : "VALUES"
            at java.util.concurrent.FutureTask.report(Unknown Source)
            at java.util.concurrent.FutureTask.get(Unknown Source)
            at org.hypergraphql.datafetching.services.SPARQLEndpointService.iterateFutureResults(SPARQLEndpointService.java:86)
            at org.hypergraphql.datafetching.services.SPARQLEndpointService.executeQuery(SPARQLEndpointService.java:69)
            at org.hypergraphql.datafetching.ExecutionTreeNode.generateTreeModel(ExecutionTreeNode.java:357)
            at org.hypergraphql.datafetching.FetchingExecution.call(FetchingExecution.java:21)
            at org.hypergraphql.datafetching.FetchingExecution.call(FetchingExecution.java:8)]
[pool-5-thread-1] DEBUG org.hypergraphql.datafetching.SPARQLEndpointExecution  - SELECT * WHERE { VALUES ?x_1 { <http://localhost:7002/resource/CUSTOMERS/11> }  OPTIONAL { ?x_1 <http://localhost:7002/resource/vocab/CUSTOMERS_SUPPORTREPID> ?x_1_1 .?x_1_1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://localhost:7003/resource/vocab/EMPLOYEES> . OPTIONAL { ?x_1_1 <http://localhost:7003/resource/vocab/EMPLOYEES_FIRSTNAME> ?x_1_1_1 . }  }  } 
[pool-5-thread-1] DEBUG org.apache.jena.riot.web.HttpOp  - [1] GET http://localhost:7003/sparql?query=SELECT++*%0AWHERE%0A++%7B+VALUES+%3Fx_1+%7B+%3Chttp%3A%2F%2Flocalhost%3A7002%2Fresource%2FCUSTOMERS%2F11%3E+%7D%0A++++OPTIONAL%0A++++++%7B+%3Fx_1++++%3Chttp%3A%2F%2Flocalhost%3A7002%2Fresource%2Fvocab%2FCUSTOMERS_SUPPORTREPID%3E++%3Fx_1_1+.%0A++++++++%3Fx_1_1++a+++++++++++++++++++++%3Chttp%3A%2F%2Flocalhost%3A7003%2Fresource%2Fvocab%2FEMPLOYEES%3E%0A++++++++OPTIONAL%0A++++++++++%7B+%3Fx_1_1++%3Chttp%3A%2F%2Flocalhost%3A7003%2Fresource%2Fvocab%2FEMPLOYEES_FIRSTNAME%3E++%3Fx_1_1_1+%7D%0A++++++%7D%0A++%7D%0A
SELECT * WHERE { VALUES ?x_1 { <http://localhost:7002/resource/CUSTOMERS/11> }  OPTIONAL { ?x_1 <http://localhost:7002/resource/vocab/CUSTOMERS_SUPPORTREPID> ?x_1_1 .?x_1_1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://localhost:7003/resource/vocab/EMPLOYEES> . OPTIONAL { ?x_1_1 <http://localhost:7003/resource/vocab/EMPLOYEES_FIRSTNAME> ?x_1_1_1 . }  }  }