我的圖形是一個包含根節點和結束節點的樹狀結構,以及它們之間的一行節點,具有[:NEXT]->
之間的關係。沿着該路徑的一些節點也具有與其他根節點的關係,並且通過它們到其他節點線。在單個密碼查詢中組合深度和寬度優先遍歷
什麼Cypher查詢將返回從開始到結束的路徑上的節點的有序列表,任何BRANCH
關係包含在具有它們的節點的記錄中?
編輯:這不是一個技術圖表,但基本結構是這樣的:
與描繪成黑色圓圈的每個節點。在這種情況下,我會希望在此處描述每個節點。
我的圖形是一個包含根節點和結束節點的樹狀結構,以及它們之間的一行節點,具有[:NEXT]->
之間的關係。沿着該路徑的一些節點也具有與其他根節點的關係,並且通過它們到其他節點線。在單個密碼查詢中組合深度和寬度優先遍歷
什麼Cypher查詢將返回從開始到結束的路徑上的節點的有序列表,任何BRANCH
關係包含在具有它們的節點的記錄中?
編輯:這不是一個技術圖表,但基本結構是這樣的:
與描繪成黑色圓圈的每個節點。在這種情況下,我會希望在此處描述每個節點。
如何
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
bam。美麗,謝謝@ – drewmoore
這個查詢 - 慢了一點 - 應該工作(我猜):
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]
- 防止查詢消失...
您無法控制按深度優先或寬度返回節點的順序第一個算法,除非你有一個變量來保存以前的元素或遞歸調用,我認爲不可能使用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
節點出現的節點),您可以相應地安排輸出順序。
「,我不認爲只用Cypher是不可能的。」 :除了使用Cypher,還可能使用Java Traversal API,這可能會如何使用Java? – drewmoore
看到你有路徑..每條路徑都有節點的集合..每條路徑的第一個節點將是一個分支節點,你將從另一組分支節點獲得匹配......而具有根節點的唯一路徑在branch_nodes中沒有任何匹配將是您的樹的根。 –
你可以發表你的圖的樣品圖? –
@SumeetSharma見編輯。 – drewmoore