注意:可能的 GrapbDB 错误(见评论)
我在 GraphDB 中有这个知识库:
PREFIX : <http://my_awesome_cats_collection#>
PREFIX wd: <http://www.wikidata.org/entity/>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
:foo a :cat ;
:name 'Marble' ;
owl:sameAs wd:Q27745011 .
# and many other cats
我试过这个联合查询
select * where {
# remote service
SERVICE <https://query.wikidata.org/sparql> {
?cat wdt:P463 ?membership
}
?cat :name ?name .
VALUES ?name {'Marble'}
}
我从 Wikidata(即 Musashi 的 Marble 成员)得到了预期的结果。
如果我像这样切换模式的顺序:
select * where {
?cat :name ?name .
VALUES ?name {'Marble'}
# remote service
SERVICE <https://query.wikidata.org/sparql> {
?cat wdt:P463 ?membership
}
}
我得到了许多误报结果(即,属于 Musashi 的其他猫的数据,而我只想得到 Marble。我猜是本地模式和远程模式之间的一种交叉产品)。
在SPARQL 1.1的官方文档中,他们说:
联合查询可以使用 VALUES 子句来约束从远程端点接收到的结果,该结果基于解决方案绑定来评估查询的其他部分。
(摘录内容丰富。感谢@TallTed 指出这一点)
那么,在联合时,VALUES
只能作为最终过滤器使用吗?到底是怎么回事?
编辑:
- 使用 GraphDB 执行查询
- 这似乎是 GraphDB 查询优化器的一个错误(感谢:Stanislav Kralin)