有没有办法使用UNWIND处理可能为空的集合(例如OPTIONAL UNWIND g)?
例如,在附加的查询中,有时会发现集合(items)为空(第三个块),但其他集合的结果仍然是相关的。
在这里,我想计算子图的一些数字并返回各种节点类型(组、用户、位置、项目、项目组)的计数。 项目组只能通过物品得出。 由于有很多物品连接到多个用户,如果不先聚合就直接在第二块中包含项目组,将会非常慢。
MATCH(group: Group {id: "12345"})
OPTIONAL MATCH(group) - [: IS_PARENT * 0..] - > (subgroup: Group)
WITH collect(distinct subgroup) as groups
UNWIND groups as group
OPTIONAL MATCH(u: User) - [: BELONGS_TO] - > (group)
OPTIONAL MATCH(u) --(i: Item)
OPTIONAL MATCH(u) --(l: Location)
WITH groups, collect(distinct u) as users, collect(distinct i) as items, collect(distinct l) as locations
UNWIND items as i
OPTIONAL MATCH(i) --(ig: FunctionalArea)
RETURN length(groups), length(users), length(items), length(locations), count(distinct ig)
我找到了一个解决方法,但并不是很满意。当我向项目集合中插入一个虚拟节点时,我可以每次展开它而不会失去结果。
MATCH(group: Group {id: "12345"})
OPTIONAL MATCH(group) - [: IS_PARENT * 0..] - > (subgroup: Group)
WITH collect(distinct subgroup) as groups
UNWIND groups as group
OPTIONAL MATCH(u: User) - [: BELONGS_TO] - > (group)
OPTIONAL MATCH(u) --(i: Item)
OPTIONAL MATCH(u) --(l: Location)
WITH groups, collect(distinct u) as users, collect(distinct i) as items, collect(distinct l) as locations
>>
MATCH(ig:ItemGroup)
WITH groups, users, ([head(collect(ig))] + items) as items, locations
<<
UNWIND items as i
OPTIONAL MATCH(i) --(ig: FunctionalArea)
RETURN length(groups), length(users), length(items), length(locations), count(distinct ig)
我在考虑编写两个单独的查询,但这将导致复杂的客户端逻辑。
非常感谢任何想法和提示。
谢谢!
dummy
节点根,虽然不太优雅,但似乎确实很有效。我很想听听其他可能的解决方案,特别是更优雅的方案。 - Dave Bennett