GROUP BY

GROUP BY子句可以用于聚合数据。

openCypher兼容性

本文操作仅适用于nGQL扩展。

用户也可以使用openCypher方式的count()函数聚合数据。

  1. nebula> MATCH (v:player)<-[:follow]-(:player) RETURN v.name AS Name, count(*) as cnt ORDER BY cnt DESC
  2. +----------------------+--------------+
  3. | Name | Follower_Num |
  4. +----------------------+--------------+
  5. | "Tim Duncan" | 10 |
  6. +----------------------+--------------+
  7. | "LeBron James" | 6 |
  8. +----------------------+--------------+
  9. | "Tony Parker" | 5 |
  10. +----------------------+--------------+
  11. | "Manu Ginobili" | 4 |
  12. +----------------------+--------------+
  13. | "Chris Paul" | 4 |
  14. +----------------------+--------------+
  15. | "Tracy McGrady" | 3 |
  16. +----------------------+--------------+
  17. | "Dwyane Wade" | 3 |
  18. +----------------------+--------------+
  19. ...

语法

GROUP BY子句可以聚合相同值的行,然后进行计数、排序和计算等操作。

GROUP BY子句可以在管道符(|)之后和YIELD子句之前使用。

  1. | GROUP BY <var> YIELD <var>, <aggregation_function(var)>

aggregation_function()函数支持avg()sum()max()min()count()collect()std()

示例

  1. # 查找所有连接到player100的点,并根据他们的姓名进行分组,返回姓名的出现次数。
  2. nebula> GO FROM "player100" OVER follow BIDIRECT \
  3. YIELD $$.player.name as Name \
  4. | GROUP BY $-.Name \
  5. YIELD $-.Name as Player, count(*) AS Name_Count;
  6. +---------------------+------------+
  7. | Player | Name_Count |
  8. +---------------------+------------+
  9. | "Tiago Splitter" | 1 |
  10. +---------------------+------------+
  11. | "Aron Baynes" | 1 |
  12. +---------------------+------------+
  13. | "Boris Diaw" | 1 |
  14. +---------------------+------------+
  15. | "Manu Ginobili" | 2 |
  16. +---------------------+------------+
  17. | "Dejounte Murray" | 1 |
  18. +---------------------+------------+
  19. | "Danny Green" | 1 |
  20. +---------------------+------------+
  21. | "Tony Parker" | 2 |
  22. +---------------------+------------+
  23. | "Shaquille O'Neal" | 1 |
  24. +---------------------+------------+
  25. | "LaMarcus Aldridge" | 1 |
  26. +---------------------+------------+
  27. | "Marco Belinelli" | 1 |
  28. +---------------------+------------+

用函数进行分组和计算

  1. # 查找所有连接到player100的点,并根据起始点进行分组,返回degree的总和。
  2. nebula> GO FROM "player100" OVER follow \
  3. YIELD follow._src AS player, follow.degree AS degree \
  4. | GROUP BY $-.player \
  5. YIELD sum($-.degree);
  6. +----------------+
  7. | sum($-.degree) |
  8. +----------------+
  9. | 190 |
  10. +----------------+

sum()函数详情请参见内置数学函数