3.3.18 WITH语句
WITH语句将分段的查询部分连接在一起,查询结果从一部分以管道形式传递给另外一部分作为开始点。
使用WITH可以在将结果传递到后续查询之前对结果进行操作。操作可以是改变结果的形式或者数量。WITH的一个常见用法就是限制传递给其他MATCH语句的结果数。通过结合ORDER BY和LIMIT,可获取排在前面的X个结果,从而实现分页效果。
另一个用法就是在聚合值上过滤。WITH用于在WHERE断言中引入聚合。这些聚合表达式创建了新的结果绑定字段。WITH也能像RETURN一样对结果使用别名作为绑定名。WITH还可以用于将图的读语句和更新语句分开,查询中的每一部分要么只是读取,要么都是写入。当写部分的语句是基于读语句的结果时,这两者之间的转换必须使用WITH。
WITH图例如图3-21所示。
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P194_91928.jpg?sign=1739224472-7vZr6BVf49C4X4qLLNeaW34kJupveUFj-0-e0af1ccf4bf5b4e05b8c4d7bd545a78f)
图3-21 WITH图例
3.3.18.1 过滤聚合函数结果
聚合的结果必须通过WITH语句传递才能进行过滤。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P195_102804.jpg?sign=1739224472-drp46py6wDjBZD1DNaiJBXRsF6QMx9nW-0-6125d40cc7376d6e66e2601a0c9d110f)
查询返回与David相连的人,且该人至少有一个外向关系。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P195_101908.jpg?sign=1739224472-It69i3YozvKUypvaYGki0tK4MgGNtuHZ-0-0c30fb9f6dcad0931970ba15c654bdeb)
3.3.18.2 在collect前对结果排序
可以在将结果传递给collect函数之前对结果进行排序,这样就可以返回排过序的列表。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P195_102805.jpg?sign=1739224472-yAqWAF6RXXnSzZQ830L7CZjT2nxqEjnB-0-678cb9261237d14f98b5772365cd56a7)
列表中的人名以倒序排列,并且数量限制为3。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P195_102805a.jpg?sign=1739224472-gLIEJCxby8SYjFJLxfGp2nlsIy8JgLqj-0-b0ecc7f5e00c98e9c59df61a7a0e05ea)
3.3.18.3 限制路径搜索的分支
可以限制匹配路径的数量,然后以这些路径为基础再做任何类似的有限制条件的搜索。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P195_102806.jpg?sign=1739224472-ite5gsLIUtjD74Bji3MDTZllNnQRsjy0-0-ce8b4eff38dcb781e054da0e08bfe38d)
先以Anders开始找到与之相连的所有节点,然后按名字倒序排列得到排第一个的节点,然后再以该节点为基础,找到与之相连的所有节点,最后返回它们的名字。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P196_101913.jpg?sign=1739224472-ZnM8E0hhE7fEFx78txRMdAbeU3tObOvx-0-1a809349ece3a95cbfb5d0530f615f0c)