在Neo4j中删除重复节点及其关系

4

Cypher 查询 MATCH (n:BusinessBranch) RETURN n 返回所有节点,我想根据属性 address 删除重复的节点及其关系。请问如何操作?


{btsdaf} - Tezra
1个回答

16

[更新]

  1. 要删除所有共享相同 address 属性值的 BusinessBranch 节点(这也需要删除它们的所有关系):

MATCH (b:BusinessBranch)
WITH b.address AS address, COLLECT(b) AS branches
WHERE SIZE(branches) > 1
FOREACH (n IN branches | DETACH DELETE n);

此查询收集所有具有相同地址的BusinessBranch节点,过滤掉只有一个分支的集合,然后对结果集中的所有分支使用DETACH DELETE(这将删除分支及其关系)。

  • 要删除除一个之外的所有重复节点,您可以执行以下操作:

    MATCH (b:BusinessBranch)
    WITH b.address AS address, COLLECT(b) AS branches
    WHERE SIZE(branches) > 1
    FOREACH (n IN TAIL(branches) | DETACH DELETE n);
    

    然而,在这种情况下,您应该首先查看APOC过程apoc.refactor.mergeNodes,它对于大多数用例更加合适。


  • 它不会删除所有分支节点吗?在这种情况下,如果说您有一个名为“XYZ”的业务两次,在运行此查询后,您将剩下0个“XYZ”条目,我认为应该留下其中的一项。 - Sameer Reza Khan
    问题没有说明它想保留其中一个节点。正如我的原始答案所述,它将删除所有重复的节点。但是,请查看我的更新答案。 - cybersam
    谢谢 @cybersam - Sameer Reza Khan
    非常好的回答,非常感谢 @cybersam。 - Mhd Wael Jazmati

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接