Source: https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/variable-definition/agg/set_agg/ Documentation version: v5.3.2 # SetAgg SetAgg 聚合值变量(`SetAgg`)将所有类型为`T`的输入聚合为不包含重复值的集合。如需聚合包含重复值的列表,请参见 [ListAgg](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/variable-definition/agg/list_agg/)。 ## 声明语法 语法图源码 set_agg_declaration ```` set_agg_declaration ::= 'NODE'? 'VALUE' aggregator_value_variable 'SetAgg' '<' ('INT8'|'INT16'|'INT32'|'INT64'|'FLOAT'|'DOUBLE'|'STRING') '>' ```` 关于声明语法中参数的详细信息,请参见[参数](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/variable-definition/agg/#_6)。 ## 初始值 从声明语法中可见,声明时不能指定初始值。 ## 输入类型与支持的操作 输入类型必须为声明时指定的类型`T`。 支持[赋值与聚合](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/set/)操作。 ## 返回类型 ```` SetAgg -> LIST ```` 返回类型为列表`LIST`,其中每个元素唯一且类型与声明时指定的类型`T`相同。 ## 成员函数 本节介绍 SetAgg 聚合值变量支持的成员函数。 ### size() 返回 SetAgg 聚合值变量中集合的元素数量。 #### 函数签名 ```` size() -> UINT64 ```` ### clear() 移除 SetAgg 聚合值变量中集合的所有元素。 #### 函数签名 ```` clear() -> VOID ```` ### contains_key() 若指定的值在 SetAgg 聚合值变量的集合中存在,则返回`true`,否则返回`false`。 #### 函数签名 ```` contains_key(value: T) -> BOOL ```` ## 示例 以下示例基于 [CREATE TEMPORARY GRAPH](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/ddl/graph-projection/create/) 中创建的临时图`#movie_temporary_graph`。 ### 全局 SetAgg 聚合值变量 ```` ''' USE #movie_temporary_graph { VALUE global_set_1 SetAgg VALUE global_set_2 SetAgg 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 = [] // 清空集合 LOG_INFO("Set from empty LIST:", @global_set_1) // 输出:[] // 用列表进行赋值 SET @global_set_1 = [1, 2, 2, 3, 1, 4] // set: {1, 2, 3, 4} LOG_INFO("Set from LIST assignment: ", @global_set_1) SET @global_set_2 += 3 // global_set_2: {3} SET @global_set_2 += 4 // global_set_2: {3,4} LOG_INFO("@global_set_2: ", @global_set_2) // 用另一个 SetAgg 进行赋值 SET @global_set_1 = @global_set_2 // global_set_1: {3,4} LOG_INFO("After assignment from set_2: ", @global_set_1) // 用另一个 SetAgg 进行聚合 SET @global_set_1 += @global_set_2 // global_set_1: {3,4} LOG_INFO("After aggregation from set_2: ", @global_set_1) // 成员函数 SET @global_set_2.clear() // 清空集合 LOG_INFO("Clear the set: ", @global_set_2) // 输出:[] LOG_INFO("Size: ", @global_set_1.size()) // 输出:4 LOG_INFO("Contains 4: ", @global_set_1.contains_key(4)) // 输出:true LOG_INFO("Contains 100: ", @global_set_1.contains_key(100)) // 输出:false } ''' ```` 返回: ```` Log: 2025-08-21T02:18:53.175811 INFO - @global_set_1: [5,7,3] 2025-08-21T02:18:53.176426 INFO - Set from empty LIST:[] 2025-08-21T02:18:53.176812 INFO - Set from LIST assignment: [4,3,2,1] 2025-08-21T02:18:53.177273 INFO - @global_set_2: [4,3] 2025-08-21T02:18:53.177556 INFO - After assignment from set_2: [3,4] 2025-08-21T02:18:53.177808 INFO - After aggregation from set_2: [3,4] 2025-08-21T02:18:53.178056 INFO - Clear the set: [] 2025-08-21T02:18:53.178199 INFO - Size: 2 2025-08-21T02:18:53.178400 INFO - Contains 4: true 2025-08-21T02:18:53.178600 INFO - Contains 100: false ```` ### 点绑定 SetAgg 聚合值变量 ```` ''' USE #movie_temporary_graph { NODE VALUE node_set SetAgg MATCH (a@User WHERE a.id IN [1,3,4])-[w@Watch]->(b@Movie) PER PATH { // 对于每条匹配的路径,将电影 ID 作为值添加到用户的集合中 SET a.@node_set += b.id } PER NODE (a) { LOG_INFO("a.id: ", a.id, " a.@node_set: ", a.@node_set) } } ''' ```` 上述示例声明了一个类型为`SetAgg`的点绑定聚合值变量`node_set`。该变量用于存储每个用户观看的电影的 ID 集合,不包含重复值。 返回: ```` Log: 2025-08-12T09:05:22.315257 INFO - a.id: 1 a.@node_set: [10,104,11,497,252,601,100,651,473] 2025-08-12T09:05:22.315257 INFO - a.id: 3 a.@node_set: [152,473] 2025-08-12T09:05:22.315257 INFO - a.id: 4 a.@node_set: [346,99,648,144,637,146,671,10,104,11,252,473] ````