2014-03-24 93 views
0

我做喜歡Neo4j的暗號:與聯盟和

MATCH (a) 
WHERE id(a) = {id} 

WITH a 

MATCH (a)-->(x:x)-->(b:b) 

WITH a, x, b 

MATCH (a)-->(y:y)-->(b:b) 

WITH a, x, y, b 

MATCH (b)-->(c:c) 

RETURN collect(a), collect(x), collect(y), collect(b), collect(c) 

查詢結果堆疊什麼我想在這裏是有從MATCH (a)-->(y:y)-->(b:b)b要由來自該行的那些,並從那些的之前的MATCH (a)-->(x:x)-->(b:b)。我在UNION上遇到的問題是,它在下一個查詢中傳遞的節點的數量和種類很挑剔,而且我很難理解如何使它們一起走到一起。

在查詢過程中還是在返回之前,我可以使用其他哪種解決方案來合併這些節點? (或者如果我應該這樣做UNION然後如何做到這一點...)

(當然,查詢可以用其他更好的方式完成,我真正的不能,這只是意味着給我一個我想要做的視覺例子。)

非常感謝!

回答

2

這個簡化的查詢可能適合您的需求。

我拿出所有collect()函數調用,因爲不清楚你真的需要聚合任何東西。例如,只會有一個'a'節點,因此聚合'a'是沒有意義的。

請注意結果的每一行都是標記爲'x'或'y'的節點。但是,由於每行必須有兩個的x和y值 - 每行對於其中的一個將具有空值。

START a=node({id}) 
MATCH (a)-->(x:x)-->(b:b)-->(c:c) 
RETURN a, x, null AS y, b, c 
UNION 
MATCH (a)-->(y:y)-->(b:b)-->(c:c) 
RETURN a, null AS x, y, b, c 
0

我能想出到底最好的解決辦法是什麼這個

MATCH (a)-->(x:x)-->(b1:b)-->(c1:c) 
WHERE id(a) = {id} AND NOT (a)-->(:y)-->(b1) 

WITH a, collect(x) as xs, collect(DISTINCT b1) as b1s, collect(c1) as c1s 

MATCH (a)-->(y:y)-->(b2:b)-->(c2:c) 

RETURN a, xs, collect(y), (b1s + collect(b2)), c1s + collect(c2)