我有要求合并重复节点并保留一个副本 . 我面临的问题是,当我合并节点时,会创建重复的关系 . 相反,我想合并关系,没有重复 .
你能提一些建议吗?
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 回答
遗憾的是,如果不提供您的模型或样本数据列表,我只能回答一下,这可能会对您有所帮助 . 看看APOC library并考虑使用程序Merge Nodes和Redirect Relationship To . 您将在每个案例中找到解释性图像和Cypher语句 .
问题更新后的扩展
初步情况
解决方案
第1行:选择两者作为组合节点
第2行:调用适当的合并节点程序
第3行:定义结果变量
第4行:识别组合节点与受访者之间的所有关系(至少有两个)
第5行:选择所有关系,但第一个关系
第7行:删除所有剩余关系
结果
合并节点Person2,包含源节点的所有属性(特别注意
email_ID
和staysin
)一个关系Person1-Person2