2017-12-01 7 views
0

シナリオに合致するだけでも、単一の関係を持っているノードをされてスキップ:のNeo4jは:次のクエリ

  • 私はタイプyのノードにリンクされているタイプxのノードのセットを持っています。
  • 属性が特定の値に等しいyノードにリンクされているものを除き、すべてxノードに一致させたいと思います。

例入力:ここで私はattrib = 5を持ってyノードにリンクされているものを除くすべてのxのノードを返したい

CREATE (a:x {name: 'a'}), (b:x {name: 'b'}), (c:x {name: 'c'}); 

CREATE (d:y {name: 'd', attrib: 1}), (e:y {name: 'e', attrib: 2}), 
     (f:y {name: 'f', attrib: 3}), (g:y {name: 'g', attrib: 4}), 
     (h:y {name: 'h', attrib: 5}), (i:y {name: 'i', attrib: 6}); 

MATCH (a), (d), (e) WHERE a.name = 'a' AND d.name = 'd' AND e.name = 'e' 
CREATE (a)-[r:z]->(d), (a)-[s:z]->(e) RETURN *; 

MATCH (b), (f), (g) WHERE b.name = 'b' AND f.name = 'f' AND g.name = 'g' 
CREATE (b)-[r:z]->(f), (b)-[s:z]->(g) RETURN *; 

MATCH (c), (h), (i) WHERE c.name = 'c' AND h.name = 'h' AND i.name = 'i' 
CREATE (c)-[r:z]->(h), (c)-[s:z]->(i) RETURN *; 

は、ここに私が試したものです:私はすべてのxのノードを取得し、このクエリから

MATCH (n:x)-[]-(m:y) WHERE NOT m.attrib = 5 RETURN n 

、それは次のようになります。abchにリンクされているので、cを除外したいと考えています。h.attrib = 5です。

編集:

私が仕事をして、クエリを見つけました:

MATCH (n:x), (m:x)-[]-(o:y) 
WHERE o.attrib = 5 
WITH collect(n) as all_x_nodes, collect(m) as bad_x_nodes 
RETURN [n IN all_x_nodes WHERE NOT n IN bad_x_nodes] 

問題は、それは効率的ではないということです。もっと良い選択肢?

+0

デカルト積を作成しないように別個 'collect'を試し: ' MATCH(N:X)を収集すると、(N)all_x_nodes MATCH(M:X)として、[ - ] - (O: y {attrib:5})bad_x_nodesとしてcollect(m)を使用 RETURN ... ' –

答えて

0

この簡単なクエリは、attrib = 5を持つyノードにリンクされているノードを除き、すべてxノードを返します。

MATCH (n:x) 
WHERE NOT (n)--(:y {attrib: 5}) 
RETURN n; 
0

除外する(特定の属性を持つyノードに接続されている)すべてのxノードを見つけ、それらのxノードを収集し、次にすべてのxノードに一致させることです。 APOC Proceduresを使用して別のアプローチは両方のコレクションを取得し、他の対象から除外コレクションを減算することである

MATCH (exclude:x)--(:y{attrib:5}) 
WITH collect(distinct exclude) as excluded 
MATCH (n:x) 
WHERE NOT n in excluded 
RETURN collect(n) as result 

:コレクション内のいずれの場合も

MATCH (exclude:x)--(:y{attrib:5}) 
WITH collect(distinct exclude) as excluded 
MATCH (n:x) 
WITH excluded, collect(n) as nodes 
RETURN apoc.coll.subtract(nodes, excluded) as result 

、それがインデックスのを持っているのに役立つだろう:y(attrib)。このデータセットでは重要ではありません。はるかに大きなセットでは、それはなります。

関連する問題