2014-01-18 36 views
0

我在Neo4j圖中實現了一個類似鏈接列表結構的東西。Cypher遍歷

CREATE (R1:root{edgeId:2})-[:HEAD]-> 
     (:node{text: 'edge 2 head text', width:300})-[:NEXT{edge:2, hard:true}]-> 
     (:node{text: 'edge 2 point 0'})-[:NEXT{edge:2}]-> 
     (n0:node{text: 'edge 2 point 1'}), 
     (n0)-[:BRANCH]->(:root{edgeId:3}), 
     (n0)-[:NEXT{edge:2}]-> 
     (:node{text: 'edge 2 point 2'})-[:NEXT{edge:2}]-> 
     (:node{text: 'edge 2 point 3'})<-[:TAIL{edge:2}]->(R1) 

遍歷的邊緣裝置開始與根節點,在其出射HEAD關係到第一節點,和以下的NEXT關係鏈,直到到達一個節點:該圖是通過執行類似於此多語句創建與來自我們從根開始的傳入TAIL關係。

即:

MATCH path = (root:root:main)-[:HEAD]->(a:point)-[n:NEXT*]->(z:point)<-[:TAIL]-(root) 
RETURN nodes(path), n 

每個節點都有一個輸出NEXT關係,但是有些節點也有BRANCH關係,這點至其它邊的根源節點。

在上面的查詢中,nodes(path)顯然返回沿着邊緣的所有節點,並且n列出了沿着它的每個節點的出局NEXT關係。我怎樣才能修改這個查詢,以便除了傳出的NEXT關係之外,它還返回任何傳出的BRANCH關係

如何修改上述查詢,以便返回的每個記錄包含路徑上的節點以及列表所有傳出關係(包括NEXTBRANCH)嗎?

請注意,我不想遍歷此查詢中的BRANCH邊緣,我只是想讓它告訴我它們在那裏。我想在Java中實現這個策略,但是到目前爲止,我們首選的是直接執行Cypher查詢,而不是使用Traversal API。如果我這樣做讓自己變得更加困難,請把它帶給我注意)。

+1

你可能想看看你的問題和修復查詢,創建查詢被打破,匹配查詢使用不同的標籤;也可以排除與問題無關的屬性。如果您共享工作模型,查詢或控制檯或圖形要點,則您更有可能獲得快速準確的答案。 – jjaderberg

回答

3

您可以隨時返回路徑表達式。

MATCH path = (root:root:main)-[:HEAD]->(a:point)-[n:NEXT*]->(z:point)<-[:TAIL]-(root) 
RETURN extract(x in nodes(path) | [x, x-[:BRANCH]->()]), n 

x-[:BRANCH]->()回報的路徑的集合,因此,如果你只是想訪問的關係,你必須做

[p in x-[:BRANCH]->() | head(rels(p)) ] 

對於如何實現一個活動流作爲一個非託管的例子擴展你可能看看這個:https://github.com/jexp/neo4j-activity-stream