![精通Neo4j](https://wfqqreader-1252317822.image.myqcloud.com/cover/113/47216113/b_47216113.jpg)
3.3.5 Aggregation语句
3.3.5.1 简介
Cypher支持使用聚合(Aggregation)来计算聚在一起的数据,类似SQL中的group by。聚合函数有多个输入值,然后基于它们计算出一个聚合值。例如,avg函数计算多个数值的平均值。min函数用于找到一组值中最小的那个值。
聚合可以在匹配到的子图上进行计算。非聚合的表达式将值聚集起来,然后放入聚合函数。
以下面的返回语句为例:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P152_89709.jpg?sign=1738852276-gfAysC9ruclcv4fnW7hAkIjTOcE2AtM8-0-de026b3e971bb499bfe7e06c9a84d047)
这里有两个表达式:n和count()。前者n不是聚合函数,是一个分组键。后者count()是一个聚合函数。因此,根据不同的分组键(Grouping Key),匹配的子图将被分为不同的组。聚合函数将运行在这些组上来计算聚合值。
下面的例子对理解聚合很有帮助,该查询基于如图3-9所示的数据。
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P153_89714.jpg?sign=1738852276-IDlNMUobxqJfh4sxctsfhLi2jkQz4L2I-0-68ad3e2095528a9bb3534d4dfa457366)
图3-9 查询例子的数据
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P153_102629.jpg?sign=1738852276-4AxnvDl817o3JAWEFhUhvDvc8qylEWoK-0-83c6ac692bb6b417074a3303b37c501d)
在这个例子中,试图找到朋友的所有朋友并计算朋友的个数。第一个count(DISTINCT friend_of_friend)聚合函数中每个friend_of_friend只会计算一次,因为DISTINCT剔除了重复的部分。第二个聚合函数中,每个friend_of_friend会被计算多次。当没有使用DISTINCT时,因为B和C都认识D,因此D被计算了两次。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P153_102630.jpg?sign=1738852276-lBjiVrneRtu2cVXwsLUFbsGDmuH1EP8A-0-3d802aad16348f28abc90092b73578ea)
聚合图例如图3-10所示。
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P153_89742.jpg?sign=1738852276-ogU6y6L5ZnZowIuBIpexSK1l1IOLefoq-0-000edf6b818e59cb896796e8963b2293)
图3-10 聚合图例
3.3.5.2 count
count用于计算行的数量。count有两种使用方式:count(*)用于计算匹配的行数,而count(<expression>)用于计算<expression>中非空值的数量。
1.计算节点
计算节点的数量。例如:如果要计算连接到某个节点的节点数,可用count(*),示例如下。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P154_102632.jpg?sign=1738852276-GGakbeQASwgRTmEGfzOvNgjaTU9ahorc-0-5c84febb406f2eb2144c50fecdbfa7b1)
结果将返回起始节点及与之相连节点的数量。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P154_101663.jpg?sign=1738852276-Gro3adX0or4qZ1ueh70BBtyIpZ6grqLU-0-196172bc39a9f22793b48c052788de4c)
2.按组计算关系类型的数量
计算关系类型组中的数量,返回类型和数量。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P154_102633.jpg?sign=1738852276-KZ8WgNLKlJGCzsgwQFQQsSS45jWA0USd-0-6e11f28d412c5b35f5487832dfaaa800)
结果将返回关系类型和关系组中的关系数量。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P154_101666.jpg?sign=1738852276-JqNZhY9diRkEKtzIBPspf10f3828VEGC-0-7434309e3eb2943a41a32e8505e1036d)
3.计算实体
除了通过count(*)计算结果的数量,还可以加入name值。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P154_102634.jpg?sign=1738852276-Lak7OhK5UX7muVAv2voeLRARSfrZhTA9-0-f0468b8a6a8c29fb1826005d52e87d24)
结果将返回与满足带有name属性值为A的节点相连的所有节点的数量。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P154_101669.jpg?sign=1738852276-1YkkLKSqQeomFbTHscLNlbnrBAl67VfW-0-50e5e4a2d17d8314f1c087220399ee9b)
4.计算非空值的数量
可以通过count(expression)来计算非空值的数量。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P155_102635.jpg?sign=1738852276-9DjNMUBRE3i3OxwahPiavb8Q4faRWxvS-0-7cc392ac78c0b74c60c29f86a9a9e991)
结果将返回property属性非空的所有节点。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P155_101672.jpg?sign=1738852276-uOPQemcBk4q6tZ1zj0KQWW2C1pDDOvUs-0-0a682f88d661f294b4c0aab15656b3b8)
3.3.5.3 统计
1.sum可以通过聚合函数sum计算所有值之和。计算的时候,空值将被丢弃。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P155_102636.jpg?sign=1738852276-HdVh2YyPROOUWMy50RWhcVXil7GN6eR5-0-fddd45d295690a3cea2b1fa1364d0282)
结果将返回包含Person标签的所有节点的property属性值之和。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P155_101674.jpg?sign=1738852276-dQJxkFNz4anMhzBh548jXpm9tm6A936x-0-304eb640755f15f45341687f6d66a90f)
2.avg
avg计算数值列的平均值。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P155_102637.jpg?sign=1738852276-waWdak4xgCSDBxdOMjathgILw7I14KD2-0-f5422dcb772bf0187885cfbac0c1c4bf)
结果将返回property属性值的平均值。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P155_101677.jpg?sign=1738852276-7yQW2LcqKkm2j42GtRmBvFlY6x6ED5t4-0-a2387520d7c3de822486175eccb925dc)
3.percentileDisc
percentileDisc计算给定值在一个组中的百分位,取值从0.0~1.0。它使用舍入法,返回最接近百分位的值。对于插值法,请参考percentileCont函数。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P156_102638.jpg?sign=1738852276-1By2Lpe0C9xfkYn9y9qnltcgRsSmsxJO-0-b1e51f9cd6bd926b70e78cc7b4fbaf24)
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P156_101680.jpg?sign=1738852276-6UTW4waGrr3BfaO6IWJFNXiqgBh4nEYt-0-acd37ddd2a2470d21adfaee3127ed77b)
4.percentileCont
percentileCont计算给定值在一个组中的百分位,百分位的值从0.0~1.0。它采用线性插值的方法,在两个值之间计算一个加权平均数。对于使用舍入法获取最近的值,请参考percentileDisc函数。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P156_102639.jpg?sign=1738852276-VgNWZwJLDOrW4BtOG4vEKC0rbxy4G2C3-0-3710d06de0e4dd5a8ab7a696a7ed95b8)
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P156_101683.jpg?sign=1738852276-YyWw8vZalFwzsqeAKfUe2suE8Ux47L6q-0-e09f8af34f7f7080bf97f30f53aadd40)
5.stdev
stdev计算给定值在一个组中的标准偏差。它采用标准的two-pass方法,以N-1作为分母。当以部分样本作为无偏估计时,应使用stdev;当计算整个样本的标准偏差时,应使用stdevp。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P156_102640.jpg?sign=1738852276-FjODZzXy12f3nImsUFqssQY8ysCQ1rgW-0-7e6cf9bab9cbacf19422b92629b61890)
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P156_101686.jpg?sign=1738852276-AC8gLg7nqKXIch18zyXq1OSyYFJelGln-0-7d743e4725dcaffa11d949239363cb5e)
6.stdevp
stdevp计算给定值在一个组中的标准偏差。与stdev类似,区别如上所述。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P157_102641.jpg?sign=1738852276-4JlWVyWsKgtmJnVcRUbepUVTIBuRbJqG-0-78f354cb0b6cb69abbde8088e75d421a)
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P157_102661.jpg?sign=1738852276-qfugMzHkxqPjUErT7wgFqDBkSCXo728s-0-1be4cf7fc3f27466d5790d1663eb02a5)
7.max
max查找数值列中的最大值。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P157_102642.jpg?sign=1738852276-gAu7LgJUCL9D1yAjQxKSfzSDdX9Wq6Ka-0-4b9b8aea3523d84530d77000a8abbba0)
结果将返回property属性中的最大值。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P157_101692.jpg?sign=1738852276-mDUKkE6GPgTxyL2JdcBt4zxAciWivhcq-0-62294f2c96e49b18eca1144f45fb6daf)
8.min
min查找数值列中的最小值。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P157_102643.jpg?sign=1738852276-hRpTIeOLrVNA6OClKfAb1Pd1AxTRcbsK-0-70058bf362aea865e1bb700d060dae0d)
结果将返回property属性中的最小值。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P157_101695.jpg?sign=1738852276-YFCjRzk63KUMLXdymevcO0WqkhniVBsY-0-2723d47a19a3b25da3751ba192f85348)
3.3.5.4 collect
collect将所有的值收集起来放入一个列表,空值null将被忽略。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P158_102645.jpg?sign=1738852276-PNStbwJAaXySaqupWGLWpevS7Eb2djX4-0-15e38e6c4704b2546653f43a20ba9f0a)
结果将以列表的形式返回收集到的值。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P158_102647.jpg?sign=1738852276-x72QcUbJpZwwldoxwwsUfWlZgXIElbp5-0-d9717b9eb40c41c36192af940873ed97)
3.3.5.5 DISTINCT
所有的聚合函数都可以带有DISTINCT修饰符,它将去掉其中的重复值。因此,计算节点中不重复眼睛颜色数量的查询可以这样写:
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P158_102646.jpg?sign=1738852276-yRwWoKgcnC1FHD9PfLFalo43XLSaLatX-0-59887e5d4828968a5ab099ade830b092)
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P158_101701.jpg?sign=1738852276-mmiItZjK2i74lGpvQRuhtaEd7J6uSCku-0-245b801c62a6fe1d01693e789285c1c5)