2017-12-22 1 views
0

LIKE, POSTED_BY 등의 관계가있는 엔티티 노드, 사용자 노드 및 몇 개의 관계가있는 데이터베이스가 있습니다. 나는이 목표를 달성하기 위해 쿼리를 작성하려고 해요 :일부 목록이 비어있을 수있는 목록을 작성하는 Cypher COLLECT 절

특정 사용자가 좋아하거나 모든 엔티티 노드를 찾기를 내 쿼리를 단순화 한 사용자

하는 것으로 POSTED_BY을왔다 그들 - 실시간으로 내가 가진 위와 비슷한 다른 조건들.

모든 Entity 노드의 목록을 집계하고 그 행마다 작성하려고 COLLECT 절을 사용하려고합니다.

MATCH (e)<-[:LIKES]-(me:User{id: 'rJVbpcqzf'}) 
WITH me, COLLECT(e) AS all_entities 
MATCH (e)-[:POSTED_BY]->(me) 
WITH me, all_entities + COLLECT(e) AS all_entities 
UNWIND all_entities AS e 
WITH DISTINCT e 
RETURN e; 

이 사용자가 좋아했다 적어도 하나의 엔티티 것이있는 경우에만 정확한 목록을 반환하는 것으로 보인다 (즉, 첫 번째 COLLECT 비어 있지 않은 목록을 반환하는 경우). 그러나 내가 선호하는 엔터티가 없으면 전체 쿼리는 비어있게됩니다.

내가 여기에없는 것에 대한 제안 사항이 있으십니까?

답변

1

사용 OPTIONAL MATCH :

MATCH (me:User {id: 'rJVbpcqzf'}) 
OPTIONAL MATCH (me)-[:LIKES|POSTED_BY]->(e) 
RETURN collect(DISTINCT e) AS all_entities 

참고 :

  1. 대신 수집 및 청산, 당신은 단순히 DISTINCT를 사용할 수 있습니다. DISTINCT with collect을 사용할 수도 있습니다.

  2. multiple relationship types, 즉 LIKES|POSTED_BY을 관계 유형으로 사용할 수도 있습니다.

관련 문제