2016-08-01 3 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 вместо того, чтобы target1, target2, target3 и target4 обратно в виде отдельных столбцов.

Есть ли способ собирать/разматывать четыре потенциальных целевых столбца, чтобы возвращать их в виде набора результатов для одного столбца?

Я знаю, что могу получить желаемый результат с помощью UNION четырех отдельных запросов, которые возвращают значение, называемое target, но мне было интересно, есть ли лучший способ.

Спасибо.

ответ

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'. Огромное спасибо. –