繁体   English   中英

SPARQL查询中的表达式顺序

[英]Order of expressions in a SPARQL query

以下两个拖曳查询有什么区别?

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>.             
    }

在性能或结果方面有差异吗?

首先,您不需要FILTER EXISTS 您可以使用基本图形模式(一组常规的三重模式)重写查询。 但是,让我们假设您正在使用FILTER NOT EXISTS或类似的东西。

结果

通常, 顺序很重要

但是,自上而下的评估语义主要在OPTIONAL情况下起作用,而事实并非如此。 因此,结果应该相同。

自上而下的评估语义可以被自下而上的评估语义覆盖。 幸运的是,尽管在FILTER EXISTSFILTER NOT EXISTS情况下,自下而上的语义并没有规定首先要对FILTER逻辑评估。

两个查询的SPARQL代数表示形式都相同:

(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))))))

性能

天真的遵循自上而下的语义,引擎应首先评估?ia foobar:A

  • 如果仅存在一个绑定?i ,那么您很幸运。
  • 如果存在?i数百万个绑定,而子模式的选择性更大的话,您就不太幸运了。

幸运的是,优化程序尝试根据其选择性对模式进行重新排序。 但是,预测可能是错误的。

顺便说一句, rdf:type谓词在Virtuoso中被认为是性能杀手。

结果与绩效

如果端点具有查询执行时间限制并在达到超时时刷新部分结果,则结果可能会有所不同: 例如

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM