Neo4j gem - 删除重复关系
Neo4j gem - Delete duplicate relationships
我不小心创建了重复的关系...现在我需要删除它们。我们在这里的密码答案中发生了一些疯狂的事情 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
假设这是 one-time-only 事情,您使用的是 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
每个用户两次查询。您需要将我的示例换成 returns 计数和数据的第一个 rel,但想法保持不变:使用 first_rel_to
删除节点之间的第一个关系,如果 match_to
另一个节点告诉你有不止一个 rel。
这也是我在 gem、first_rel_to
和 match_to
中最喜欢的两个方法的最佳用法,我曾经写过。这个规则。我觉得自己是一个骄傲的 parent,不会停止吹嘘他们愚蠢的 over-achieving 孩子。
这里的缺点是,如果您在那个节点中存储了数据,您就会丢失它。如果您想确保删除的是正确的...
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
。
如果您想要高效的东西,Stefan 的回答很好。您需要将 START
语法更改为 MATCH
.
我不小心创建了重复的关系...现在我需要删除它们。我们在这里的密码答案中发生了一些疯狂的事情 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
假设这是 one-time-only 事情,您使用的是 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
每个用户两次查询。您需要将我的示例换成 returns 计数和数据的第一个 rel,但想法保持不变:使用 first_rel_to
删除节点之间的第一个关系,如果 match_to
另一个节点告诉你有不止一个 rel。
这也是我在 gem、first_rel_to
和 match_to
中最喜欢的两个方法的最佳用法,我曾经写过。这个规则。我觉得自己是一个骄傲的 parent,不会停止吹嘘他们愚蠢的 over-achieving 孩子。
这里的缺点是,如果您在那个节点中存储了数据,您就会丢失它。如果您想确保删除的是正确的...
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
。
如果您想要高效的东西,Stefan 的回答很好。您需要将 START
语法更改为 MATCH
.