2013-10-25 117 views
3

是否可以計算將兩個實例連接到SPARQL查詢的邊的數量?我想找到一條路。兩個資源之間的路徑

+0

是和不是......你想只是一個特定屬性的路徑?圖中的個體之間只有一條路徑嗎? –

+0

您需要更詳細地說明您的數據是什麼以及您想要的結果(路徑邊緣列表,路徑長度等)。與此同時,您可能會發現[查找屬性路徑中的所有步驟](http://stackoverflow.com/q/18024413/1281433)和[是否可以在SPARQL中獲取RDF集合中元素的位置?] (http://stackoverflow.com/q/17523804/1281433)有幫助。 –

+0

嗯,花了我一兩分鐘才找到它,但你也應該看看[計算節點之間的路徑長度?](http://stackoverflow.com/q/5198889/1281433)。不過,我們需要澄清一下,您是否正在尋找邊數,然後找到_length_,或者如果您正在尋找實際的_path_,這是一組邊。 –

回答

7

您可以使用SPARQL的屬性路徑和聚合函數來計算唯一路徑中的邊數。例如,對於這樣的數據,它包含了我們所關心的兩個路徑(一個有兩個邊緣çd一起三條邊):

@prefix : <https://stackoverflow.com/questions/19587520/sparql-path-between-two-instance/> . 

:a :p :b . # a to c is a path of length 2 
:b :p :c . 

:d :p :e . # d to g is a path of length 3 
:e :p :f . 
:f :p :g . 

可以使用像下面這樣的查詢。注意我已經使用了特定的屬性:p,而不是一個變量。這是必需的,因爲來自SPARQL 1.1規範的9.1 Property Path Syntax不允許屬性路徑中的變量。

prefix : <https://stackoverflow.com/questions/19587520/sparql-path-between-two-instance/> 

select ?start ?end (count(?mid) as ?length) 
where { 
    values (?start ?end) { (:a :c) (:d :g) } 
    ?start :p+ ?mid . 
    ?mid :p* ?end . 
} 
group by ?start ?end 

和得到的結果是這樣的:

$ sparql --query query.rq --data data.n3 
------------------------ 
| start | end | length | 
======================== 
| :d | :g | 3  | 
| :a | :c | 2  | 
------------------------ 

這裏發生了什麼的更詳細的描述中可以找到:

的基本理念,雖然是,如果你有從?start?end的路徑,那麼你也有,對於一堆?mid,從?start?mid的路徑不同的值,並從路徑?mid?end。您可以爲?mid選擇不同值的號碼(如果您允許其中一個端點並禁止其他端點)恰好是路徑的長度。

+0

該屬性是否必須指定?我不能這樣做嗎? - >?p *或?p + – user2837896

+0

@ user2837896屬性_does_需要指定。我更新了我的回答。不幸的是[屬性路徑語法](http://www.w3.org/TR/sparql11-query/#pp-language)不允許變量。 –

+0

我不想指定屬性..我想在不指定屬性的情況下找到資源之間的最短路徑。在java中可能嗎? – user2837896