1

いくつかの階層関係 (PARENT 関係として) を持つノードのセットをモデル化していますが、さらにいくつかの非階層関係があります。

簡単にするために、各人の出身国との関係を持つ家系図としましょう

したがって、各出身国がノードであり、各人がノードであり、暗号で次のような関係を作成できます。

start parent=node(123), child=node(456)
create parent-[:PARENT]->child;

start person=node(123), country=node(789)
create person-[:BORN_IN]->country;

私がやりたいのは、たとえば、イギリス出身の祖先を持たない人々、または日本出身の祖先を持つ人々などのリストを取得することです。これは合理的なクエリであるべきだと思いますが、私はサイファーが初めてで、それを構築する方法がわかりません。

更新 ** ケースをさらに広範囲にテストした結果、一部のクエリが正確に機能しないことがわかりました。片方の親がイギリス出身で、祖父母がイギリス出身ではない子供の場合、イギリス出身の祖先を持たない子供のクエリは、イギリス出身の親を持つ子供を誤って返します。私がクエリを書いた方法のように見えます.祖父母がイングランドとNULLの関係を持っていることを返します. 私のクエリは次のとおりです。

START n=node(*), ancestor=node(123)
MATCH n-[r:PARENT*]->o-[b?:BORN_IN]->ancestor
WHERE b IS NULL 
RETURN DISTINCT n;

すべての人の先祖がその国で生まれた場合、それは問題なく機能します。

4

1 に答える 1

4

可変長リレーションを使用して、すべての子/祖先を含めることができます。私は「日本から先祖を持っている人々」を選んだだけです:

START country=<lookup Japan>
match (child)-[:PARENT*0..5]->(parent)-[:BORN_IN]->(country)
return child

注:試したことはありませんが、論理的にはこれでうまくいくはずです。また、ランダムな深さ 5 を選択しました。

MATCH a-[:PARENT]->b-[:BORN_IN]->z 

あなたの例で述べたように、zで生まれた親を持つすべての人(a)を見つける必要があります

console.neo4j.org で便利なデータ セットをお持ちの場合は、何が起こっているかを確認できます。

于 2013-03-26T06:21:43.257 に答える