1

我有一个在 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 接口获取结果时,我收到一个错误“MALFORMED QUERY: org.eclipse.rdf4j.query.parser.sparql.ast.VisitorException: QName 'org:hasUnit' uses an undefined prefix”

这是我的请求 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
4

1 回答 1

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 中时,它需要采用urlencoded形式——尽管一些客户端工具可能会为您处理这个问题。为了便于阅读,我在这里未对其进行编码。

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

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

于 2019-01-15T01:54:49.213 回答