2016-09-12 13 views
0

重要でない編集 - 重要な編集。cypher NOT INクエリー(オプション)一致

は、私は次のクエリを持っている:

MATCH (n) 
WHERE (n:person) AND n.id in ['af97ab48544b'] // id is our system identifier 
OPTIONAL MATCH (n)-[r:friend|connected|owner]-(m) 
WHERE (m:person OR m:dog OR m:cat) 
RETURN n,r,m 

このクエリは、特定の人と関係を持っているすべての人、犬や猫を返します。私はこのクエリの結果に含まれていないすべてのノード&の関係を受け取るようにそれを裏返したいと思います。

それはSQLだった場合、それは

select * from graph where id NOT IN (my_query) 

だろう、私はOPTIONAL MATCHが問題の部分だと思います。私はどうしたらいいですか? アドバイスはありますか?

ありがとうございました。

- 重要な編集 -

やあみんな、私の質問が、私の要件を変更して申し訳ありませんが変更されました。特定のノード以外のすべてのグラフ(すべてのノードと関係)をIDで接続したり切断したりする必要があります。以下のクエリは機能していますが、より多くのIDが動作していない場合は、単一のIDに対してのみ動作します。

MATCH (n) WHERE (n:person) 
OPTIONAL MATCH (n)-[r:friend|connected|owner]-(m) WHERE (m:person OR m:dog OR m:cat) 
WITH n,r,m 
MATCH (excludeNode) WHERE excludeNode.id IN ['af97ab48544b'] 
WITH n,r,m,excludeNode WHERE NOT n.id = excludeNode.id AND (NOT m.id = excludeNode.id OR m is null) 
RETURN n,m,r 

代わりに、私は単純なクエリを試してみました:

MATCH (n) WHERE (n:person) AND NOT n.id IN ['af97ab48544b'] return n 

しかし、この1は(私も切断ノードが必要覚えている)の関係を返していません。

グラフ全体を特定のノードから除外する方法を教えてください。それにはノードと関係、接続されたノードと切断されたものも含まれます。

+0

明確にするために、あなたの人に接続されているすべてのノードを探しています:人/:犬/:猫のつながり:友人/:接続/:所有者の関係?あるいは、これらのノードとの関係が存在しない人すべてを見つけようとしていますか?または、あなたのクエリから:personノード(および接続されたノード)のいずれも含まない、グラフ全体のすべてのノードを見つけようとしていますか?望ましい出力の例は何ですか? – InverseFalcon

+0

あなたのSQL文と問題の説明から、特定の 'id'で' person'に接続されていない 'person'、' dog'、 'cat'をすべて見つけたいと思いますか? –

+0

私の最後の編集をお読みください。残念ながら私の要件は変更されました。 –

答えて

1

これを試してくださいないn.id =任意のマッチを 'ID削除する'

一致(n)を(N) - [R] - [IN n.idない(M) 」 [idを削除する]] return n、r、m

1

あなたはクエリの「パースペクティブ」を切り替える必要があります。すべてのノードをループして開始し、次にあなたの人に接続するノードをプルーニングします。

MATCH (bad:person) WHERE bad.id IN ['af97ab48544b'] 
WITH COLLECT(bad) AS bads 
MATCH path = (n:person) - [r:friend|:connected|:owner] -> (m) 
WHERE n._id = '' AND (m:person OR m:cat OR m:dog) AND NOT ANY(bad IN bads WHERE bad IN NODES(path)) 
RETURN path 

これは、グラフに比べてSQLにはるかに適しているということです。ラベル付きのすべてのノードをループさせる必要があるときは、リレーショナル領域であるため、グラフの効率が低下します。

+0

クイックアンサーで感謝しますが、不要なノードも返されます –

+0

清潔さのために少し編集しましたが、不要なノードを参照していますか?それは何を返すのではないはずですか? –

+0

「悪い」ノード自体を返します –

関連する問題