2013-01-17 45 views
4

我想了解SPARQL查詢的計算限制,並且我想知道如何編寫一個查詢來確定兩個對象之間是否存在定向路徑。使用SPARQL查詢找到最短路徑

我知道一個辦法做到這一點特定長度的路徑:

SELECT ?a ?b ?c ?d 
WHERE { ?a <http://graphtheory/hasNeighbor> ?b . 
     ?b <http://graphtheory/hasNeighbor> ?c . 
     ?c <http://graphtheory/hasNeighbor> ?d . 
     FILTER (?a != ?c && ?b != ?d 
       && ?a = <http://graphtheory/node/1> 
       && ?d = <http://graphtheory/node/2>) 
     } 
LIMIT 10 

有沒有辦法在一個查詢中搜索任何長度的路徑? SPARQL是不可能的嗎?

回答

6

AndyS提供了所有元素來回答這個問題,但有一些錯別字可能會使它很難應用它們。正如他所說:

SPARQL 1.1有屬性路徑,其中包含任意數量的*運算符。

它不會告訴你路徑是什麼,也不會告訴你最短路徑的長度 - 只有是否有這樣的路徑。

做到這一點的方式(基於AndyS,但有兩個小補丁)是:

PREFIX : <http://graphtheory/> 
PREFIX node: <http://graphtheory/node/> 

ASK { node:1 :hasNeighbor* node:2 } 

據我所知,有沒有辦法做到這一點,而無需使用屬性路徑。

4

SPARQL 1.1有property paths其中包括*運營商的「任意數量」。

它不會告訴您路徑是什麼,也不會告訴您最短路徑的長度 - 只有是否存在這樣的路徑。

PREFIX : <http://graphtheory/node/> 
PREFIX node: <http://graphtheory/node/> 

ASK { node:1 :hasNeighbor* node:2 } 

(你不需要?a =?d =,你可以寫值到查詢。)

添加path數據類型到語言是今後工作的幾個實驗系統的地方已經看到了這個問題。

+0

謝謝,這清理了我採取了很多方法。解決方案中的一個小問題是PREFIX節點:應該是(我相信)。一旦做出此更改,如果在節點1和2之間存在邊緣,則查詢返回true,但如果存在路徑但不存在邊緣,則返回false。 –

+0

爲了在存在路徑但不存在邊時使查詢返回true,我將*運算符添加到hasNeighbor的末尾,即「ASK {node:1:hasNeighbor * node:2}」。沒有屬性路徑可以做到這一點嗎? –