我有一个在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
答案 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
的简写形式(作为前缀名)。>