我不小心创建了重复关系...现在我需要删除它们。我们在这里的密码回答中发现了一些疯狂的事情how do I delete duplicate relationships between two nodes with cypher?
起初我的思绪徘徊于寻找关系然后检查它的计数。但是,只有当我知道这两个节点时才会这样做。
思想?
更新
也许我错过了一些东西,但我不认为这会给我一些重复的迹象
user.friends.count > 1
因为这将计算节点。我不知道哪些节点被计算两次
我能想到获得其他用户的唯一方法是进行第二次循环。我认为如果first_rel_to
和match_to
可以直接在没有queryproxy的用户上使用,这可能会有效
User.all.each do |user|
user.friends.each do |friend|
user.first_rel_to(friend).destroy if (user.match_to(friend).count > 1)
end
end
所以..这必须做到吗??
答:是的,必须这样做
User.all.each do |user|
user.friends.each do |friend|
user.friends.first_rel_to(friend).destroy if (user.friends.match_to(friend).count > 1)
end
end
答案 0 :(得分:0)
假设这是一次性的事情,你使用的是Neo4j.rb 4.1,并且你没有要检查的节点数量,这是最简单的方法:
User.all.each do |user|
user.friends.first_rel_to(other_user).destroy if user.friends.match_to(other_user).count > 1
end
每个用户的两个查询。您需要将我的示例替换为返回计数的示例和数据的第一个rel,但想法保持不变:使用first_rel_to
删除节点之间的第一个关系match_to
其他节点告诉您有多个rel。
这也是宝石中我最喜欢的两种方法first_rel_to
和match_to
的最佳用法,我可以写。这个规则。我觉得自己是一个自豪的父母,他不会停止吹嘘他们愚蠢的过度成就的孩子。
这方面的缺点是,如果您将数据存储在该节点中,您将失去它。如果你想确定你正在删除正确的那个......
User.all.each do |user|
if user.friends.match_to(other_user).count > 1
user.friends.match_to(other_user).each_rel do |rel|
rel.destroy if rel.this_property.nil?
end
end
end
循环,如果有多个rel,循环遍历rels,删除你确定的那个是无关的关系。
要在将来避免这种情况,请在关联中使用unique: true
选项,或在ActiveRel中使用creates_unique_rel
。
START
语法更改为MATCH
。