0

我不小心创建了重复的关系......现在我需要删除它们。我们在这里的密码答案中发生了一些疯狂的事情,如何使用密码删除两个节点之间的重复关系?

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

想法?

更新

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

我能想到让其他用户的唯一方法是做第二个循环。我认为如果first_rel_to并且match_to可以在没有查询代理的情况下直接在用户上使用,这可能会起作用

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
4

1 回答 1

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 的示例,但想法保持不变:如果另一个节点告诉您有多个 rel,则使用first_rel_to删除节点之间的第一个关系match_to.

这也是我在 gem 中最喜欢的两种方法的最佳用途, 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在关联或creates_unique_relActiveRel 中使用该选项。

如果您想要高效的东西,Stefan 的回答很好。您需要将START语法更改为MATCH.

于 2015-01-22T05:03:37.663 回答