我试图删除一些在相同节点之间创建的重复关系。例如,节点A与节点B之间的关系为R,因此我必须删除一个关系。为此,我编写了一个查询,如下所示:
MATCH p = ()-[r:relationship]->()
WITH r.id AS id, collect(r) AS branches WHERE size(branches) > 1
FOREACH (n IN tail(branches) | DELETE n)
字符串
我的问题是我是否应该使用DETACH DELETE
,或者一个简单的DELETE
可以吗?或者在这种情况下,DETACH DELETE
和DELETE
都可以做同样的工作吗?
此外,请建议我如何优化此查询!!因为有数百万条记录要删除。
我试过同时使用DELETE
子句和DETACH DELETE
子句,看起来效果是一样的。注意:我使用的是Neo4j 3.5版本。
2条答案
按热度按时间vs3odd8k1#
简单删除就OK了!
DETACH删除是一种先删除关系再删除节点的更短的方法。因此,我们可以一次性使用DETACH删除,而不是先删除节点再删除关系。
对于关系,你并没有将它从一个节点中分离出来,你只是简单地删除它。所以不需要使用分离,但是如果你对一个关系进行分离,neo4j会将其标记为错误。它理解冗余并删除它。
yqyhoc1h2#
DETACH DELETE
将在删除给定节点之前删除附加到该节点的 * 所有 * 关系。在您的情况下,您正在删除指定的关系,因此DETACH
关键字无效。当你使用Neo4j 3.5时,你可以使用以下作为你的查询的优化版本-假设你安装了apoc:
字符串
使用
r.id
作为分组键是可行的,因为它的值对于所有彼此重复的关系都是相同的。exists
还假设重复的关系具有相同的源节点和目标节点。如果你使用的是Neo4j 5,你可以用
CALL IN TRANSACTIONS
做一个更安全的批处理版本:型