结合WHERE和WITH与Neo4j的意外结果

时间:2018-01-05 12:15:50

标签: neo4j

我是Neo4j的初学者,我认为我没有正确理解WITH和WHERE是如何工作的。

我有一个图表,如果我排除所有带有特定标签的节点,我想计算我获得的节点数量,并排除所有具有度数>的节点。 20。

我首先尝试以一种简单的方式,编写多个查询来删除节点,如:

MATCH(n:label1) DETACH DELETE n

MATCH(n:label2) DETACH DELETE n

然后

MATCH (n)
WITH n, size((n)-[]-()) as degree
WHERE degree>20
DETACH DELETE n

然后我用

计算了图中节点的数量
MATCH (n)
RETURN count(n)

我获得了892

我从头开始再次生成原始图表,并尝试将所有先前的查询合并为一个:

MATCH (n)
WHERE NOT n:label1
AND NOT n:label2
WITH n, size((n)-[]-()) as degree
WHERE degree>20
DETACH DELETE n

如果我计算得到的节点数量713。

为什么结果不同?

预先感谢您的回复。

2 个答案:

答案 0 :(得分:1)

以下解释是推测,因为您尚未提供样本数据。但它确实符合你所呈现的内容。

在您的第一次试用中,您首先删除了所有label1label2节点(及其所有关系),这显然将某些剩余节点的度数降低到21以下。因此,当您删除> 20度节点时,这些节点数量较少(与您的第二次尝试相比),最终剩余892个节点。

在您的第二次试用中,所有没有这两个标签的节点仍然与节点连接这两个标签,因此您有更多> 20度节点删除。这就是为什么你最终得到了713个剩余节点。

答案 1 :(得分:0)

您的合并查询与先前的查询没有做同样的事情。具体来说,您不是要删除带有label1label2标签的节点,而是将它们从查询中排除,这意味着它们不会被删除(即使它们的度数> 20)

这两个删除操作正在处理完全不同的节点集,因此在您的WITH中引入n是没有意义的。相反,使用WITH到reset your result cardinality to 1(通过使用DISTINCT或聚合),然后匹配您要删除的其他节点并处理它们。

MATCH (n)
WHERE n:label1
OR n:label2
DETACH DELETE n
WITH count(n) as deleted
MATCH (n)
WHERE size((n)-[]-()) > 20
DETACH DELETE n