neo4j Cypher:对可能为空的集合使用UNWIND

bgibtngc  于 2023-11-18  发布在  其他
关注(0)|答案(3)|浏览(174)

是否有任何方法可以将UNWIND用于可能为空的集合(例如OPTIONAL UNWIND g)?
例如,在附加的查询中,有时会出现集合(项目)为空(第3块),但其他集合的结果仍然相关。
在这里,我想为一个子图压缩一些数字,并返回各种节点类型(组,用户,位置,项目,项目组)的计数。项目组只能通过项目派生。因为有太多的项目附加到多个用户,如果我直接在第二个块中包含项目组而不先聚合,那会非常慢。

  1. MATCH(group: Group {id: "12345"})
  2. OPTIONAL MATCH(group) - [: IS_PARENT * 0..] - > (subgroup: Group)
  3. WITH collect(distinct subgroup) as groups
  4. UNWIND groups as group
  5. OPTIONAL MATCH(u: User) - [: BELONGS_TO] - > (group)
  6. OPTIONAL MATCH(u) --(i: Item)
  7. OPTIONAL MATCH(u) --(l: Location)
  8. WITH groups, collect(distinct u) as users, collect(distinct i) as items, collect(distinct l) as locations
  9. UNWIND items as i
  10. OPTIONAL MATCH(i) --(ig: FunctionalArea)
  11. RETURN length(groups), length(users), length(items), length(locations), count(distinct ig)

字符串
我找到了一个解决方法,但我并不太满意。当我向items集合插入一个虚拟节点时,我可以每次都将其展开而不会丢失结果。

  1. MATCH(group: Group {id: "12345"})
  2. OPTIONAL MATCH(group) - [: IS_PARENT * 0..] - > (subgroup: Group)
  3. WITH collect(distinct subgroup) as groups
  4. UNWIND groups as group
  5. OPTIONAL MATCH(u: User) - [: BELONGS_TO] - > (group)
  6. OPTIONAL MATCH(u) --(i: Item)
  7. OPTIONAL MATCH(u) --(l: Location)
  8. WITH groups, collect(distinct u) as users, collect(distinct i) as items, collect(distinct l) as locations
  9. >>
  10. MATCH(ig:ItemGroup)
  11. WITH groups, users, ([head(collect(ig))] + items) as items, locations
  12. <<
  13. UNWIND items as i
  14. OPTIONAL MATCH(i) --(ig: FunctionalArea)
  15. RETURN length(groups), length(users), length(items), length(locations), count(distinct ig)


我正在考虑编写两个独立的查询,但这会导致复杂的客户端逻辑。
任何想法和提示都非常感谢。
谢谢你,谢谢

6rqinv9w

6rqinv9w1#

您可以使用:用途:
第一个月

pgccezyw

pgccezyw2#

我建议您不要使用这么多展开,而是尝试重新组织查询。
这是一个快速重构的,但它只是一个建议;)请检查它:

  1. MATCH(group: Group {id: "12345"})-[:IS_PARENT*0..]->(subgroup: Group)
  2. OPTIONAL MATCH(u: User)-[: BELONGS_TO]->(subgroup)
  3. OPTIONAL MATCH(u) -- (l: Location)
  4. WITH COLLECT(DISTINCT subgroup) AS g, COLLECT(DISTINCT u) AS uc,
  5. count(distinct subgroup) as groups,
  6. count(distinct u) as users,
  7. count(distinct l) as locations
  8. UNWIND uc as u
  9. OPTIONAL MATCH(u) --(i: Item)
  10. OPTIONAL MATCH(i) --(ig: FunctionalArea)
  11. RETURN groups, users, count(DISTINCT i) AS items, locations, count(distinct ig)

字符串
子组也将收集独立的根组,因为 *0..所以第一个可选匹配不再是必要的。
我尽可能早地进行了计数。只有用户需要在第二层收集物品数据。享受:)

展开查看全部
lbsnaicq

lbsnaicq3#

@Michael Hunger的回答对我有用。但是,当列表本身是null时,我面临问题。所以,我找到了一个解决nullempty列表的方法,如下所示:

  1. UNWIND (CASE WHEN SIZE(items) > 0 then items else [null] end) as item

字符串

相关问题