2017-09-12 15 views
1

私は2-nの開始ノードを名前で知っていて、到達可能なノードを見つける必要があるneo4jのCypherステートメントを作成しようとしていますすべての開始ノードによって実行されます。3人以上から始まるCypherステートメントでお互いの友だちを見つける

最初に私はそれが (start1)-[*..2]->(main)<-[*..2]-(start2) のように扱わなく、私の場合、私は多くの場合、その後2始動が、私は名前で知っているの周りに6ポイントアップ持っていることができ、「共通の友人」の状況に類似していた取り払わ。

基本的に私は3番目、4番目などのノードをサイファーに含めることができますが、それらの間に共通のルートを見つけることができないことに困惑しています。私は、彼らが共通の友人(アンダース)を持っているかどうかを確認するために、「ベッキー」と「セザール」「Dilshad」で始まるパスを必要とするのNeo4jのウェブサイトから、上記の例で

how do I find Anders

除く「フィリパ」 「エミール」は3人とも友人ではないからです。

これまでのところ私はプログラム的にそれが

MATCH (start1 {name:'Person1'}), (start2 {name:'Person2'}), 
(start3 {name: 'Person3'}), (main) 
WHERE (start1)-[*..2]->(main) AND 
(start2)-[*..2]->(main) AND 
(start3)-[*..2]->(main) RETURN distinct main 

のように見えます。しかし、私は、パラメータ

として名前のリストを使用することができ、おそらくCYPHERで、よりエレガント/効率的な方法がある場合、私は思っていた文を作成します

答えて

1

複数の切断パターンが一致しているため、質問に表示されるクエリではcartesian productが作成されています。

代わりに、すべてのノードを別々 MATCH

とあなたのような何かを行うことができますこれらのノード間の関係を制限するWHEREを使用します。それだけで必要なパターンに一致するので、

MATCH (start1 {name:'Person1'})-[*..2]->(main), 
(start2 {name:'Person2'})-[*..2]->(main), 
(start3 {name: 'Person3'})-[*..2]->(main) 
RETURN main 

上記のクエリは、より効率的になります。 MATCH (start1 {name:'Person1'}), (start2 {name:'Person2'}), (start3 {name: 'Person3'}), (main)を実行しているときに、(main)という部分は、これに対する制限が指定されていないため、グラフのすべてのノードと一致しています。クエリにはPROFILEを使用すると、より明確に確認できます。

+0

ご協力いただきありがとうございます。実際には、可変数の開始点を使用して生産するのがより効率的で、さらに簡単です。 –

+0

こんにちは@StefanKüppersあなたは大歓迎です!この回答があなたの質問を解決した場合は、チェックマークをクリックして[受諾](https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)を検討してください。これは、あなたが解決策を見つけ出し、回答者とあなた自身の両方に評判を与えていることを広範なコミュニティに示します。これを行う義務はありません。 –

関連する問題