[英]The difference between blank nodes and variables in SPARQL queries
我研究了關於該主題的SPARQL 規范,並且發現這個答案相當有趣。 但是定義已經足夠復雜了,所以我仍然看不到我的問題的答案。
我找不到任何帶有空白節點的查詢示例,這些示例返回的結果與帶有變量代替空白節點的相同查詢返回的結果不同。
例如,是否存在以下查詢返回不同結果的情況:
SELECT?a?b WHERE {?a:predicate _:blankNode. _:blankNode:otherPredicate?b. }
SELECT?a?b WHERE {?a:predicate?variable. ?variable:otherPredicate?b. }
也許有更復雜的查詢會導致不同的行為?
特別是我想知道是否有任何在沒有空白節點的 RDF 圖上執行查詢的不同結果的例子。
謝謝。
附言。 是的,我知道空白節點只能在一個 BasicGraphPattern 中使用,而不是變量。 但這不是我說的區別。
您鏈接的答案是關於正在查詢的數據中的空白節點,而不是查詢中的空白節點。 你是絕對正確的,查詢中的空白節點就像變量一樣。 規范說明了這一點(重點補充):
4.1.4空節點的語法
圖形模式中的空白節點充當變量 ,而不是對要查詢的數據中的特定空白節點的引用。
空白節點由標簽形式表示,例如“_:abc”或縮寫形式“[]”。 可以使用[]指示在查詢語法中僅在一個位置使用的空白節點。 將使用唯一的空白節點來形成三重模式。 對於標記為“abc”的空白節點,空白節點標簽寫為“_:abc”。 相同的空白節點標簽不能在同一查詢中的兩個不同的基本圖形模式中使用。
因此,您的查詢
SELECT ?a ?b
WHERE {
?a :predicate _:blankNode .
_:blankNode :otherPredicate ?b .
}
SELECT ?a ?b
WHERE {
?a :predicate ?variable .
?variable :otherPredicate ?b .
}
表現相同。 使用空節點而不是變量的好處是您可以使用更緊湊的語法。 在這種情況下,你可以寫:
SELECT ?a ?b
WHERE {
?a :predicate [ :otherPredicate ?b ] .
}
實際上,在這種情況下,由於您只在空白節點匹配的事物上查找一個屬性,因此您可以使用屬性路徑:
SELECT ?a ?b
WHERE {
?a :predicate/:otherPredicate ?b .
}
對於大多數蘊涵制度,空白節點是基本圖形模式中的變量。 對於OWL-DL(和其他人),您可以獲得更多答案(例如“小房子”和“俄狄浦斯”示例 - 描述邏輯手冊有詳細信息)。
在SPARQL的定義http://www.w3.org/TR/sparql11-query/#BasicGraphPattern中,為簡單起見,實例映射σ(b)的行為就像解映射μ(v)一樣。
一個沒有明確討論的重要因素是空白節點“變量”將結果限制為空白節點資源。 普通變量使用所有可用值(命名資源、空白節點資源和文字)。
此外,空白節點“變量”不能用於 BIND 等函數中,也不能用作結果中的列。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.