Neo4j gem - 删除重复关系

Neo4j gem - Delete duplicate relationships

我不小心创建了重复的关系...现在我需要删除它们。我们在这里的密码答案中发生了一些疯狂的事情 how do I delete duplicate relationships between two nodes with cypher?

起初我的思绪徘徊在寻找关系然后检查它的计数。但这只是在我已经知道这两个节点的情况下。

想法?

更新

也许我遗漏了什么,但我不认为这会给我一个重复的迹象 user.friends.count > 1 因为这将计算节点。我不知道哪些节点被计算了两次

我能想到的获得其他用户的唯一方法是进行第二个循环。我认为如果 first_rel_tomatch_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_tomatch_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.