使用FILTER查询(?document =“uriNode”)不返回任何结果

时间:2013-11-10 13:55:15

标签: rdf sparql jena

我正在使用Jena执行下面的SPARQL查询,其中uriNode是表示String的{​​{1}},但此查询不会给我任何结果。我已经检查了数据库,那里确实存在URI。有什么问题?

URI

2 个答案:

答案 0 :(得分:3)

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

FILTER (?document = <" + uriNode + ">" )

答案 1 :(得分:1)

AndyS's answer是正确的,因为您目前正在检查?document是否是某个特定的字符串。由于字符串(更一般地说,文字)不能成为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
}