0

私は Cypher を初めて使用し、特定の状況でノードをクエリから除外する方法を見つけようとしています。

グラフは友達 ( me-[friend]-person ) と友達同士の関係 ( me-[fof]-person ) で構成されています。

私はすべての友人の友人関係を見つける必要があります (十分に簡単です) が、「友人」でもある友人の友人を除外します

私はできると思った:

START me=node(0)           
MATCH me-[r:fof]->fof, me-[f?:friend]->fof           
WHERE f is null and NOT(r is null)
and ... [other filters]

しかし、これは、友達ではない友達の友達を獲得するための間違った方法のように思えます。

提案?

4

3 に答える 3

9

WHERE句内の既存の関係に基づいてフィルタリングできます。もちろんNOT、条件を否定するために使用できます。

START me=node(0)           
MATCH me-[r:fof]->fof
WHERE NOT(me-[:friend]->fof)
and ... [other filters]
于 2013-03-10T21:38:13.957 に答える
3

なぜ、friend と fof の 2 つの関係タイプを使用するのですか? フレンド グラフ全体を 1 つのリレーション、つまりフレンドを使用してモデル化し、MATCH (me)-[:friend*2..]->(friend) のような深さでフィルター処理することができます。 [:friend*2..2]->(friend) 友達の友達

于 2013-03-11T04:00:09.167 に答える
0

回答は@ ean5533によってすでに提供されているため、これは単なる情報回答です。

速度が本当に重要な場合は、すべてのケースで新しい関係タイプを作成してみることができます。つまり、fof2実際には友達の友達ですが、直接の友達ではありません。

start n=node(*) 
match n-[:fof]-friend
where not(n-[:friend]-friend)
create unique n-[:fof2]-friend;

友人の本当の奇妙な友人を照会するよりも、次のようにすると高速になります。

start n=node(0)
match p=n-[:fof2]-friend
return p;
于 2013-03-11T08:15:33.937 に答える