首页 文章

合并重复节点及其关系

提问于
浏览
0

我有要求合并重复节点并保留一个副本 . 我面临的问题是,当我合并节点时,会创建重复的关系 . 相反,我想合并关系,没有重复 .

你能提一些建议吗?

CREATE (n:People { name: 'Person1', lastname: 'Person1LastName', email_ID:'Person1@test2.com' })
CREATE (n:People { name: 'Person2', lastname: 'Person2LastName', email_ID:'Person2@test2.com' })
CREATE (n:People { name: 'Person2', lastname: 'Person2LastName', staysin:'California' })
CREATE (n:People { name: 'Person3', lastname: 'Person3LastName', email_ID:'Person3@test2.com' })

Person2  -[r:Has_Met]->(Person1)

(Person3)-[r:FRIENDS_WITH]->(Person2) having email_ID='Person2@test2.com'

现在我想保留Person2节点并保持与其他节点的关系 - 如下所示:

MATCH (p:People{name:"person1"})
WITH p.name as name, collect(p) as nodes, count() as cnt
WHERE cnt > 1
WITH head(nodes) as first, tail(nodes) as rest
UNWIND rest AS to_delete
MATCH (to_delete)-[r:HAS_MET]->(e:name)
MERGE (first)-[r1:HAS_MET]->(e)
on create SET r1=r
SET to_delete.isDuplicate=true
RETURN count();

This is a related question,但在这里我知道只会考虑一个关系(HAS_MET) . 我如何考虑一次所有关系?

1 回答

  • 0

    遗憾的是,如果不提供您的模型或样本数据列表,我只能回答一下,这可能会对您有所帮助 . 看看APOC library并考虑使用程序Merge NodesRedirect Relationship To . 您将在每个案例中找到解释性图像和Cypher语句 .


    问题更新后的扩展

    初步情况

    CREATE
      (p1:People {name: 'Person1', lastname: 'Person1LastName', email_ID: 'Person1@test2.com'}),
      (p2a:People {name: 'Person2', lastname: 'Person2LastName', email_ID: 'Person2@test2.com'}),
      (p2b:People {name: 'Person2', lastname: 'Person2LastName', staysin: 'California'}),
      (p3:People {name: 'Person3', lastname: 'Person3LastName', email_ID: 'Person3@test2.com'}),
      (p2a)-[:HAS_MET]->(p1),
      (p2b)-[:HAS_MET]->(p1),
      (p3)-[:FRIENDS_WITH]->(p2a);
    

    graph

    解决方案

    MATCH (oneNode:People {email_ID: 'Person2@test2.com'}), (otherNode:People {staysin: 'California'})
    CALL apoc.refactor.mergeNodes([oneNode, otherNode])
    YIELD node
    MATCH (node)-[relation:HAS_MET]->(:People)
    WITH tail(collect(relation)) AS surplusRelations
    UNWIND surplusRelations AS surplusRelation
    DELETE surplusRelation;
    
    • 第1行:选择两者作为组合节点

    • 第2行:调用适当的合并节点程序

    • 第3行:定义结果变量

    • 第4行:识别组合节点与受访者之间的所有关系(至少有两个)

    • 第5行:选择所有关系,但第一个关系

    • 第7行:删除所有剩余关系

    结果

    • 合并节点Person2,包含源节点的所有属性(特别注意 email_IDstaysin

    • 一个关系Person1-Person2

    graph2

相关问题