如何删除Neo4j中重复创建的:FILHO类型关系边?
删除Neo4j中重复的:FILHO关系边
嘿,我来帮你搞定这个重复关系的问题!你现在有三条一模一样的:FILHO关系连接着Tony和Maria Esther,要删掉多余的两条,有两种实用的方法:
方法一:直接用Cypher语句在Neo4j控制台执行
这种方式最直接,打开Neo4j的查询编辑器,运行下面的语句就能保留一条关系,删掉另外两条重复的:
MATCH (user2:Person {name: 'Maria Esther'})-[r:FILHO]->(user1:Person {name: 'Tony'}) WITH user1, user2, COLLECT(r) AS rels CALL { WITH rels UNWIND TAIL(rels) AS duplicateRel DELETE duplicateRel } RETURN COUNT(duplicateRel) AS deletedCount
简单解释下逻辑:
- 先匹配出两个节点之间所有的
:FILHO关系 - 用
COLLECT(r)把这些关系打包成一个列表 TAIL(rels)会去掉列表里的第一条关系(留下我们想保留的那条),剩下的就是重复项- 最后把这些重复关系逐个删除,返回删除的数量方便你确认
方法二:用C#代码通过Neo4jClient执行
如果你习惯用代码来操作,把上面的Cypher逻辑整合到你的C#代码里就行:
var deletedCount = client.Cypher .Match("(user2:Person {name: 'Maria Esther'})-[r:FILHO]->(user1:Person {name: 'Tony'})") .With("user1, user2, COLLECT(r) AS rels") .Call("WITH rels UNWIND TAIL(rels) AS duplicateRel DELETE duplicateRel") .Return<int>("COUNT(duplicateRel) AS deletedCount") .Results.Single(); Console.WriteLine($"删掉了{deletedCount}条重复关系");
额外提醒:避免重复创建关系的小技巧
下次创建关系的时候,把Create换成Merge就不会出现重复问题啦!Merge会先检查这个关系是否存在,不存在才会创建,存在就跳过:
client.Cypher .Match("(user1:Person)", "(user2:Person)") .Where((Person user1) => user1.name == "Tony") .AndWhere((Person user2) => user2.name == "Maria Esther") .Merge("(user2)-[:FILHO {DataDeNascimento: '2006'}]->(user1)") .ExecuteWithoutResults();
内容的提问来源于stack exchange,提问作者Tony
相关产品推荐
相关产品推荐

