[英]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 EXISTS
和FILTER 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.