0

誤って重複した関係を作成してしまいました... 今、それらを削除する必要があります。ここで、サイファーの回答でクレイジーなことが起こっています。サイファーを使用して2つのノード間の重複した関係を削除するにはどうすればよいですか?

最初は、関係を見つけてから、その数を確認することに頭が下がりました。ただし、それは 2 つのノードが既にわかっている場合に限られます。

考え?

アップデート

user.friends.count > 1 多分私は何かが欠けているかもしれませんが、これはノードをカウントするため、重複の兆候を示すとは思いません 。2 回カウントされるノードがわからない

他のユーザーを取得する唯一の方法は、2 番目のループを実行することです。これは、クエリプロキシなしでユーザーに直接使用できる場合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

これが 1 回限りのことであり、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

ユーザーごとに 2 つのクエリ。私の例を、データのカウントと最初の rel を返すものに置き換える必要がありますが、考え方は同じです。他のノードが複数の rel があることを示しているfirst_rel_to場合は、ノード間の最初の関係を削除するために使用します。 match_to.

これは、gem での私のお気に入りの 2 つのメソッドの最適な使用方法でもあり first_rel_toますmatch_to。これがルールです。私は、愚かでやり過ぎた子供について自慢するのをやめない誇り高い親のように感じます.

ここでの欠点は、その 1 つのノードにデータが保存されていると、それが失われることです。正しいものを削除していることを確認したい場合...

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 がある場合は rel をループし、不要な関係であると判断したものを削除します。

今後これを回避するには、アソシエーションまたはActiveRel でunique: trueオプションを使用してください。creates_unique_rel

効率的なものが必要な場合は、ステファンの答えが適切です。START構文をに変更する必要がありますMATCH

于 2015-01-22T05:03:37.663 に答える