2013-11-28 35 views
0

我的圖是一棵有向樹,樹上的每個分支對每個節點都有唯一的標籤。例如,分支1中的所有節點都有標籤:branch 1,分支2中的所有節點都有標籤:「分支2」。根節點(節點0)有兩個標籤:branch 1branch 2Neo4j密碼查詢按順序列出與某個標籤匹配的單向路徑中的所有節點

什麼是CYPHER查詢列出branch 1的所有節點ID從根節點順序開始到最後一個節點(使用標籤:」分支1'找到匹配的節點)。也就是說,對於列出的每個節點,它和之前的節點也必須具有標籤「分支1」。

+0

你在分支節點之間有什麼關係?如果每個分支都有一個唯一的標籤,那麼可以使用該標籤獲取分支的所有節點,但除非有關係,否則分支不是任何順序,也不是一條路徑(也不是一個分支,對於這個問題,它是一堆留在標有「分支x」的袋子裏)。 – jjaderberg

回答

0

如果我理解你的話,你實際上並沒有在你的節點上使用Neo4j 2.0 :Label標籤,而是在你的關係上有一個名爲label的屬性?如果是一般的查詢可以是這樣的

START root=node(0) 
MATCH path=root<-[rels:IS_BEFORE*1..100]-leaf 
WHERE ALL(rel in rels WHERE rel.label = "branch 1") 
RETURN EXTRACT(n in nodes(path) | ID(n)) as nodeIdSequence 

這可能不是非常有效,因爲它匹配所有的分支,只限制了結果的相關分支之後。通過關係類型來識別分支會更有效,例如(root)-[:NEXT_ON_BRANCH_1]->(branchNode)。或者,您可以分兩步進行匹配:1)匹配每個分支上的第一個節點並找到正確的分支。 2)現在你知道你有正確的分支,匹配其餘的。你可以嘗試像

START root=node(0) 
MATCH root<-[r:IS_BEFORE]-branch 
WHERE r.label = "branch 1" 
WITH branch 
MATCH path=branch<-[:IS_BEFORE*1..100]-leaf 
RETURN EXTRACT(n in nodes(path) | ID(n)) as nodeIdSequence 

如果這是你的模型看起來不怎樣的,請在http://console.neo4j.org

(深度限額以上*1..100共享樣本數據是任意的,它設置爲任何你想要的,但通常設置一些限制是一個好主意。)

+0

謝謝你的迴應。實際上,節點有標籤,而不是關係。所以'分支1'是分支1中的節點上的標籤等。 – user3045118

相關問題