【问题标题】:Unable to execute SPARQL Select Query using GraphDB REST interface无法使用 GraphDB REST 接口执行 SPARQL 选择查询
【发布时间】:2019-01-15 00:20:02
【问题描述】:

我有一个在 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

【问题讨论】:

  • 你真的看不懂错误信息"QName 'org:hasUnit' uses an undefined prefix"吗?我觉得它非常清晰和有帮助。但到目前为止,您并不是第一个在 SPARQL 查询中缺少前缀声明的人。从我的角度来看,我总是尝试添加所有使用的前缀以使 SPARQL 独立,这样您就可以在任何环境中运行它而无需预定义的前缀。

标签: rest sparql graphdb rdf4j


【解决方案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

【讨论】:

  • 感谢您的回复。我能够通过转义 PREFIX 中的“#”来执行查询。这是有效的查询23.101.230.37:7200/repositories/CSIRO?query= PREFIX org: w3.org/ns/org%23> SELECT (?s AS ?Organization)WHERE{ ?s a org:OrganizationalUnit .} 请求 URL 中的“#”字符导致错误。转义它解决了问题。
  • 好吧,你真的需要对所有这些进行转义/urlencode,不仅仅是哈希,但是是的
  • @coderdecoder - 请注意,您在评论中输入的查询是不可读的,并且可能缺少字符,因为您没有将其包装在反引号中 - 这告诉降价解释器不要解释什么他们包装。我相信你会发现它完全按原样工作——http://23.101.230.37:7200/repositories/CSIRO?query=PREFIX%20org%3A%20%3Chttp%3A%2F%2Fwww.w3.org%2Fns%2Forg%23%3E%20SELECT%20(%3Fs%20AS%20%3FOrganization)%20(COUNT(%3Fo)%20AS%20%3FCount)%20WHERE%7B%20%3Fs%20org%3AhasUnit%20%3Fo%20%20.%20%7D%20GROUP%20BY%20%3Fs
  • 嗨@JeenBroekstra,我在ontontext graphdb 中运行curl http://localhost:7200/repositories/#repo-test-1?query=CONSTRUCT+%7B%3Fs+%3Fp+%3Fo%7D+WHERE+%7B%3Fs+%3Fp+%3Fo%7D+LIMIT+a10 时得到missing parameter: query,您能指点一下吗?我使用 GraphDB-Free/9.0.0 RDF4J/3.0.0
  • 这条评论上面的答案是正确的,应该被接受;我只想补充一点,curl 可以很容易地通过 REST 对 sparql 查询进行 urlencode 和测试:curl -s -G --header "Accept: application/sparql-results+json" --data-urlencode "query=$QUERY" http://localhost:7200/repositories/$REPOSITORY 其中 QUERY 是您的纯文本 SPARQL 查询,REPOSITORY 是您希望执行查询的 GraphDB 存储库。
猜你喜欢
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 2016-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多