我有三种类型的节点:
(: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来删除重复。但是,我不确定这种查询的效率。
还有更好的方法吗?
答案 0 :(得分: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