我是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。
为什么结果不同?
预先感谢您的回复。
答案 0 :(得分:1)
以下解释是推测,因为您尚未提供样本数据。但它确实符合你所呈现的内容。
在您的第一次试用中,您首先删除了所有label1
和label2
节点(及其所有关系),这显然将某些剩余节点的度数降低到21以下。因此,当您删除> 20度节点时,这些节点数量较少(与您的第二次尝试相比),最终剩余892个节点。
在您的第二次试用中,所有没有这两个标签的节点仍然与节点连接这两个标签,因此您有更多> 20度节点删除。这就是为什么你最终得到了713个剩余节点。
答案 1 :(得分:0)
您的合并查询与先前的查询没有做同样的事情。具体来说,您不是要删除带有label1
和label2
标签的节点,而是将它们从查询中排除,这意味着它们不会被删除(即使它们的度数> 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