2014-03-05 59 views
5

是否可以在SPARQL中執行任意長度的路徑查詢。比方說,我有neo4j商店,它有一個只代表PARENT_OF關係的圖表(例如考慮一個家族樹)。一個暗號查詢來獲取一個人的所有祖先看起來像SPARQL中的任意路徑長度查詢

start n (some node from index query) match n<-[:PARENT_OF*]-k return k 

這將如何查詢看起來像SPARQL如果這個新商店將被表示爲一個基於RDF三元組存儲。這甚至是可能的。

回答

9

如果你有這樣的數據:

@prefix : <http://stackoverflow.com/q/22210295/1281433/> . 

:a :parentOf :b . 
:b :parentOf :c . 
:c :parentOf :d . 

那麼你可以使用這樣的查詢,使用SPARQL 1.1的property paths

prefix : <http://stackoverflow.com/q/22210295/1281433/> 

select ?ancestor ?descendent where { 
    ?ancestor :parentOf+ ?descendent 
} 

得到這樣的結果:

------------------------- 
| ancestor | descendent | 
========================= 
| :a  | :b   | 
| :a  | :c   | 
| :a  | :d   | 
| :b  | :c   | 
| :b  | :d   | 
| :c  | :d   | 
------------------------- 

請注意,使用*許可發生關係,並將每個節點與自身關聯。如果你想讓每件事都成爲它自己的祖先,那麼你可以在我的查詢中用*代替+

+1

感謝您的回答。這個操作的計算成本是多少?我想這將取決於三重商店的實施。對於像allegro graph db這樣的流行實現,其性能可與neo4j或titan相媲美。 – Amit

+1

SPARQL沒有定義特定的執行模型,所以說它的計算成本如此昂貴並不容易。這實際上取決於實施。如果您對某些特定實現的性能感興趣,我認爲您必須自己測試它,或者查看是否有人比較了它們並公佈了結果。 –