시나리오와 일치하는 경우에도 단 하나의 관계가 노드를 건너 뛰기 :Neo4j : 다음 쿼리
- I 형
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'을 시도 all_x_nodes로 MATCH를, (N)을 수집 WITH (X N) 'MATCH를 (m : X) - [- (O : y {attrib : 5}) bad_x_nodes로 collect (m) WITH RETURN ...' –