结合WHERE和Neo4j的意外结果

结合WHERE和Neo4j的意外结果,neo4j,Neo4j,我是Neo4j的初学者,我认为我没有正确理解如何使用Neo4j以及在何处使用Neo4j 我有一个图,我想计算我得到的节点数,如果我排除所有带有某个标签的节点,并且排除所有度数>20的节点 我首先尝试用一种简单的方法来解决这个问题,编写多个查询以删除节点,如: MATCH(n:label1) DETACH DELETE n MATCH(n:label2) DETACH DELETE n 然后 MATCH (n) WITH n, size((n)-[]-()) as degree WHERE d

我是Neo4j的初学者,我认为我没有正确理解如何使用Neo4j以及在何处使用Neo4j

我有一个图,我想计算我得到的节点数,如果我排除所有带有某个标签的节点,并且排除所有度数>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个

为什么结果不同


提前感谢您的回复。

您的组合查询与以前的查询做的事情不同。具体来说,您并没有删除标签为
label1
label2
的节点,而是将它们从查询中排除,这意味着它们不会被删除(即使它们的度数大于20)

这两个删除操作在完全不同的节点集上工作,因此在WITH中引入
n
是没有意义的。相反,使用WITH to(通过使用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

以下解释是推测,因为您没有提供示例数据。但它确实符合您所介绍的内容

在第一次试验中,您首先删除了所有
label1
label2
节点(以及它们的所有关系),这显然将一些剩余节点的度降低到了21以下。因此,当您删除>20度的节点时,这样的节点更少(与第二次尝试相比),最后剩下892个节点

在第二次试验中,没有这两个标签的所有节点仍然与具有这两个标签的节点有连接,因此您有更多>20度的节点要删除。这就是为什么最后剩下713个节点