2016-08-01 17 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 

は、彼らが代わりに戻って別の列としてtarget1target2target3、およびtarget4を得ることのtargetと呼ばれる単一の列であるかのような結果を得ることである:それはこのようになります。

4つの潜在的なターゲット列を1つの列の結果セットとして返すように、それらを収集/巻き戻しする方法はありますか?

UNIONの4つの別々のクエリを使用して目的の結果を得ることができますが、これはtargetという値を返しますが、より良い方法があるかどうかは疑問でした。

ありがとうございました。

答えて

0

はい、これは可能ですが、正しい軌道に乗っています。の他の部分との関係は、|:[SUPPORTS管理]:管理し、単一にオプションの試合をサポートしていますが崩壊することができるはず

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'でハンドルを取得する必要がある例です。どうもありがとう。 –

関連する問題