0

我正在使用 Jena 执行下面的 SPARQL 查询,其中uriNodeaString代表 a URI,但此查询没有给我任何结果。我已经检查了数据库,这URI确实存在。有什么问题?

String queryString2 = "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> " +
                    "PREFIX dc: <http://purl.org/dc/elements/1.1/> SELECT ?author WHERE { " +
                    "?document dc:creator ?author." +
                    "FILTER (?document = \"" + uriNode + "\" ). }";
4

2 回答 2

3

您正在测试是否?document是 string ?uriNode,而不是作为 URI 进行测试。

FILTER (?document = <" + uriNode + ">" )
于 2013-11-10T18:22:20.937 回答
1

AndyS 的回答是正确的,只要您目前正在检查是否?document是某个特定的string。由于字符串(以及更普遍的文字)不能成为 RDF 中三元组的主题,因此您永远不会以这种方式获得任何解决方案。您实际上需要检查它是否是特定的 URI。你可以这样filter

FILTER( ?document = <http://example.org/node> )

但这真的浪费,因为像下面这样的查询(基于你的)正在检索所有的东西,dc:creator然后把它们中的大部分扔掉。

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX dc: <http://purl.org/dc/elements/1.1/>
SELECT ?author WHERE {
  ?document dc:creator ?author.
  FILTER (?document = <http://example.org/node> ).
}

它是实际上就像向图书馆目录索取所有书籍及其作者的列表,然后逐一浏览它们并丢弃除一本书之外的所有结果。一个更有效的解决方案是询问dc:creator您真正关心的事情,因为这只会选择您想要的数据,并且不必进行任何过滤:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX dc: <http://purl.org/dc/elements/1.1/>
SELECT ?author WHERE {
  <http://example.org/node> dc:creator ?author.
}

如果需要,您可以做类似的事情,例如选择具有特定标题的文档;使用这样的查询:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX dc: <http://purl.org/dc/elements/1.1/>
SELECT ?document WHERE {
  ?document dc:title "Reply to Hayne" .
  # or, if language tags are in use, 
  # ?document dc:title "Reply to Hayne"@en
}
于 2013-11-11T01:08:04.003 回答