シナリオに合致するだけでも、単一の関係を持っているノードをされてスキップ:の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
、それは次のようになります。a
、b
とc
。 h
にリンクされているので、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]
問題は、それは効率的ではないということです。もっと良い選択肢?
デカルト積を作成しないように別個 'collect'を試し: ' MATCH(N:X)を収集すると、(N)all_x_nodes MATCH(M:X)として、[ - ] - (O: y {attrib:5})bad_x_nodesとしてcollect(m)を使用 RETURN ... ' –