簡體   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