2015-06-19 25 views
2

給定Neo4j REST服務器中的樹林,我試圖返回給定根頂點的樹。使用Neo4j獲取樹

由於每棵樹相當大,我需要一個所有頂點和邊的重複列表,以便能夠重建客戶端上的完整樹。

我嘗試多種組合圍繞MATCH (r:root)-[*]->()但是它們返回從根開始的任何路徑,因而有很多重複的:

MATCH p = (r:root)-[*]->(x) 
RETURN nodes(p) AS Vertices, rels(p) AS Edges"; 

這個如下,每次重複每個節點返回的每一個路徑:

a->b 
a->b->c 
a->b->c->d 

等等

相反,我需要有一個結果

{ 
    Vertices: [a, b, c, d], 
    Edges: [[a, b], [b, c], [c, d]] 
} 

我使用Node.js與Seraph,如果相關的,但我不嚴格綁定到該庫。

回答

2

所以第一關,你可能要添加一個WHERE條款,以確保您的路徑始終與葉結尾:

MATCH p = (r:root)-[*]->(x) 
WHERE NOT(x-->()) 
RETURN nodes(p) AS Vertices, rels(p) AS Edges"; 

那麼其次,如果你想獲得的所有節點和關係一氣呵成,您可能需要執行兩個查詢:

MATCH p = (r:root)-[*]->(x) 
WHERE NOT(x-->()) 
UNWIND nodes(p) AS Vertex 
RETURN DISTINCT Vertex; 

MATCH p = (r:root)-[*]->(x) 
WHERE NOT(x-->()) 
UNWIND rels(p) AS Edge 
RETURN DISTINCT startNode(Edge), endNode(Edge); 

更新(邁克爾)

MATCH p = (r:root)-[*]->(x) 
WHERE NOT(x-->()) 
UNWIND nodes(p) AS Vertex 
WITH collect(DISTINCT Vertex) as nodes, p 
UNWIND rels(p) AS Edge 
RETURN nodes, collect(distinct Edge) as rels 

UPDATE2(邁克爾)

我發現了一個更緊湊的方式

MATCH p = (:root)-[r*]->(x) 
RETURN collect(DISTINCT id(x)) as nodes, [r in collect(distinct last(r)) | [id(startNode(r)),id(endNode(r))]] as rels 

如果您還希望包括根節點,使用*0..

+0

您也可以結合這兩個查詢與工會,你只需要第二個,因爲它也給你所有的節點:) –

+0

另見:http://graphgist.neo4j.com/#!/gists/a5e27b4dca763b6b60a79ac106a52cbb –