2017-12-01 8 views
0

시나리오와 일치하는 경우에도 단 하나의 관계가 노드를 건너 뛰기 :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, bc. 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] 

문제는 그것이 효율적이지 점이다 :

나는 일을 수행하는 쿼리를 발견했다. 더 나은 대안?

+0

카티 제품 만드는 것을 방지하기 위해 별도의 'collect'을 시도 all_x_nodes로 MATCH를, (N)을 수집 WITH (X N) 'MATCH를 (m : X) - [- (O : y {attrib : 5}) bad_x_nodes로 collect (m) WITH RETURN ...' –

답변

0

이 간단한 쿼리는 "attrib = 5이있는 y 노드에 연결된 노드를 제외한 모든 x 노드를 반환하십시오."라는 간단한 쿼리를 수행해야합니다.

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

보다 나은 접근 방법은 제외시킬 x 노드 (특정 속성이있는 : y 노드에 연결됨)를 찾아서 그 x 노드를 수집 한 다음 모두 x 노드와 일치시키는 것입니다. 컬렉션에 :

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 

APOC Procedures 두 컬렉션을 얻고, 다른에서 제외 된 컬렉션을 빼기하는 것입니다 사용하는 또 다른 방법 : 어느 경우

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). 이 데이터 세트에서는 중요하지 않습니다. 훨씬 더 큰 세트에서 그렇습니다.