变量操作¶
SET语句用于对变量执行赋值、聚合和函数调用等操作。
下表汇总了支持的操作以及操作对象。
| 操作 | 操作对象 |
|---|---|
| 赋值 | 原始值变量、聚合值变量和活动集变量 |
| 聚合 | 聚合值变量 |
| 函数调用 | 聚合值变量和表变量的成员函数 |
语法¶
- assignment_statement
- aggregation_statement
- function_call_statement
assignment_statement ::=
'SET' ( primitive_value_variable | aggregator_value_variable | active_set_variable ) '=' value_expression
aggregation_statement ::=
'SET' aggregator_value_variable '+=' value_expression
function_call_statement ::=
'SET' (aggregator_value_variable | table_variable) '.' member_function '(' ( argument (',' argument)* )? ')'
参数¶
primitive_value_variable¶
待赋值的原始值变量,变量必须在使用之前定义。关于如何定义原始值变量,请参见原始值变量。
aggregator_value_variable¶
待赋值或聚合的聚合值变量,变量必须在使用之前定义。关于如何定义聚合值变量,请参见聚合值变量。
当在聚合语句中使用时,点绑定聚合值变量支持以下两种引用语法:
node_variable.@aggregator_value_variable_name,其中node_variable是一个预先定义的变量,代表临时图中的某个点。NODE(primitive_value_variable).@aggregator_value_variable_name,其中primitive_value_variable是一个类型为INT的原始值变量,取值为临时图中某个点的系统 ID。
当在其他语句中引用时,点绑定聚合值变量仅支持第一种引用语法。
active_set_variable¶
待赋值的活动集变量,变量必须在使用之前定义。关于如何定义活动集变量,请参见活动集变量。
value_expression¶
计算结果为值或常量的值表达式,该值或常量将被赋值或聚合到变量中。更多信息,请参见值表达式。
值或常量的数据类型必须与变量所持有的值的数据类型兼容。
table_variable¶
待设置的表变量,变量必须在使用之前定义。关于如何定义表变量,请参见表变量。
member_function和argument¶
待调用的聚合值变量或表变量的成员函数及其参数。
下表列出了不同类型的变量支持的成员函数:
| 变量类型 | 支持的成员函数 |
|---|---|
| ListAgg | size()和clear() |
| SetAgg | size()、clear()和contains_key() |
| MapAgg | size()、clear()、contains_key()和get() |
| TopKAgg | size()、clear()和min() |
| 表变量 | clear() |
关于聚合值变量成员函数及其参数的更多信息,请参见相应的聚合值变量文档。
示例¶
以下示例基于在 CREATE TEMPORARY GRAPH 中创建的临时图#movie_temporary_graph。
赋值示例¶
为原始值变量赋值¶
'''
USE #movie_temporary_graph {
VALUE a INT = 1
VALUE b INT = 1
VALUE c INT = 1
SET a = a + 1
SET b = a + 2
SET c = b + 3
RETURN a, b, c
}
'''
返回:
+---+---+---+
| a | b | c |
+---+---+---+
| 2 | 4 | 7 |
+---+---+---+
为全局聚合值变量赋值¶
'''
USE #movie_temporary_graph {
VALUE a SumAgg<INT> = 0
VALUE b MaxAgg<DOUBLE> = 0.0
VALUE c OrAgg = false
SET @a = 10
SET @b = 20.5
SET @c = true
RETURN @a, @b, @c
}
'''
返回:
+----+------+------+
| @a | @b | @c |
+----+------+------+
| 10 | 20.5 | true |
+----+------+------+
为点绑定聚合值变量赋值¶
'''
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)
}
}
'''
返回:
Log:
2025-08-06T07:02:23.215245 INFO - ID_List: [271947]
2025-08-06T07:02:23.215245 INFO - ID_List: [271944]
2025-08-06T07:02:23.215245 INFO - ID_List: [282659]
2025-08-06T07:02:23.215245 INFO - ID_List: [271943]
2025-08-06T07:02:23.215245 INFO - ID_List: [271946]
2025-08-06T07:02:23.215354 INFO - ID_List: [271945]
2025-08-06T07:02:23.215354 INFO - ID_List: [271942]
2025-08-06T07:02:23.215392 INFO - ID_List: [271941]
为活动集变量赋值¶
'''
USE #movie_temporary_graph {
VALUE active_set ACTIVE_SET
VALUE list_id ListAgg<INT64>
MATCH (a@Actor) WHERE a.id IN [31, 8252]
PER NODE (a) {
// 将匹配到的点的唯一标识符(UID)添加到列表中
SET @list_id += element_id(a)
}
// 将点的 UID 列表赋值给活动集变量
SET active_set = @list_id
MATCH (a)
WHERE a IN active_set
PER NODE (a) {
LOG_INFO("Actor Name: ", a.name)
}
}
'''
返回:
Log:
2025-09-16T09:34:40.697808 INFO - Actor Name: Tom Hanks
2025-09-16T09:34:40.697808 INFO - Actor Name: William Holden
聚合示例¶
将值聚合到全局聚合值变量中¶
'''
USE #movie_temporary_graph {
VALUE global_avg AvgAgg<INT>
SET @global_avg += 3 // Average: 3.0 (Total: 3, Count: 1)
SET @global_avg += 7 // Average: 5.0 (Total: 10, Count: 2)
SET @global_avg += 5 // Average: 5.0 (Total: 15, Count: 3)
LOG_INFO("@global_avg: ",@global_avg)
}
'''
返回:
Log:
2025-09-16T09:36:54.696143 INFO - @global_avg: 5
将值聚合到点绑定聚合值变量中¶
'''
USE #movie_temporary_graph {
NODE VALUE node_avg AvgAgg<DOUBLE>
MATCH (a@User WHERE a.id IN [1,3,4])-[w@Watch]->(b@Movie)
PER PATH {
// 累加用户对观看电影的评分并计算平均值
SET a.@node_avg += w.rate
}
PER NODE (a) {
LOG_INFO("a.id: ",a.id, " a.@node_avg: ",a.@node_avg)
}
}
'''
返回:
Log:
2025-09-16T09:37:42.145639 INFO - a.id: 3 a.@node_avg: 3.75
2025-09-16T09:37:42.145639 INFO - a.id: 1 a.@node_avg: 4.77778
2025-09-16T09:37:42.145639 INFO - a.id: 4 a.@node_avg: 2.66667
函数调用示例¶
调用 clear()¶
'''
USE #movie_temporary_graph {
VALUE global_set_1 SetAgg<INT>
TABLE result_table { id, name } = (10, "new1"), (20, "new2")
SET @global_set_1 += 3 // set: {3}
SET @global_set_1 += 7 // set: {3, 7}
SET @global_set_1 += 3 // set: {3, 7} (重复值不会被添加)
SET @global_set_1 += 5 // set: {3, 7, 5}
LOG_INFO("@global_set_1: ", @global_set_1)
SET @global_set_1.clear() // set: {}
LOG_INFO("@global_set_1: ", @global_set_1)
SET result_table.clear() // 清空表
FOR rec IN result_table
RETURN rec.id, rec.name
}
'''
返回:
+--------+----------+
| rec.id | rec.name |
+--------+----------+
+--------+----------+
Log:
2026-01-16T06:53:14.956605 INFO - @global_set_1: [5,7,3]
2026-01-16T06:53:14.957146 INFO - @global_set_1: []