【问题标题】: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>.             
    }

在性能或结果方面存在差异?

【问题讨论】:

  • 不,结果没有区别,只是对?i的绑定进行了过滤

标签: sparql rdf semantic-web rdfs triplestore


【解决方案1】:

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

结果

一般来说,order matters

但是,自上而下的评估语义主要在 OPTIONAL 的情况下发挥作用,这不是你的情况。因此,结果应该是相同的。

自上而下的评估语义可以被bottom-up 评估语义覆盖。幸运的是,自下而上的语义 doesn't prescribe 首先在逻辑上评估 FILTER 尽管在 FILTER EXISTSFILTER 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-04
    • 1970-01-01
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    • 2014-10-05
    相关资源
    最近更新 更多