Neo4j::cypher aggregation

andreasronge edited this page Oct 1, 2012 · 4 revisions
Clone this wiki locally

Read first how aggregation works here:


count is used to count the number of rows. count can be used in two forms — count() with no arguments which just counts the number of matching rows, and count(<identifier>), which counts the number of non-null values in . Notice that the count method is also available on path objects as well in the global context.

Count number of non null values in

Example, count my friends


Same as START v2=node(1) MATCH (v2)-[:`friends`]->(v1) RETURN count(v1)

The same could also be expressed like this:

node(1) >> :x

Count matching rows

Use the global context version of count for counting number of nodes connected to one node.


ret node(1).outgoing, count

Same as START v1=node(1) MATCH (v1)-->(v2) RETURN v2,count(*)


The sum aggregation function simply sums all the numeric values it encounters. Nulls are silently dropped. This is an example of how you can use sum



Generates: "START v1=node(2,3,4) RETURN sum(v1.value)"


avg calculates the average of a numeric column.

Similar syntax to sum, see above


Similar syntax to sum, see above


Similar syntax to sum, see above


collect collects all the values into a list.


Generates "START v1=node(2,3,4) RETURN collect(


All aggregation functions also take the DISTINCT modifier, which removes duplicates from the values. So, to count the number of unique eye colors from nodes related to a, this query can be used:

Example, using a ret block:

node(2) >> node(:b).ret{|n| n[:eyes].distinct}

Which generates: "START v1=node(2) MATCH (v1)-->(b) RETURN distinct(b.eyes)"

Or using separate lines:

node(2) >> :b
ret node(:b)[:eyes].distinct