私は、別々のファミリーツリーのセットからなるグラフを持っています。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;
:
サイバーサム、私はあなたに謝罪しています。私はあなたがこの質問に答えて本当に感謝していますが、私は戻って質問を編集しなければなりませんでした。私はこれを後悔します! –
これは本当に面白いです。私は、「OPTIONAL MATCH」ステートメントの順番が大きな違いに気づいた。私の「実生活」の問題では、順序が逆転し、結果は得られませんでした。私は最終的に注文を変更し、期待どおりに機能しました。とにかく、あなたの忍耐と助けをもう一度感謝します。 –