書名: 精通Neo4j作者名: 龐國明等本章字數: 1234字更新時間: 2023-07-17 19:01:09
3.3.5 Aggregation語句
3.3.5.1 簡介
Cypher支持使用聚合(Aggregation)來計算聚在一起的數據,類似SQL中的group by。聚合函數有多個輸入值,然后基于它們計算出一個聚合值。例如,avg函數計算多個數值的平均值。min函數用于找到一組值中最小的那個值。
聚合可以在匹配到的子圖上進行計算。非聚合的表達式將值聚集起來,然后放入聚合函數。
以下面的返回語句為例:

這里有兩個表達式:n和count()。前者n不是聚合函數,是一個分組鍵。后者count()是一個聚合函數。因此,根據不同的分組鍵(Grouping Key),匹配的子圖將被分為不同的組。聚合函數將運行在這些組上來計算聚合值。
下面的例子對理解聚合很有幫助,該查詢基于如圖3-9所示的數據。

圖3-9 查詢例子的數據
查詢:

在這個例子中,試圖找到朋友的所有朋友并計算朋友的個數。第一個count(DISTINCT friend_of_friend)聚合函數中每個friend_of_friend只會計算一次,因為DISTINCT剔除了重復的部分。第二個聚合函數中,每個friend_of_friend會被計算多次。當沒有使用DISTINCT時,因為B和C都認識D,因此D被計算了兩次。
結果:

聚合圖例如圖3-10所示。

圖3-10 聚合圖例
3.3.5.2 count
count用于計算行的數量。count有兩種使用方式:count(*)用于計算匹配的行數,而count(<expression>)用于計算<expression>中非空值的數量。
1.計算節點
計算節點的數量。例如:如果要計算連接到某個節點的節點數,可用count(*),示例如下。
查詢:

結果將返回起始節點及與之相連節點的數量。
結果:

2.按組計算關系類型的數量
計算關系類型組中的數量,返回類型和數量。
查詢:

結果將返回關系類型和關系組中的關系數量。
結果:

3.計算實體
除了通過count(*)計算結果的數量,還可以加入name值。
查詢:

結果將返回與滿足帶有name屬性值為A的節點相連的所有節點的數量。
結果:

4.計算非空值的數量
可以通過count(expression)來計算非空值的數量。
查詢:

結果將返回property屬性非空的所有節點。
結果:

3.3.5.3 統計
1.sum可以通過聚合函數sum計算所有值之和。計算的時候,空值將被丟棄。
查詢:

結果將返回包含Person標簽的所有節點的property屬性值之和。
結果:

2.avg
avg計算數值列的平均值。
查詢:

結果將返回property屬性值的平均值。
結果:

3.percentileDisc
percentileDisc計算給定值在一個組中的百分位,取值從0.0~1.0。它使用舍入法,返回最接近百分位的值。對于插值法,請參考percentileCont函數。
查詢:

結果:

4.percentileCont
percentileCont計算給定值在一個組中的百分位,百分位的值從0.0~1.0。它采用線性插值的方法,在兩個值之間計算一個加權平均數。對于使用舍入法獲取最近的值,請參考percentileDisc函數。
查詢:

結果:

5.stdev
stdev計算給定值在一個組中的標準偏差。它采用標準的two-pass方法,以N-1作為分母。當以部分樣本作為無偏估計時,應使用stdev;當計算整個樣本的標準偏差時,應使用stdevp。
查詢:

結果:

6.stdevp
stdevp計算給定值在一個組中的標準偏差。與stdev類似,區別如上所述。
查詢:

結果:

7.max
max查找數值列中的最大值。
查詢:

結果將返回property屬性中的最大值。
結果:

8.min
min查找數值列中的最小值。
查詢:

結果將返回property屬性中的最小值。
結果:

3.3.5.4 collect
collect將所有的值收集起來放入一個列表,空值null將被忽略。
查詢:

結果將以列表的形式返回收集到的值。
結果:

3.3.5.5 DISTINCT
所有的聚合函數都可以帶有DISTINCT修飾符,它將去掉其中的重復值。因此,計算節點中不重復眼睛顏色數量的查詢可以這樣寫:
查詢:

結果:
