2016-08-01 158 views
0

我有一個複雜的查詢,我正在嘗試使用OPTIONAL MATCH語句。它看起來像這樣:Neo4j Cypher - 合併列並獲得所有不同的值

MATCH (p:Person {name:'Victoria'}) 
OPTIONAL MATCH (p)-[:MANAGES]->(:Office)<-[MERGES_INTO*0..]-(:Office)<-[:WORKS_WITH]-(target1) 
OPTIONAL MATCH (p)-[:SUPPORTS]->(:Office)<-[MERGES_INTO*0..]-(:Office)<-[:WORKS_WITH]-(target2) 
OPTIONAL MATCH (p)-[:ASSISTS]->(:Person)-[*0..1]->(:Group)<--(target3) 
OPTIONAL MATCH (p)-->(:Group)<--(target4) 
RETURN DISTINCT target1,target2,target3,target4 

我想要做的就是結果,如果他們叫target而不是讓target1target2target3target4回到作爲單獨列一列。

有沒有辦法收集/展開四個潛在的目標列,將它們作爲單列結果集返回?

我知道我可以使用返回值爲target的四個獨立查詢的UNION來獲得期望的結果,但我想知道是否有更好的方法。

謝謝。

回答

0

是的,這是可能的,你在正確的軌道上。下面是使用收集和放鬆做一個這樣的例子:

MATCH (p:Person {name:'Victoria'}) 
OPTIONAL MATCH (p)-[:MANAGES]->(:Office)<-[:MERGES_INTO*0..]-(:Office)<-[:WORKS_WITH]-(target1) 
WITH p, COLLECT(target1) as target1s 
OPTIONAL MATCH (p)-[:SUPPORTS]->(:Office)<-[:MERGES_INTO*0..]-(:Office)<-[:WORKS_WITH]-(target2) 
WITH p, target1s, COLLECT(target2) as target2s 
OPTIONAL MATCH (p)-[:ASSISTS]->(:Person)-[*0..1]->(:Group)<--(target3) 
WITH p, target1s, target2s, COLLECT(target3) as target3s 
OPTIONAL MATCH (p)-->(:Group)<--(target4) 
WITH target1s + target2s + target3s + COLLECT(target4) AS targets 
UNWIND targets AS target 
RETURN DISTINCT target 

請注意,您應該能夠摺疊:管理和:支持可選的匹配到一個單一的[:管理|技術支持]的關係,爲的休息路徑是一樣的。

+0

這正是我需要處理'collect'和'with'所需的例子。非常感謝。 –