2016-09-29 10 views
0

同じプロパティ値を持つすべてのノード間にリレーションシップを作成する必要があります。同じプロパティを持つノード間のリレーションシップを作成する

match (p1:Person), (p2:Person) 
where p1 <> p2 and p1.someproperty = p2.someproperty 
merge(p1)-[r:Relationship]-(p2) 
return p1,r, p2 

しかし、私はおよそ20万のノードを持っている場合、このスクリプトは非常に長い実行されている:私は次のクエリを使用することができる。例えば

このようなリレーションシップを他の方法で作成する方法はありますか?

おかげ

答えて

1

あなたは、実際に関連しているものを見つけるために、各ペアリングをフィルタリングん、最初に書いた人のすべてのノードのペア間の直積を作成するクエリは、その後、関係を作成します。それは非常に高価で、n^2操作です。

代わりに、すべてのPersonノードを1回だけ通過し、そのプロパティを持つ対応するpersonノードを見つけて関係を作成することができます。

また、問題のプロパティにインデックスまたはユニーク制約がある場合、パフォーマンスが大幅に向上するはずです。そうでない場合は、各比較でそのラベル内のすべてのノードに対するノードスキャンとなります。クエリ。

また、可能な限りノードと関係を返さないようにしてください。数千または数十万の結果があると仮定します。それはおそらく別の要因です。

match (p1:Person) 
with p1 
match (p2:Person) 
where p2.someproperty = p1.someproperty and p1 <> p2 
merge(p1)-[r:Relationship]-(p2) 

このクエリと以前のクエリの両方をEXPLAINして、どちらが実行されるかを確認する必要があります。

+0

ありがとう!それは私にとって素晴らしい作品です –

関連する問題