Skip to content
Developer Edition runs on one host and does not require a product license file. Need multi-host deployment or performance testing at scale? Explore Enterprise Edition

Aggregator value variables

Aggregator value variables are used to define aggregation operations on nested values. When referenced in subsequent statements, aggregator value variables must be prefixed with the symbol @, which distinguishes them from primitive value variables.

For numeric-related aggregator value variable declarations, explicit numeric type variants such as INT8, INT16, INT32, INT64, FLOAT, and DOUBLE are supported (depending on the specific aggregator value variable type).

Aggregator value variables are further categorized into two types:

  • Global aggregator value variables
  • Node-attached aggregator value variables

Caution

Node-attached aggregator value variables are only applicable to temporary graphs, while global aggregator value variables are applicable to both graphs and temporary graphs.

Global aggregator value variables

Global aggregator value variables must be declared at the global scope and are accessible from any part of the procedure after declaration.

Node-attached aggregator value variables

Node-attached aggregator value variables must be declared with the NODE keyword at the global scope and are accessible for aggregation only within per_block clauses in match compute statements.

Comparison

The following table summarizes the key differences between global and node-attached aggregator value variables:

Global aggregator value variables Node-attached aggregator value variables
Scope Maintains a single shared state across the entire computation. Each node in the graph maintains its own independent state.
Applicable graph type Graphs and temporary graphs. Temporary graphs only.
Accessible context Any part of the procedure after declaration. Only within per_block clauses in match compute statements.
Declaration VALUE var AggType<T> [= value_expression] NODE VALUE var AggType<T> [= value_expression]
Reference @var <node_var>.@var (within PER NODE / PER PATH blocks)
Memory footprint Small. Only one copy of the aggregated state is maintained regardless of graph size. Proportional to the number of nodes. Each node holds its own copy of the aggregated state.
Distributed mode considerations Each round requires a global merge across all machines. Avoid storing large collections in global aggregator value variables (especially container-type aggregators such as ListAgg, SetAgg, and MapAgg), as both the memory footprint and the cross-machine transfer cost grow with the size of the collected data. PER NODE operations are mostly local. PER PATH operations may incur more cross-machine communication, especially for high-degree nodes.

Caution

Global aggregator value variables are best suited for scalar values (e.g., SumAgg, MaxAgg, MinAgg, AvgAgg). Using container-type aggregators (ListAgg, SetAgg, MapAgg) as global aggregator value variables can lead to significant memory consumption and cross-machine transfer overhead in distributed mode, because the entire collection must be merged across all machines in each round. If you need to collect per-node data, consider using node-attached aggregator value variables or exporting results to a table variable instead.

Selection guidelines

  • To track a single summary value across the entire computation (e.g., a total count, a running sum, or a convergence flag), use a global aggregator value variable.
  • To maintain a separate value for each node (e.g., a distance, a score, or a component ID), use a node-attached aggregator value variable.
  • In iterative graph algorithms, the two types are often used together: node-attached aggregator value variables store the per-node results updated in each iteration, while global aggregator value variables track overall progress, such as whether any node's value changed in the current iteration and whether another iteration is needed.

Syntax

aggregator_value_variable_definition
NODE VALUE aggregator_value_variable aggr_type = value_expression
aggr_type
SumAgg AvgAgg MaxAgg MinAgg AndAgg OrAgg ListAgg SetAgg MapAgg TopKAgg

aggregator_value_variable_definition ::=
    'NODE'? 'VALUE' aggregator_value_variable aggr_type ('=' value_expression)?

aggr_type ::=
    SumAgg 
    | AvgAgg
    | MaxAgg
    | MinAgg  
    | AndAgg  
    | OrAgg
    | ListAgg  
    | SetAgg   
    | MapAgg
    | TopKAgg

Parameters

NODE

The optional keyword NODE specifies that the variable is attached to the nodes in a temporary graph. Each node has its own instance of the variable, which holds the value specific to that node.

aggregator_value_variable

The name of the aggregator value variable to be defined. aggregator_value_variable can be a regular identifier or a delimited identifier enclosed with backticks (`). For more information about identifiers, see Rules for naming identifiers.

aggr_type

The type of aggregator applied to the nested values held by the variable.

The following table provides an overview of the supported aggregator types:

Aggregator type Description
SumAgg For all inputs x, maintains the value sum(x). For more information, see SumAgg.
AvgAgg For all inputs x, maintains the average value avg(x), which equals sum(x)/count(x). For more information, see AvgAgg.
MaxAgg For all inputs x, maintains the maximum value max(x). For more information, see MaxAgg.
MinAgg For all inputs x, maintains the minimum value min(x). For more information, see MinAgg.
AndAgg For all inputs x, maintains the result of logical AND operation. For more information, see AndAgg.
OrAgg For all inputs x, maintains the result of logical OR operation. For more information, see OrAgg.
ListAgg Aggregates all inputs into a list in insertion order. For more information, see ListAgg.
SetAgg Aggregates all inputs into a set that contains only unique values. For more information, see SetAgg.
MapAgg For each input TUPLE(key, value), maintains a map of key-value pairs where each key maps to an aggregated value. For more information, see MapAgg.
TopKAgg For all inputs, maintains the top K values based on specified sorting criteria. For more information, see TopKAgg.

value_expression

An optional value expression that defines the initial value of the variable. It can be a constant, a function call, or a subquery that returns a single value. For more information about value expressions, see Value expressions.

= value_expression is supported only by SumAgg, MaxAgg, MinAgg, AndAgg, and OrAgg. For AvgAgg, ListAgg, TopKAgg, MapAgg, and SetAgg, specifying an initial value is invalid.

Examples

The following example is based on the graph movie created in the example dataset and the temporary graph #movie_temporary_graph created in CREATE TEMPORARY GRAPH.

Define global aggregator value variables

'''
USE movie { 
  VALUE a SumAgg<INT> = 0 
  VALUE b MaxAgg<DOUBLE> = 0.0 
  VALUE c MinAgg<INT> = 100 
  VALUE d AvgAgg<DOUBLE> 
  VALUE e OrAgg = false 
  VALUE f AndAgg = true 
  VALUE g ListAgg<INT> 
  VALUE h ListAgg<RECORD{x INT, y STRING}> 
  RETURN @a, @b, @c, @d, @e, @f, @g, @h 
    }
'''

Return:

+----+-----+-----+-----+-------+------+----+----+
| @a | @b  | @c  | @d  | @e    | @f   | @g | @h |
+----+-----+-----+-----+-------+------+----+----+
| 0  | 0.0 | 100 | 0.0 | false | true | [] | [] |
+----+-----+-----+-----+-------+------+----+----+

Define node-attached aggregator value variables

'''
USE #movie_temporary_graph {  
  NODE VALUE a ListAgg<INT>  
  MATCH (v@Actor) WHERE v.id > 271940  
  PER NODE (v) {  
    SET v.@a = LIST[v.id]  
    LOG_INFO("ID_List: ", v.@a)  
  }  
}
'''

Return:

Log:
2025-07-14T07:30:37.718732 INFO  - ID_List: [271941]
2025-07-14T07:30:37.718732 INFO  - ID_List: [271947]
2025-07-14T07:30:37.718732 INFO  - ID_List: [271945]
2025-07-14T07:30:37.718978 INFO  - ID_List: [271943]
2025-07-14T07:30:37.718978 INFO  - ID_List: [271946]
2025-07-14T07:30:37.718978 INFO  - ID_List: [271944]
2025-07-14T07:30:37.718978 INFO  - ID_List: [282659]
2025-07-14T07:30:37.719037 INFO  - ID_List: [271942]