neo4j cypher:使用UNION和WITH堆叠结果

时间:2014-03-24 17:45:27

标签: neo4j cypher

我正在进行类似

的查询
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)

我想要的是让b中的MATCH (a)-->(y:y)-->(b:b)由该行中的MATCH (a)-->(x:x)-->(b:b)和前一个UNION中的UNION组成。我对{{1}}所遇到的问题是它对下一个查询要传递的节点的数量和种类很挑剔,而且我很难理解如何将它们全部放在一起。

在查询期间或返回之前,我可以使用哪些其他解决方案来合并这些节点? (或者,如果我应该使用{{1}},那么如何做到这一点......)

(当然,那里的查询可以用其他更好的方式完成。我真实的那个不能。这只是为了给出我想要做的事情的视觉例子。)

非常有责任!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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)