2016-09-02 1 views
0

私は、別々のファミリーツリーのセットからなるグラフを持っています。Neo4jで少なくとも1つのノード(関連するかもしれないが結果ではないかもしれない)が特定のプロパティを持っている場合、結果を返す

I持っているそれらの親戚が私たちに関心があると仮定し、私は唯一の直接の親とmain_personの家系の誰かの兄弟を取得することができ、いくつかのOPTIONAL MATCH文を、持って取り組んでクエリ:

MATCH (p:Person {main_person: 'y'}) 
OPTIONAL MATCH (p)<-[]-(parent:Person) 
    WHERE parent.`person_of_interest` = 'y' 
OPTIONAL MATCH (parent:Person)-[]->(sib:Person) 
    WHERE sib <> p 
    AND sib.`person_of_interest` = 'y' 
RETURN 
    p, parent, sib; 

しかし、私は確認することによって、これを修飾したいと言う:

  • 家族の少なくとも1人のメンバーがtest_me = 'y'性質を有しています。これは遠く離れた家族の一員である可能性があります。間違いなく、person_of_interestであるファミリーメンバーである必要はなく、近い家族です。

少なくとも1人がこのプロパティを持っている場合、私たちが探している家族を返すことができます。しかし誰もその財産を持っていなければ、その家族のための結果は望んでいません。

これを構成する方法がわかりません。私はtest_me = 'y'一部で開始する努力を続ける、とWITHとそれを運ぶ:

MATCH (p:Person)-[]-(m) 
WHERE ANY m.test_me = 'y' 
WITH p, m 
. . . 

多分それはより多くのようにする必要があります。これはSQLた場合

MATCH (p:Person {main_person: 'y'}) 
OPTIONAL MATCH (p)<-[]-(parent:Person) 
OPTIONAL MATCH (parent:Person)-[]->(sib:Person) 
WHERE sib <> p 
HAVING <condition here> 
RETURN 
p, parent, sib; 

、私が使用することを試してみましたtempテーブルを使って物事をパイプします。

実際には動作していません。

お読みいただきありがとうございます。 [*0..]構文はA表し

MATCH (p:Person {main_person: 'y'}) 
    WHERE EXISTS((p)-[*0..]-({test_me: 'y'})) 
OPTIONAL MATCH (p)<--(parent:Person) 
    WHERE parent.person_of_interest = 'y' 
OPTIONAL MATCH (parent:Person)-->(sib:Person) 
    WHERE sib <> p AND sib.person_of_interest = 'y' 
RETURN p, COLLECT(parent) AS parents, COLLECT(sib) AS sibs; 

答えて

2

[更新の質問に答えるために更新]

このクエリはあなたのための仕事を(あるいは、それはメモリ不足または永久に実行するように見える場合があります)してもよいですマッチング・パスが0以上の関係を持つことができる可変長関係検索。クエリが1(デフォルト)の代わりに0の下限を使用する理由は次のとおりです。p自体が望ましいtest_meプロパティ値を持っているかどうかもテストします。

はしかし、可変長関係検索はので、通常のクエリが指定することになり、何の上限が指定されていない場合に終了するのに長い時間が大量のメモリを使用するか、または取るための悪名高いです合理的上限(例えば、[*0..5])。

ちなみに、ハードコーディングではなく、「y」などの値をparametersとして渡す必要があります。

+0

サイバーサム、私はあなたに謝罪しています。私はあなたがこの質問に答えて本当に感謝していますが、私は戻って質問を編集しなければなりませんでした。私はこれを後悔します! –

+0

これは本当に面白いです。私は、「OPTIONAL MATCH」ステートメントの順番が大きな違いに気づいた。私の「実生活」の問題では、順序が逆転し、結果は得られませんでした。私は最終的に注文を変更し、期待どおりに機能しました。とにかく、あなたの忍耐と助けをもう一度感謝します。 –

1

あなたは間違いなく正しい道にいると思いますが、あなたがそれを理解していなくても、あなたはすでにあなたの答えを持っていると思います。あなたはあなたの説明を持っていることがちょうどいくつかの変更で、クエリの開始として働く

MATCH pattern=(p:Person{main_person: 'y'})-[*]-() 
WHERE ANY (person IN nodes(pattern) WHERE person.test_me = 'y') 
WITH p 
... 

変数の関係は、ツリー内のすべての人を考えることができます(非家族関係が存在する場合あなたのグラフでは、あなたの関係にタイプを使用して、単一のファミリーのツリーだけを考慮していることを確認する)、そしてmain_personを使用したいと思うでしょう。 pの親ツリーの誰もあなたの望むプロパティを持っていない場合、pはnullになり、pを使った後続のマッチは結果を返しません。これにより、クエリの残りの部分を自由に指定することができます。また、すべての一致にpが含まれている限り、目的のプロパティ値を持たないファミリの場合は結果が得られません。

EDITは私のクエリを少し修正しましたが、ANY()句は正しく書き込まれませんでした。

+0

'WHERE ANY'行が実行されて停止するように見えません... –

+0

' nodes(pattern) 'の中に何かのものがあります。遅くなっています –

+0

EXPLAINをキャンセルして実行すると、物事は働いていない。チェックする他のもの...あなたが特定の人(あなたのmain_person)にマッチさせるために使用しているプロパティは、一意的に制約されるべきです。変数の関係は接続されたサブグラフ全体にまたがるので、マッチしているツリーのサイズをmain_personから調べることもできます。各ファミリー・ツリーは完全なサブグラフですか、またはファミリー・ツリーをエスケープする関係があり、検索するよりも多くのノードをグラフにリンクする可能性がありますか? – InverseFalcon

関連する問題