无法使用GraphDB REST接口执行SPARQL选择查询

时间:2019-01-15 00:20:02

标签: rest sparql graphdb rdf4j

我有一个在VPS上运行的graphDB实例,我想获取具有hasUnit关系的组织的列表。 以下查询可以在SPARQL执行页面上正常执行:

PREFIX org: <http://www.w3.org/ns/org#>
SELECT (?s AS ?Organization) (COUNT(?o) AS ?Count)
WHERE{
    ?s org:hasUnit ?o  .
} GROUP BY ?s

但是当我尝试使用REST接口获取结果时,出现错误“格式错误的查询:org.eclipse.rdf4j.query.parser.sparql.ast.VisitorException:QName'org:hasUnit'使用未定义的前缀”

这是我的请求uri:

http://23.101.230.37:7200/repositories/CSIRO?query= SELECT (?s AS ?Organization) (COUNT(?o) AS ?Count) WHERE{
    ?s org:hasUnit ?o  . } GROUP BY ?s

尽管以下查询执行得很好:

http://23.101.230.37:7200/repositories/CSIRO?query= SELECT (?s AS ?Organization) (COUNT(?o) AS ?Count) WHERE{
    ?s ?p ?o  . } GROUP BY ?s

1 个答案:

答案 0 :(得分:1)

问题是,如错误消息所示,查询中未定义名称空间前缀org:

请注意,在您在Workbench UI中尝试过的查询中,这是第一行:

PREFIX org: <http://www.w3.org/ns/org#> 

但是您通过REST API调用所做的请求中缺少此行。要解决此问题,请在执行REST调用时从此行开始SPARQL查询:

http://23.101.230.37:7200/repositories/CSIRO?query=PREFIX org: <http://www.w3.org/ns/org#> SELECT (?s AS ?Organization) (COUNT(?o) AS ?Count) WHERE{ ?s org:hasUnit ?o  . } GROUP BY ?s

编辑注意,当您将SPARQL查询作为这样的参数放入URL中时,实际的SPARQL查询需要采用urlencoded格式-尽管某些客户端工具可能会为您处理。为了便于阅读,此处未对其进行编码。

顺便说一句,第二个查询没有得到这个错误的原因是,在第二个查询中,您没有使用任何带有org:前缀的谓词。

RDF和SPARQL中的每个资源都由IRI标识。例如,在查询中,您使用属性标识符http://www.w3.org/ns/org#hasUnit。名称空间前缀是一种引入简写的方式,因此您不必每次都写下完整的IRI。在此示例中,org:成为http://www.w3.org/ns/org#的简写,因此属性标识符可以写为org:hasUnit的简写形式(作为前缀名)。