是否有任何方法可以将UNWIND用于可能为空的集合(例如OPTIONAL UNWIND g)?
例如,在附加的查询中,有时会出现集合(项目)为空(第3块),但其他集合的结果仍然相关。
在这里,我想为一个子图压缩一些数字,并返回各种节点类型(组,用户,位置,项目,项目组)的计数。项目组只能通过项目派生。因为有太多的项目附加到多个用户,如果我直接在第二个块中包含项目组而不先聚合,那会非常慢。
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)
字符串
我找到了一个解决方法,但我并不太满意。当我向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
>>
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)
型
我正在考虑编写两个独立的查询,但这会导致复杂的客户端逻辑。
任何想法和提示都非常感谢。
谢谢你,谢谢
3条答案
按热度按时间6rqinv9w1#
您可以使用:用途:
第一个月
pgccezyw2#
我建议您不要使用这么多展开,而是尝试重新组织查询。
这是一个快速重构的,但它只是一个建议;)请检查它:
字符串
子组也将收集独立的根组,因为 *0..所以第一个可选匹配不再是必要的。
我尽可能早地进行了计数。只有用户需要在第二层收集物品数据。享受:)
lbsnaicq3#
@Michael Hunger的回答对我有用。但是,当列表本身是
null
时,我面临问题。所以,我找到了一个解决null
和empty
列表的方法,如下所示:字符串