【问题标题】:Order of expressions in a SPARQL querySPARQL 查询中的表达式顺序
【发布时间】:2018-02-16 13:48:39
【问题描述】:
下面的两个查询有什么区别吗?
select distinct ?i
where{
?i rdf:type <http://foo/bar#A>.
FILTER EXISTS {
?i <http://foo/bar#hasB> ?b.
?b rdf:type <http://foo/bar#B1>.
}
}
select distinct ?i
where{
FILTER EXISTS {
?i <http://foo/bar#hasB> ?b.
?b rdf:type <http://foo/bar#B1>.
}
?i rdf:type <http://foo/bar#A>.
}
在性能或结果方面存在差异?
【问题讨论】:
标签:
sparql
rdf
semantic-web
rdfs
triplestore
【解决方案1】:
首先,您不需要FILTER EXISTS。您可以使用基本图形模式(一组常规三元组模式)重写您的查询。但假设您使用的是FILTER NOT EXISTS 或类似的东西。
结果
一般来说,order matters。
但是,自上而下的评估语义主要在 OPTIONAL 的情况下发挥作用,这不是你的情况。因此,结果应该是相同的。
自上而下的评估语义可以被bottom-up 评估语义覆盖。幸运的是,自下而上的语义 doesn't prescribe 首先在逻辑上评估 FILTER 尽管在 FILTER EXISTS 和 FILTER NOT EXISTS 的情况下是可能的。
SPARQL 代数 representation 对于两个查询是相同的:
(prefix ((rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>)
(foobar: <http://foo/bar#>))
(distinct
(project (?i)
(filter (exists
(bgp
(triple ?i foobar:B ?b)
(triple ?b rdf:type foobar:B1)
))
(bgp (triple ?i rdf:type foobar:A))))))
性能
按照自上而下的语义,引擎应该首先评估?i a foobar:A。
- 你很幸运,如果
?i 只存在一个绑定。
- 如果
?i 存在数百万个绑定,而子模式的选择性要高得多,那么你就没有那么幸运了。
幸运的是,优化器会尝试根据其选择性对模式进行重新排序。但是,预测可能是错误的。
顺便说一句,rdf:type 谓词 is said to be 是 Virtuoso 中的性能杀手。
结果与性能
如果端点有查询执行时间限制并在达到超时时刷新部分结果,则结果可能不同:an example。