在像这样的查询中
MATCH (a)
WHERE id(a) = {x}
MATCH (a)-->(b:x)
WITH a, collect(DISTINCT id(b)) AS Bs
MATCH (a)-->(c:y)
RETURN collect(c) + Bs
我尝试做的是收集来自不同查询的两组节点,但是通过这种过程,所有b
行都将返回a
行的数量乘以{{ 1}}行。
我应该如何处理顺序查询引起的这类问题?
[请注意,报告的查询只是我的意思的概念表示。请不要尝试解决代码(这将是微不足道的),而只是解决问题。]
答案 0 :(得分:1)
您的查询不应返回任何交叉产品,因为您在WITH
子句中进行聚合,因此在第二次匹配开始时只有一个结果项/行(断开连接的路径a, collect(b)
)。因此,目前尚不清楚您希望解决的问题是什么?在不同的情况下,交叉产品可以有不同的解决方式。
从概念上讲,查询的工作方式是:匹配a
相关的任何内容,然后过滤标签:x
上的任何内容。查询的第二部分执行相同操作,但会在标签:y
上进行过滤。因此,您可以将查询组合为
MATCH (a)-->(b)
WHERE id(a) = {x} AND (b:x OR b:y)
RETURN b
“路径爆炸”的其他情况无法轻易解决(有时候UNION
很好,有时你可以重新排序你的模式,有时候你可以做一些聚合和减少来实现它),但是你必须分别询问这个问题。
答案 1 :(得分:0)