Neo4j

2014-11-08 3 views
2

에 한 쿼리에서 다른 레이블 노드를 가져 오는 방법은 세 개의 노드의 유형이 질문. 내가 얻을 같은 결과를하려는 :Neo4j

사용자요리 필드는 그 사용자와 요리의 ID를 포함
id: 1 
name: xxx, 
users: [1,2,3,4], 
dishes: [23,42,42] 

.

내가 시도 :

MATCH (meal:Meal) 
OPTIONAL MATCH (meal)<-[:JOIN]-(user:User) 
OPTIONAL MATCH (meal)<-[:ORDERED]-(dish:Dish) 
RETURN id(meal), meal.name, COLLECT(ID(user)), COLLECT(ID(dish)) 

그러나,이 쿼리는 사용자와 요리를 많이 중복을 생성합니다. N 사용자와 M 요리가있는 경우 N * M 사용자 - 접시 쌍과 일치합니다.

나는 DISTINCT를 사용하여 중복을 제거 할 수 있음을 알고 있습니다. 그러나 이러한 쿼리의 효율성에 대해서는 확신 할 수 없습니다.

더 좋은 방법이 있습니까?

답변

2

봅니다 WITH를 사용하여 쿼리의 다른 부분을 분리하는 :

MATCH (meal:Meal) 
OPTIONAL MATCH (meal)<-[:JOIN]-(user:User) 
WITH meal, collect(ID(user)) as users 
OPTIONAL MATCH (meal)<-[:ORDERED]-(dish:Dish) 
RETURN id(meal), meal.name, users, COLLECT(ID(dish)) as dishes