Cypher:防止重复使用WITH /顺序查询的结果

时间:2014-03-25 09:46:20

标签: neo4j cypher

在像这样的查询中

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}}行。

我应该如何处理顺序查询引起的这类问题?

[请注意,报告的查询只是我的意思的概念表示。请不要尝试解决代码(这将是微不足道的),而只是解决问题。]

2 个答案:

答案 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)