Cypher查询如何对collect()返回列表计数并作为WHERE过滤条件
Cypher查询修改方案
你需要先通过WITH子句完成聚合计算,再基于聚合生成的列表长度做过滤,正确的查询写法如下:
MATCH (a:Academy)-[]-(w:Work) WITH w, collect(distinct a.name) as Associated_academies_for_this_book WHERE size(Associated_academies_for_this_book) > 1 RETURN Associated_academies_for_this_book, w.shortTitle as book_short_title, w.workId as Book_ID ORDER BY size(Associated_academies_for_this_book) DESC
逻辑说明
- 先用
WITH子句按作品节点w分组,聚合生成每个作品对应的去重关联学院列表,这一步是为了先拿到聚合后的完整结果,才能做后续的过滤操作 - 用
size()函数直接读取学院列表的元素个数,通过WHERE子句筛掉元素数不大于1的结果 - 最后返回需要的字段即可,排序时直接复用已生成的列表计算长度,不需要重复执行
collect操作,也能提升查询效率
之前使用count(collect)>1未生效的原因是:count()函数的作用是统计行数或非null值的数量,而collect()已经返回了列表格式的结果,直接用size()读取列表长度才是正确的判断方式,嵌套count和collect会得到不符合预期的统计值。
内容的提问来源于stack exchange,提问作者D'Arrigo Alessio
相关产品推荐
相关产品推荐

