Source: https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/variable-definition/active-set-variable/ Documentation version: v5.3.2 # 活动集变量 活动集变量用于在过程执行期间存储需要处理的点的集合。活动集变量可以被更新,以便下一步只针对这些点继续计算。 活动集变量只适用于[临时图](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/ddl/graph-projection/create/)。 ## 语法 语法图源码 active_set_variable_definition ```` active_set_variable_definition ::= 'VALUE' active_set_variable '::'? 'ACTIVE_SET' ```` ## 参数 ### `active_set_variable` 活动集变量的名称。`active_set_variable`可以是常规标识符或使用反引号(```)包围的分隔标识符。有关标识符的更多信息,请参见[标识符命名规则](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/overview/keywords-identifiers/#_3)。 ## 用法 定义活动集变量后,可以为其赋值。活动集变量不能直接通过`RETURN`语句返回,必须结合[匹配计算语句](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/match-compute/)遍历其包含的点。您还可以在后续操作中更新活动集变量,以便持续追踪需要处理的点。常见的操作包括: - 赋值:将一个点或点集合赋值给活动集变量,语法如下: ```` 'SET' active_set_variable '=' '[' element_list ']' ```` `element_list`为临时图中点的唯一标识符的列表。关于点的唯一标识符的获取,请参见 [element_id()](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/fe/functions/graph/#element_id)。 关于赋值操作的更多信息,请参见[变量操作](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/set/)。 - 遍历:仅对活动集变量中的点进行后续操作,语法如下: ```` 'WHERE' n 'IN' active_set_variable ```` 表示只对`active_set_variable`中的点进行后续操作。关于`WHERE`子句的更多信息,请参见 [graph_pattern](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/match-compute/#graph_pattern)。 - 更新:修改活动集变量的点集合,有两种方式: - 覆盖更新:用新的点集合替换活动集变量,语法如下: ```` 'FINALLY' '{' 'SET' active_set_variable '=' d '}' ```` - 增量更新:将活动集变量与新的点集合合并,语法如下: ```` 'FINALLY' '{' 'SET' active_set_variable '|=' d '}' ```` - 减量更新:从活动集变量中移除一组点,语法如下: ```` 'FINALLY' '{' 'SET' active_set_variable '-=' d '}' ```` 关于`FINALLY`子句的更多信息,请参见 [active_set_operation](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/match-compute/#active_set_operation)。 ## 示例 以下示例基于 [CREATE TEMPORARY GRAPH](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/ddl/graph-projection/create/) 中创建的临时图`#movie_temporary_graph`。 ### 用给定点的唯一标识符为活动集变量赋值 以下示例给定两个点的唯一标识符(`288370005093646336`和`288370005093646337`),演示如何使用活动集变量。 ```` """ USE #movie_temporary_graph { // 定义活动集变量 VALUE active_set ACTIVE_SET // 定义聚合值变量,用于聚合后续语句的返回值 VALUE list_id ListAgg // 将两个点元素的唯一标识符赋值给`active_set` SET active_set = [288370005093646336, 288370005093646337] // 从活动集中的每个点出发,匹配其相邻点, // 将活动集中的点的 ID 添加到 list_id 列表中 MATCH (v) - (t) WHERE v IN active_set PER NODE (v) { SET @list_id += v.id } // 更新活动集为相邻点 FINALLY { SET active_set = t } // 匹配更新后的活动集中的点 MATCH (n) WHERE n IN active_set PER NODE (n) { // 将匹配到的点的 ID 添加到 list_id 列表中 SET @list_id += n.id } // 返回 list_id 列表中的所有点 ID,命名为 ids RETURN @list_id AS ids } """ ```` 返回: ```` +----------------------+ | ids | +----------------------+ | [2139,74614,557,187] | +----------------------+ ```` ### 用动态获取的点的唯一标识符为活动集变量赋值 以下示例演示如何动态获取点的唯一标识符,并将其赋值给活动集变量,然后使用活动集变量。 ```` """ USE #movie_temporary_graph { // 定义活动集变量 VALUE active_set ACTIVE_SET // 定义聚合值变量 VALUE list_id ListAgg // 匹配名为 "Tom Hanks" 或 "William Holden" 的点 MATCH (a) WHERE a.name = "Tom Hanks" OR a.name = "William Holden" PER NODE (a) { // 将匹配到的点的 element_id 添加到 list_id 列表中 SET @list_id += element_id(a) } // 将 list_id 列表赋值给活动集变量 active_set SET active_set = @list_id // 清空 list_id 列表,以便后续使用 SET @list_id.clear() // 从活动集中的每个点出发,匹配其相邻点 MATCH (v) - (t) WHERE v IN active_set PER NODE (v) { // 将匹配到的点的 ID 添加到 list_id 列表中 SET @list_id += v.id } // 更新活动集为匹配到的相邻点 FINALLY { SET active_set = t } // 匹配更新后的活动集中的点 MATCH (n) WHERE n IN active_set PER NODE (n) { // 将匹配到的点的 ID 添加到 list_id 列表中 SET @list_id += n.id } // 返回 list_id 列表中的所有点 ID,命名为 ids RETURN @list_id AS ids } """ ```` 返回: ```` +-------------------+ | ids | +-------------------+ | [31,8252,599,497] | +-------------------+ ```` ### 增量更新和减量更新活动集变量 ```` """ USE #movie_temporary_graph { VALUE active_set ACTIVE_SET VALUE ids ListAgg MATCH (s1@User) WHERE s1.id in [1,3,4,5] FINALLY { // 增量更新活动集变量,将 id 为 1、3、4、5 的点加入活动集变量 SET active_set |= s1 } MATCH (s2@User) WHERE s2.id in [1,3] FINALLY { // 减量更新活动集变量,将 id 为 1 和 3 的点从活动集变量中移除 SET active_set -= s2 } MATCH (s) WHERE s IN active_set PER NODE (s) { SET @ids += s.id } FOR r IN @ids RETURN r } """ ```` 返回: ```` +---+ | r | +---+ | 4 | | 5 | +---+ ````