Neo4j 没有一致地返回嵌套记录

时间:2021-07-20 03:49:29

标签: node.js neo4j

Example

我有这些嵌套节点想要提取出来。节点的一对多对多关系。我使用以下密码来做到这一点。

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

那个时间是罪魁祸首,当我删除时间时,这个问题就解决了。

2 个答案:

答案 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
相关问题