跳转至
开发版采用单机部署,无需产品 License 文件。需要多机部署或大规模性能测试? 了解企业版

变量操作

SET语句用于对变量执行赋值、聚合和函数调用等操作。

下表汇总了支持的操作以及操作对象。

操作 操作对象
赋值 原始值变量、聚合值变量和活动集变量
聚合 聚合值变量
函数调用 聚合值变量和表变量的成员函数

语法

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 , )

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

待赋值或聚合的聚合值变量,变量必须在使用之前定义。关于如何定义聚合值变量,请参见聚合值变量。

当在聚合语句中使用时,点绑定聚合值变量支持以下两种引用语法:

  1. node_variable.@aggregator_value_variable_name,其中node_variable是一个预先定义的变量,代表临时图中的某个点。
  2. 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: []