2017-12-15 22 views
0

2つの特定の関係を持つ代替のmatch文を再帰的に実行しようとしています。 たとえば、ペットはPersonによって所有されています。他の人のようになど、他の人(ない所有者)それらの人々は、彼らが所有するペットを持って、LIKEペット再帰的な複数の関係

match (n.Person {id.123})<-[r.OwnedBy]-(p.Pet) Return n, r, p 
match (p.Pet {id.123})-[r.Likes]->(n.Person) Return p, r, n 

お知らせ指向の関係が関与 - #1が後方にある、#2が前方にあります。

私は何をしたい 2.ディスプレイの人々が 3.ディスプレイのペット[OwnedByそれらのペットで[気に入ら] 1.ディスプレイのペット[OwnedBy]この人(ID)、(ID)人与えられた、にあります] 2. などの人に再帰的に

これらのMatch文は独立して動作します。一緒に、彼らはしません。 別の変数を使って2番目のmatchステートメントを追加しようとしましたが、2つのレベルを下りて停止します。

実際のデータセットには、数十のノードとリレーションシップがあります。私は、これらの2つの関係/ノードのみの「ツリー」ビューに表示を制限しようとしています。

ありがとうございます!

答えて

0

これはいかがですか?

match (n:Person {id:123})<-[:OwnedBy]-(p:Pet)-[:Likes]->(n2:Person)<-[:OwnedBy]-(p2:Pet) 
return n, collect(distinct p) as pets, collect(distinct n2) as peopleLiked, collect(distinct p2) as petsOfPeopleLiked 

あなたはグラフ表示でのみ興味があるなら、これは動作するはずですけれども:

match path = (n:Person {id:123})<-[:OwnedBy]-(p:Pet)-[:Likes]->(n2:Person)<-[:OwnedBy]-(p2:Pet) 
return path, n, p, n2, p2 

あなたはまたAPOC Proceduresを利用することができます。 (私は実際にグラフ表示でのみ興味として興味深いことに、それは 1に示した。)私は2番目の提案を試みBOTHノードのみ

match (n:Person {id:123}) 
call apoc.path.expandConfig(n, {relationshipFilter:'<OwnedBy|Likes>'}) yield path 
return path 
+0

:これは、関係の唯一これら2つのタイプを使用して、これらのパスを示す処理することができ(n)に関する関係、および 2)深さが2レベルに達して停止しました。私は再帰的にする必要があります。 非常に助けに感謝します。思考? –

+0

興味深いことに、この手順は連続的なトラバーサルのためのもので、着信トラバースのみを対象としています。OwnedBy and outgoing:キャップなしのリレーションシップ。サンプルグラフを生成するためのクエリを提供できますか? – InverseFalcon

+0

私はAPOCメソッドも試しました - APOCを正しくインストールしたら(!)、再帰が正確に動作しているかどうかはわかりませんが、私が望んだことをしたようです。より多くのテストが必要です。何十億ものことをありがとう! –