2014-02-11 55 views
4

我的圖形是一個包含根節點和結束節點的樹狀結構,以及它們之間的一行節點,具有[:NEXT]->之間的關係。沿着該路徑的一些節點也具有與其他根節點的關係,並且通過它們到其他節點線。在單個密碼查詢中組合深度和寬度優先遍歷

什麼Cypher查詢將返回從開始到結束的路徑上的節點的有序列表,任何BRANCH關係包含在具有它們的節點的記錄中?

編輯:這不是一個技術圖表,但基本結構是這樣的:

enter image description here

與描繪成黑色圓圈的每個節點。在這種情況下,我會希望在此處描述每個節點。

+0

你可以發表你的圖的樣品圖? –

+0

@SumeetSharma見編輯。 – drewmoore

回答

5

如何

MATCH p=(root)-[:NEXT*0..]->(leaf) 
OPTIONAL MATCH (leaf)-[:BRANCH]->(branched) 
RETURN leaf, branched, length(p) as l 
ORDER BY l ASC 

也看到這個圖的要點是:http://gist.neo4j.org/?9042990

+0

bam。美麗,謝謝@ – drewmoore

1

這個查詢 - 慢了一點 - 應該工作(我猜):

START n=node(startID), child=node(*) 
MATCH (n)-[rels*]-(child) 
WHERE all(r in rels WHERE type(r) IN ["NEXT", "BRANCH"]) 
RETURN * 

是基於Neo4j 2.0.x Cypher syntax
從技術上講,這個查詢將停在從startID開始的樹的末尾:這是因爲上圖中的末尾屬於單個路徑,但不屬於所有分支的末尾。 我還建議限制關係的基數 - [rels*1..n] - 防止查詢消失...

1

您無法控制按深度優先或寬度返回節點的順序第一個算法,除非你有一個變量來保存以前的元素或遞歸調用,我認爲不可能使用Cypher。

你能做什麼

MATCH p =(n)-[:NEXT*]->(end) 
WITH collect(p) as node_paths 
MATCH (n1)-[:NEXT]->(m)-[:BRANCH]->(n2) 
WITH collect(m) as branch_nodes , node_paths 
RETURN branch_nodes,node_paths 

現在node_paths包括所有模式(node)-[:NEXT]->(node)-[:NEXT]->...(node)的路徑。現在您擁有路徑和分支節點(基本上所有路徑的起點都在node_paths中,除了將從root節點出現的節點),您可以相應地安排輸出順序。

+0

「,我不認爲只用Cypher是不可能的。」 :除了使用Cypher,還可能使用Java Traversal API,這可能會如何使用Java? – drewmoore

+0

看到你有路徑..每條路徑都有節點的集合..每條路徑的第一個節點將是一個分支節點,你將從另一組分支節點獲得匹配......而具有根節點的唯一路徑在branch_nodes中沒有任何匹配將是您的樹的根。 –