# reduce() function¶

## OpenCypher Compatibility¶

In openCypher, the function reduce() is not defined. nGQL implements reduce() function as the Cypher way.

## Syntax¶

reduce() returns the value resulting from the application of an expression on each successive element in a list in conjunction with the result of the computation thus far. This function will iterate through each element e in the given list, run the expression on e — taking into account the current partial result — and store the new partial result in the accumulator. This function is analogous to the fold or reduce method in functional languages such as Lisp and Scala.

reduce(accumulator = initial, variable IN list | expression)

• Arguments:
Name Description
accumulator A variable that will hold the result and the partial results as the list is iterated.
initial An expression that runs once to give a starting value to the accumulator.
list An expression that returns a list.
variable The closure will have a variable introduced in its context. We decide here which variable to use.
expression This expression will run once per value in the list, and produce the result value.
• Returns:

The type of the value returned depends on the arguments provided, along with the semantics of expression.

## Example¶

nebula> RETURN reduce(totalNum = 10, n IN range(1, 3) | totalNum + n) AS r;
+----+
| r  |
+----+
| 16 |
+----+

nebula> RETURN reduce(totalNum = -4 * 5, n IN [1, 2] | totalNum + n * 2) AS r;
+-----+
| r   |
+-----+
| -14 |
+-----+

nebula> MATCH p = (n:player{name:"LeBron James"})<-[:follow]-(m) \
RETURN      nodes(p)[0].age AS src1,  \
nodes(p)[1].age AS dst2,  \
reduce(totalAge = 100, n IN nodes(p) | totalAge + n.age) AS sum
+------+------+-----+
| src1 | dst2 | sum |
+------+------+-----+
| 34   | 31   | 165 |
+------+------+-----+
| 34   | 29   | 163 |
+------+------+-----+
| 34   | 33   | 167 |
+------+------+-----+
| 34   | 26   | 160 |
+------+------+-----+
| 34   | 34   | 168 |
+------+------+-----+
| 34   | 37   | 171 |
+------+------+-----+

nebula> LOOKUP ON player WHERE player.name == "Tony Parker" |  GO FROM $-.VertexID over follow WHERE follow.degree != reduce(totalNum = 5, n IN range(1, 3) | $$.player.age + totalNum + n) YIELD$$.player.name AS id,$\$.player.age AS age, follow.degree AS degree
+---------------------+-----+--------+
| id                  | age | degree |
+---------------------+-----+--------+
| "Tim Duncan"        | 42  | 95     |
+---------------------+-----+--------+
| "LaMarcus Aldridge" | 33  | 90     |
+---------------------+-----+--------+
| "Manu Ginobili"     | 41  | 95     |
+---------------------+-----+--------+


Last update: April 22, 2021