
上QQ阅读APP看书,第一时间看更新
3.3.18 WITH语句
WITH语句将分段的查询部分连接在一起,查询结果从一部分以管道形式传递给另外一部分作为开始点。
使用WITH可以在将结果传递到后续查询之前对结果进行操作。操作可以是改变结果的形式或者数量。WITH的一个常见用法就是限制传递给其他MATCH语句的结果数。通过结合ORDER BY和LIMIT,可获取排在前面的X个结果,从而实现分页效果。
另一个用法就是在聚合值上过滤。WITH用于在WHERE断言中引入聚合。这些聚合表达式创建了新的结果绑定字段。WITH也能像RETURN一样对结果使用别名作为绑定名。WITH还可以用于将图的读语句和更新语句分开,查询中的每一部分要么只是读取,要么都是写入。当写部分的语句是基于读语句的结果时,这两者之间的转换必须使用WITH。
WITH图例如图3-21所示。

图3-21 WITH图例
3.3.18.1 过滤聚合函数结果
聚合的结果必须通过WITH语句传递才能进行过滤。
查询:

查询返回与David相连的人,且该人至少有一个外向关系。
结果:

3.3.18.2 在collect前对结果排序
可以在将结果传递给collect函数之前对结果进行排序,这样就可以返回排过序的列表。
查询:

列表中的人名以倒序排列,并且数量限制为3。
结果:

3.3.18.3 限制路径搜索的分支
可以限制匹配路径的数量,然后以这些路径为基础再做任何类似的有限制条件的搜索。
查询:

先以Anders开始找到与之相连的所有节点,然后按名字倒序排列得到排第一个的节点,然后再以该节点为基础,找到与之相连的所有节点,最后返回它们的名字。
结果:
