Aggregation & Grouping
Non-aggregated expressions in RETURN or WITH act as implicit grouping keys - no GROUP BY clause is needed.
Aggregation Functions
| Function | Description | Example |
|---|---|---|
| count(expr) | Count non-null values (or count(*) for all rows) | count(n) |
| collect(expr) | Collect values into a list | collect(n.name) |
| sum(expr) | Sum numeric values | sum(n.score) |
| avg(expr) | Average numeric values | avg(n.age) |
| min(expr) | Minimum value | min(n.created) |
| max(expr) | Maximum value | max(n.score) |
| percentileCont(expr, p) | Continuous percentile (interpolated) | percentileCont(n.age, 0.95) |
| percentileDisc(expr, p) | Discrete percentile (exact value) | percentileDisc(n.age, 0.5) |
| stdev(expr) | Sample standard deviation | stdev(n.score) |
| stdevp(expr) | Population standard deviation | stdevp(n.score) |
Grouping Examples
-- Count per label MATCH (n:Person) RETURN n.city, count(n) AS population ORDER BY population DESC -- Collect friends per person MATCH (p:Person)-[:FRIEND]->(f:Person) RETURN p.name, collect(f.name) AS friends -- Aggregation with WITH for filtering MATCH (p:Person)-[:FRIEND]->(f) WITH p, count(f) AS friendCount WHERE friendCount > 5 RETURN p.name, friendCount
DISTINCT
MATCH (n:Person)-[:LIVES_IN]->(c:City) RETURN DISTINCT c.name -- With count MATCH (p:Person)-[:HAS_SKILL]->(s) RETURN p.name, count(DISTINCT s) AS uniqueSkills