![精通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=1738953547-rcmMm89Mi610pLoCdqICqd1E5Ws0AkiS-0-05add64f7024de63ab62c88e4aa192c1)
这里有两个表达式:n和count()。前者n不是聚合函数,是一个分组键。后者count()是一个聚合函数。因此,根据不同的分组键(Grouping Key),匹配的子图将被分为不同的组。聚合函数将运行在这些组上来计算聚合值。
下面的例子对理解聚合很有帮助,该查询基于如图3-9所示的数据。
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P153_89714.jpg?sign=1738953547-DWztIOrfEhg2gImQMvHsvX2w1NlzmIra-0-0599748cf22f40e91b46bffdc2b635b9)
图3-9 查询例子的数据
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P153_102629.jpg?sign=1738953547-UsMTbZzX7vloJ2KaSWibnLtmDEOWVVtE-0-25b8fb7079bd40c0a98175beb5d3a252)
在这个例子中,试图找到朋友的所有朋友并计算朋友的个数。第一个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=1738953547-HXMfWxnjRcFkPcHMO0D9Rttg7JSDr1jF-0-ce2ac536871cc53a651a0d85269d2854)
聚合图例如图3-10所示。
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P153_89742.jpg?sign=1738953547-xJxOhW8SL4bcyyMQ07tHVXfF8WDIWzoX-0-82e0244bbce8a26400d3097b06f9cc3a)
图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=1738953547-NIGrxF2vqvQiS5VJuAc1LAscGyMZDM3y-0-88fd2c5c7becb41f721f9490f115f6c2)
结果将返回起始节点及与之相连节点的数量。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P154_101663.jpg?sign=1738953547-uxDZ8fvm22faDIIgLRDQDAzEmbrqoNtg-0-e90b58a848360d3727e6fa41328eb4a6)
2.按组计算关系类型的数量
计算关系类型组中的数量,返回类型和数量。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P154_102633.jpg?sign=1738953547-F98drXeEqAdJYfn1u8fDUqBTpcxaUO4p-0-9687ed133a14ea6fa1d36d1cc85b1ad0)
结果将返回关系类型和关系组中的关系数量。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P154_101666.jpg?sign=1738953547-5D42SFOnNAsdfKJ6zbk0eb2zYDFKiaHD-0-2bb139d006e572fd54bc0d279f499bf3)
3.计算实体
除了通过count(*)计算结果的数量,还可以加入name值。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P154_102634.jpg?sign=1738953547-HMRWSdYdSKQX48ayowpvfec9sESZa334-0-5d69376eb86346ac248fd4180ef42f1f)
结果将返回与满足带有name属性值为A的节点相连的所有节点的数量。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P154_101669.jpg?sign=1738953547-bQPO2PVhcI96UL86WEQR8ARbw8frs7ZH-0-f6191f6e20511e7efb132ecdb9dbf951)
4.计算非空值的数量
可以通过count(expression)来计算非空值的数量。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P155_102635.jpg?sign=1738953547-7AubwffoaT2vycQC2niqIgdjVdaVCvvv-0-49d38b0fd18a78d7aed1ae11825fd73c)
结果将返回property属性非空的所有节点。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P155_101672.jpg?sign=1738953547-JYPkz1eUNBoTcf1544oXuKY29vYEtPR8-0-9acfb6b5e3bec10052372782eb461488)
3.3.5.3 统计
1.sum可以通过聚合函数sum计算所有值之和。计算的时候,空值将被丢弃。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P155_102636.jpg?sign=1738953547-D4DydL0k17BQAtd8dnc3s3bhlCNgO06q-0-dcfe229793f1ea55715407afd452e617)
结果将返回包含Person标签的所有节点的property属性值之和。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P155_101674.jpg?sign=1738953547-3udLQ4VoovkpxwySS4wBRcE8ap9lM1FB-0-ea86cb92a3079072c039b64620f24a4d)
2.avg
avg计算数值列的平均值。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P155_102637.jpg?sign=1738953547-uyIZnculX0BO0ODdNKnbCLRQPrdliNYm-0-d907926eb7c6edc66f6d685f48631e2c)
结果将返回property属性值的平均值。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P155_101677.jpg?sign=1738953547-mhVyXkfCc8pjRSFVwkNysSFinfhdRZMc-0-27caf856abacab25cfe798ea8f380c9b)
3.percentileDisc
percentileDisc计算给定值在一个组中的百分位,取值从0.0~1.0。它使用舍入法,返回最接近百分位的值。对于插值法,请参考percentileCont函数。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P156_102638.jpg?sign=1738953547-KOHDnOsudy4Wx4LicANthNy9Lvtz7UqT-0-df883e9d56bc499af5e945446d8f05ba)
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P156_101680.jpg?sign=1738953547-dGeeEHyNO8a4Eci1ExLz49QCCLZcWuFF-0-b1f31a86b3f75e01397c8c1657a33b35)
4.percentileCont
percentileCont计算给定值在一个组中的百分位,百分位的值从0.0~1.0。它采用线性插值的方法,在两个值之间计算一个加权平均数。对于使用舍入法获取最近的值,请参考percentileDisc函数。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P156_102639.jpg?sign=1738953547-pwMvuwWEGptfLqboZCqvFAxLWxWncnWD-0-6df4a573b58f7e040636cb8d7945d3ba)
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P156_101683.jpg?sign=1738953547-Ae8JrZaRNPtnW9KBw1r7xGW6uviCB1bb-0-8192e22ab2afc00f8d0d6893f5369001)
5.stdev
stdev计算给定值在一个组中的标准偏差。它采用标准的two-pass方法,以N-1作为分母。当以部分样本作为无偏估计时,应使用stdev;当计算整个样本的标准偏差时,应使用stdevp。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P156_102640.jpg?sign=1738953547-iJNShnFovC3v57JE6rzOjS7Sz18dQpqx-0-d1c3a4b5ae62186115181550cc47c827)
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P156_101686.jpg?sign=1738953547-7sWU6rvttexwSF28eSINHI2OrWvBlJtm-0-6ac18192297b72458b6acd69688dcc7a)
6.stdevp
stdevp计算给定值在一个组中的标准偏差。与stdev类似,区别如上所述。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P157_102641.jpg?sign=1738953547-hGWem0V9cw5EGtfp1VMf4nDRwHw9NBRY-0-136f33a9ab6f6b3eb8b97d4b5c6775f7)
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P157_102661.jpg?sign=1738953547-57bblfx07VyJjqSa60DLC1T1gSn3ij7p-0-e5f922efde26bf88aa528b9e06d31b6e)
7.max
max查找数值列中的最大值。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P157_102642.jpg?sign=1738953547-der0vHMdCwKJNL54Kmg6Sj5TLxjPuVll-0-5240d33f8ecc24c2e0f3619350377e43)
结果将返回property属性中的最大值。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P157_101692.jpg?sign=1738953547-pIqrGP0P29NCPzXOxPwFGtldeYOHkyyD-0-128347ab20b440c8cb4b322ad82ce57e)
8.min
min查找数值列中的最小值。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P157_102643.jpg?sign=1738953547-53TyvUvJHobWoRDdKMimPLlHyzysQ70p-0-8e4a300cfd34b5e9519e636c845b186e)
结果将返回property属性中的最小值。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P157_101695.jpg?sign=1738953547-KgGKyt89uvi0R28XSJl4UuKYcwQdhypL-0-2d6fe16ca5b35311378d59c40844cf85)
3.3.5.4 collect
collect将所有的值收集起来放入一个列表,空值null将被忽略。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P158_102645.jpg?sign=1738953547-RRO8SIFz46SHKIL6q5p1CoMBT9kEdzG9-0-298d5665e13a7fd3145502f431149597)
结果将以列表的形式返回收集到的值。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P158_102647.jpg?sign=1738953547-vOuaaIkByU3iIrtT5DRYpMjFdxFcIpa7-0-01093bae620803d40680893f7c9cbfda)
3.3.5.5 DISTINCT
所有的聚合函数都可以带有DISTINCT修饰符,它将去掉其中的重复值。因此,计算节点中不重复眼睛颜色数量的查询可以这样写:
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P158_102646.jpg?sign=1738953547-N47u4vCDdByUt2yCuXChXABYay9lzWo3-0-d56f0182d7d769b5583dd7467034fd50)
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P158_101701.jpg?sign=1738953547-M2AdK0Liz4KqaFcD9rbdavbLl9UgXG3N-0-f4aa77c54baf074f133b5d89f6ac7c61)