![精通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=1738851616-ztfy97bspQ5GIY6o3251ngJkJmI7ygbI-0-a5b7fa71579c81e91a83d9a913ba23f2)
这里有两个表达式:n和count()。前者n不是聚合函数,是一个分组键。后者count()是一个聚合函数。因此,根据不同的分组键(Grouping Key),匹配的子图将被分为不同的组。聚合函数将运行在这些组上来计算聚合值。
下面的例子对理解聚合很有帮助,该查询基于如图3-9所示的数据。
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P153_89714.jpg?sign=1738851616-9x7GEWKNJatjnE09lPaRs3mfr7P3JCiU-0-a20cf9d1de1257a44224738f3132393d)
图3-9 查询例子的数据
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P153_102629.jpg?sign=1738851616-W5dGmOYJ61OveEvsnsJ7O9s1rm2o5rLw-0-f1c67e0999da5d10297406af084ec503)
在这个例子中,试图找到朋友的所有朋友并计算朋友的个数。第一个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=1738851616-407ZYA5VhdAQU58yQTB94UoQ4nc7Um72-0-262903dcd5098f0f961d0943cc994ae9)
聚合图例如图3-10所示。
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P153_89742.jpg?sign=1738851616-i3SONDzp2YQG1TBED26T1XxL63WyM4AN-0-a3a653030bfba8a74b3768da11bdb2c4)
图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=1738851616-mjhcBxXYUZhVnDJHCriaEK4nevBoU9RI-0-a7dd49d4f3aae018e17679cdc09f5a1b)
结果将返回起始节点及与之相连节点的数量。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P154_101663.jpg?sign=1738851616-GH4rUsyXjWApeM0CIf1Ao5ZMPqcpT9xc-0-fa4d7a7db7a256f32b7e1b0a1d11d763)
2.按组计算关系类型的数量
计算关系类型组中的数量,返回类型和数量。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P154_102633.jpg?sign=1738851616-hK4X7G7PTxeQj9lTKGblu2YHAaYZLXQn-0-ac13bcd1bb703143ebcbc6e690f8a77e)
结果将返回关系类型和关系组中的关系数量。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P154_101666.jpg?sign=1738851616-q7fvSaHi3THquL4HkJZb6jdil9d0n6jL-0-6e78d5eefa8d2baf9d3cc1684098d708)
3.计算实体
除了通过count(*)计算结果的数量,还可以加入name值。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P154_102634.jpg?sign=1738851616-XWipcr0fgMM4AbGKdF6DwiMqwMaXvRPt-0-58daf79e206130b7a240993422e4579c)
结果将返回与满足带有name属性值为A的节点相连的所有节点的数量。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P154_101669.jpg?sign=1738851616-Q8ZWRkxqN0Z2OZt5LmGDcFiRxBTwXrf7-0-345b3f75d67d0055f6d8ebeeea51396e)
4.计算非空值的数量
可以通过count(expression)来计算非空值的数量。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P155_102635.jpg?sign=1738851616-kmNgapVSTpdOVtrW1homB9i4Aqa0dC1i-0-b3bfbcc9932802001e05e0eabe1e09a2)
结果将返回property属性非空的所有节点。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P155_101672.jpg?sign=1738851616-pkuGxEK4HiJjNYRRWHg3vRpwwvkFj8Qy-0-6936369da94410492e1273a9c8068c29)
3.3.5.3 统计
1.sum可以通过聚合函数sum计算所有值之和。计算的时候,空值将被丢弃。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P155_102636.jpg?sign=1738851616-VHA6IxTRp8Omzf8RMTkwR9OxzRgVF6ag-0-4b4a17202f2ddab71489ea12d2b79580)
结果将返回包含Person标签的所有节点的property属性值之和。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P155_101674.jpg?sign=1738851616-6Yt2lDtjlT66mYCUkseqXw7tpiJvKrOK-0-d0f50e48ce0faae890eadf529e88f05c)
2.avg
avg计算数值列的平均值。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P155_102637.jpg?sign=1738851616-riSMgBh4wCYtuecqSuYnawmAx8kOuAIR-0-548092fcdca4324c99d14aa44e1a083a)
结果将返回property属性值的平均值。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P155_101677.jpg?sign=1738851616-pzNFKkOmfuQQjUd1OtRlcVrfBMw87bel-0-050ee501c5350adb4367ccfd6978b9dd)
3.percentileDisc
percentileDisc计算给定值在一个组中的百分位,取值从0.0~1.0。它使用舍入法,返回最接近百分位的值。对于插值法,请参考percentileCont函数。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P156_102638.jpg?sign=1738851616-qZEfuby1o9mPyikU0FsEnEaYqCROM4yI-0-6be409f86241324a54bfe2421cc6e9ff)
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P156_101680.jpg?sign=1738851616-c0WA924AaSsVc2iPtfAOdzuCTy3pUNSi-0-2087c004f6cb371f32a90a1237c51a94)
4.percentileCont
percentileCont计算给定值在一个组中的百分位,百分位的值从0.0~1.0。它采用线性插值的方法,在两个值之间计算一个加权平均数。对于使用舍入法获取最近的值,请参考percentileDisc函数。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P156_102639.jpg?sign=1738851616-EUM0BQAEle1IQJ9qzz4hUd6Vd62c6QUg-0-ad201d0ddbebec2e814589611770187c)
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P156_101683.jpg?sign=1738851616-xpzrRGStUAvWargG26iKVhiX3dl1e1cI-0-26195667213c0ca8bf9acd72498a26a9)
5.stdev
stdev计算给定值在一个组中的标准偏差。它采用标准的two-pass方法,以N-1作为分母。当以部分样本作为无偏估计时,应使用stdev;当计算整个样本的标准偏差时,应使用stdevp。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P156_102640.jpg?sign=1738851616-bzqd31Xq8HdpO1TsspappGU0IFd1jrEm-0-adc486ca37428c86018ba0e3d9876a0a)
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P156_101686.jpg?sign=1738851616-s9hkgPQB9qwOITSmhbPD2919fX1Ivb0a-0-e5caba59fe862a5f8063409eb14ff1bb)
6.stdevp
stdevp计算给定值在一个组中的标准偏差。与stdev类似,区别如上所述。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P157_102641.jpg?sign=1738851616-7kfRxc8BHT2qnamk8stDNZIdREcGA21W-0-fd883e7f52ae7b5f6bc62bba414b6540)
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P157_102661.jpg?sign=1738851616-xHIrcB4nk6QbfjHsfaMRwKo6bAB6tJGI-0-164ead688311a38cb9ef0623a478a735)
7.max
max查找数值列中的最大值。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P157_102642.jpg?sign=1738851616-II9yxvdKlOQzTraSJlVpRMJjs8sY2V3S-0-93d793cab9f239704b06e9e7fc581dab)
结果将返回property属性中的最大值。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P157_101692.jpg?sign=1738851616-uZQbbToJXI02upQyoBQTbPtHMmwJNCTo-0-808af64bf000f488b1c7c76eb7f4c2ee)
8.min
min查找数值列中的最小值。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P157_102643.jpg?sign=1738851616-1GtvdTn1F9KoiuNLhDcFtJUuMXxUKhQr-0-a90d894f69c807c5f8cc90e91b95378a)
结果将返回property属性中的最小值。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P157_101695.jpg?sign=1738851616-yd7Yazn5wqDfPPXA8xunQzbj1cSXP3ml-0-ccd06dd175e07e15c6042e0c53ccae9a)
3.3.5.4 collect
collect将所有的值收集起来放入一个列表,空值null将被忽略。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P158_102645.jpg?sign=1738851616-DXxWmJ6j14pJLRbAYrnYqbWarM0DEtyU-0-5e64827dbec42f5596a6e4d51adf38f5)
结果将以列表的形式返回收集到的值。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P158_102647.jpg?sign=1738851616-lnuoFRJuycG6nA8oBf6yoQgNCmWkEJNM-0-2a9c00bd885f03eace3104dfa33de2f9)
3.3.5.5 DISTINCT
所有的聚合函数都可以带有DISTINCT修饰符,它将去掉其中的重复值。因此,计算节点中不重复眼睛颜色数量的查询可以这样写:
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P158_102646.jpg?sign=1738851616-RtnPRXIH5c7J4b2zVUaPlITgWcpdeuWv-0-7e59caac67a1c8272dc289ea0e5cac17)
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P158_101701.jpg?sign=1738851616-CJYUwyZCuCOrRRCOfhUPJbGPxd03bzwo-0-9c5f65b26b9aca9190c501edf84950db)