Neo4j gem - 删除重复的关系

时间:2015-01-22 04:45:40

标签: neo4j neo4j.rb

我不小心创建了重复关系...现在我需要删除它们。我们在这里的密码回答中发现了一些疯狂的事情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

1 个答案:

答案 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_tomatch_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