2014-11-08 27 views
2

取得與不同的標籤節點在一個查詢我有三個類型的節點:如何Neo4j的

(:Meal), (:User), (:Dish) 

人際關係:

(:Meal)<-[:JOIN]-(:User), (:Meal)<-[:ORDERED]-(:Dish) 

現在我想取餐的一個方面的信息查詢。我想結果是這樣的:

id: 1 
name: xxx, 
users: [1,2,3,4], 
dishes: [23,42,42] 

其中用戶菜餚域中包含這些用戶和菜餚的ID。

我想:

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