2014-10-31 99 views
1

假設我們有一個包括這個週期的圖表:Neo4j的路徑查詢,包括週期

{id:1, start:true, end:false} --> {id:2, start:false, end:true} 
{id:1, start:true, end:false} <-- {id:2, start:false, end:true} 

我想寫的是找到特定長度的所有路徑從節點與開始查詢:真實節點與端:真,等(長度3):

(n1 {start: true})-[:*3]-(n4 {end: true}) 

但結果應包括像環的路徑:

{id:1, start:true, end:false} --> {id:2, start:false, end:true} --> {id:1, start:true, end:false} --> {id:2, start:false, end:true} 

在Cypher 2.1中可能嗎?

+0

Cypher路徑只包含每個關係一次,以實際上避免無限循環,但你可以找到一個循環,例如從n1到n1。你有什麼用途呢? – 2014-11-01 04:45:53

回答

2

此問題的答案是肯定的,並且您在示例查詢中使用的語法是正確的。這是正確的,因爲您在查詢中留下了任何方向指示符,這意味着向前和向後方向都會發生遍歷。

我不確定的一件事是您是否可以使用startend作爲屬性名稱,如果可以,您是否應該在Cypher中爲它們提供功能目的。

編輯 - 參透我認爲,Cypher支架不會revist在遍歷關係,雖然我不能看到這方面有任何文檔的問題

,這將是一些奇怪的路徑分析結果。我相信你可以使用遍歷API來寫你自己的遍歷,可以..

你可以實現你想要的Cypher,我的版本不能很好地擴展到更長的路徑,我敢肯定有人可以做一個比這更好的工作:

MATCH (a:Thing{start:true})-[:REL]-(b:Thing) 
WITH DISTINCT a, b 
MATCH (b)-[:REL]-(c:Thing) 
WITH DISTINCT a, b, c 
MATCH (c)-[:REL]-(d:Thing{end:true}) 
RETURN DISTINCT a, b, c, d 
+1

我發佈的查詢是「正確的」,因爲它的工作原理,但它不返回我的目標結果(路徑1-2-1-2)。 – user4201983 2014-10-31 18:19:08

+1

對不起,我沒有仔細閱讀你的問題,我認爲關係沒有被重新遍歷,可能是爲了防止無限遞歸問題,但讓我檢查! – JohnMark13 2014-10-31 20:07:25

+0

Hi @ JohnMark13 - 想知道你是否檢查過?我想我有一些Cypher查詢會因圖表中的循環而崩潰,但我不確定。 – Yann 2015-04-17 13:07:34