我正在进行类似
的查询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}},那么如何做到这一点......)
(当然,那里的查询可以用其他更好的方式完成。我真实的那个不能。这只是为了给出我想要做的事情的视觉例子。)
非常有责任!
答案 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)