neo4j 删除重复关系的密码查询优化

vjhs03f7  于 11个月前  发布在  其他
关注(0)|答案(2)|浏览(106)

我试图删除一些在相同节点之间创建的重复关系。例如,节点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 DELETEDELETE都可以做同样的工作吗?
此外,请建议我如何优化此查询!!因为有数百万条记录要删除。
我试过同时使用DELETE子句和DETACH DELETE子句,看起来效果是一样的。注意:我使用的是Neo4j 3.5版本。

vs3odd8k

vs3odd8k1#

简单删除就OK了!
DETACH删除是一种先删除关系再删除节点的更短的方法。因此,我们可以一次性使用DETACH删除,而不是先删除节点再删除关系。
对于关系,你并没有将它从一个节点中分离出来,你只是简单地删除它。所以不需要使用分离,但是如果你对一个关系进行分离,neo4j会将其标记为错误。它理解冗余并删除它。

yqyhoc1h

yqyhoc1h2#

DETACH DELETE将在删除给定节点之前删除附加到该节点的 * 所有 * 关系。在您的情况下,您正在删除指定的关系,因此DETACH关键字无效。
当你使用Neo4j 3.5时,你可以使用以下作为你的查询的优化版本-假设你安装了apoc:

CALL apoc.periodic.iterate(
    "MATCH (n)-[r:R]->(m)
     WHERE exists((n)-[r]->(m)<-[:R {id: r.id}]-(n))
     WITH r.id AS id, tail(collect(r)) AS branches
     UNWIND branches AS branch
     RETURN branch",
    "DELETE branch",
    {batchSize: 10000, parallel: true}
)

字符串
使用r.id作为分组键是可行的,因为它的值对于所有彼此重复的关系都是相同的。exists还假设重复的关系具有相同的源节点和目标节点。
如果你使用的是Neo4j 5,你可以用CALL IN TRANSACTIONS做一个更安全的批处理版本:

MATCH (n)-[r:R]->(m) 
WHERE EXISTS { (n)-[r]->(m)<-[:R {id: r.id}]-(n) }
WITH r.id AS id, tail(collect(r)) AS branches
UNWIND branches AS branch
CALL { 
    WITH branch
    DELETE branch
} IN TRANSACTIONS OF 10000 ROWS

相关问题