【发布时间】:2018-11-26 14:07:15
【问题描述】:
注意:可能存在 GrapbDB 错误(参见 cmets)
我在 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 的 official doc 中,他们说:
联合查询可以使用 VALUES 子句来约束结果 基于解决方案绑定从远程端点接收来自 评估查询的其他部分。
(摘录信息丰富。感谢@TallTed 指出这一点)
那么,在联合时,VALUES 是否只能用作最终过滤器?怎么回事?
编辑:
- 使用 GraphDB 执行查询
- 这似乎是 GraphDB 查询优化器的一个错误(感谢:Stanislav Kralin)
【问题讨论】:
-
不知道您的“假阳性结果”,也不知道您本地的 SPARQL 引擎,很难说“发生了什么”。我看到的第一件事是您的两个查询中似乎都有错字——
?ca wdt:P463可能应该是?cat wdt:P463。然后,我注意到您摘录的 SPARQL 1.1 文档部分(“2.4 服务和价值的相互作用(信息性)”)是 信息性,而不是 规范性,它说 MAY 所以这只是可能性的指导。 -
我用 GraphDB 尝试了这些查询。操作,对不起:我要改正错别字。谢谢,不过这不是问题。我看到摘录只是信息丰富,但它是我在试图找出这种奇怪行为时发现的唯一参考。关于误报,我还获得了属于 Musashi 家的其他猫的数据,而我只想获得 Marble
-
1.它似乎是 GraphDB 的查询优化器错误。 2.结果似乎也取决于选择的规则集。 3、第一次查询,
?cat :name 'Marble'比较快。 4. 2.4 节无关紧要,它是关于如何通过本地获得的解决方案来调度远程查询。 -
嘿@StanislavKralin,很高兴在这里见到你!嗯不错!我要添加 GraphDB 标签来引诱 Ontotext 的人。我绝对可以使用
?cat :name 'Marble',但我不能以这种方式查询更多的猫(这就是我尝试使用VALUES的原因)。谢谢! -
只是一个想法——你可以试试
FILTER ( ?name IN ( 'Marble' ) )而不是VALUES ?name {'Marble'}...这在很多情况下会更慢,但如果它不会触发明显的错误,那就是速度不足可能是合理的。
标签: sparql rdf graphdb federated-queries