我有这些嵌套节点想要提取出来。节点的一对多对多关系。我使用以下密码来做到这一点。
WITH (o:order)
WHERE ID(o) = <some id>
OPTIONAL MATCH (o) -[:ORDER_INCLUDES]-> (p:pizza)
WITH o, p
OPTIONAL MATCH (p) -[:WITH_TOPPING]-> (t:topping)
WITH o, {
pizza: p,
toppings: COLLECT(DISTINCT t)
} AS pi
RETURN o, COLLECT(DISTINCT pi) AS pizzas
当没有带配料的披萨时,我会得到我想要的结果,即 1 条记录或订购披萨。请注意,浇头始终是可选的。
1. Order [
Tomato Pizza,
Tomato Pizza
]
但是,当涉及浇头时,它会在单独的记录中返回披萨
1. Order [ [
Tomato Pizza Pineapple Topping,
] Chicken Topping
]
2. Order [
Tomato Pizza
]
这不是我想要的,因为 2 个比萨饼属于同一订单。我一定是做错了什么,请帮忙。
编辑:--
抱歉,我遗漏了一个导致此问题的重要细节。我收集了最开始创建披萨的时间。
WITH (o:order)
WHERE ID(o) = <some id>
OPTIONAL MATCH (o) -[:ORDER_INCLUDES]-> (p:pizza)
OPTIONAL MATCH (e:event) WHERE (e) -[:FOR]-> (o) OR (e) -[:FOR]-> (pizza)
WITH o, MAX(e.time) AS time, p
OPTIONAL MATCH (p) -[:WITH_TOPPING]-> (t:topping)
OPTIONAL MATCH (p) <-[:FOR]- (e:event)
WITH o, {
pizza: p,
time: MAX(e.time),
toppings: COLLECT(DISTINCT t)
} AS pi
RETURN o, time, COLLECT(DISTINCT pi) AS pizzas
那个时间是罪魁祸首,当我删除时间时,这个问题就解决了。
答案 0 :(得分:1)
这应该有效(首先收集每个比萨的配料,然后收集比萨及其配料)
MATCH (o:order)
WHERE id(o) = $id
OPTIONAL MATCH (o)-[:ORDER_INCLUDES]-> (p:pizza)
WITH o, p
OPTIONAL MATCH (p) -[:WITH_TOPPING]-> (t:topping)
WITH o,p, COLLECT(t) AS toppings
RETURN o,COLLECT ({pizza:p,toppings:toppings}) AS pizzas
开胃小菜
答案 1 :(得分:0)
为了防止记录分裂,必须删除以下内容
OPTIONAL MATCH (e:event) WHERE (e) -[:FOR]-> (o) OR (e) -[:FOR]-> (pizza)
现在这是我正在使用的解决方案
WITH (o:order)
WHERE ID(o) = <some id>
OPTIONAL MATCH (o) -[:ORDER_INCLUDES]-> (p:pizza)
WITH o, p
OPTIONAL MATCH (p) -[:WITH_TOPPING]-> (t:topping)
OPTIONAL MATCH (p) <-[:FOR]- (e:event)
WITH o, {
pizza: p,
time: MAX(e.time),
toppings: COLLECT(DISTINCT t)
} AS pi
RETURN o, MAX(pi.time) AS time, COLLECT(DISTINCT pi) AS pizzas