活动集变量¶
活动集变量用于在过程执行期间存储需要处理的点的集合。活动集变量可以被更新,以便下一步只针对这些点继续计算。
活动集变量只适用于临时图。
语法¶
- active_set_variable_definition
active_set_variable_definition ::=
'VALUE' active_set_variable '::'? 'ACTIVE_SET'
参数¶
active_set_variable¶
活动集变量的名称。active_set_variable可以是常规标识符或使用反引号(`)包围的分隔标识符。有关标识符的更多信息,请参见标识符命名规则。
用法¶
定义活动集变量后,可以为其赋值。活动集变量不能直接通过RETURN语句返回,必须结合匹配计算语句遍历其包含的点。您还可以在后续操作中更新活动集变量,以便持续追踪需要处理的点。常见的操作包括:
-
赋值:将一个点或点集合赋值给活动集变量,语法如下:
'SET' active_set_variable '=' '[' element_list ']'element_list为临时图中点的唯一标识符的列表。关于点的唯一标识符的获取,请参见 element_id()。关于赋值操作的更多信息,请参见变量操作。
-
遍历:仅对活动集变量中的点进行后续操作,语法如下:
'WHERE' n 'IN' active_set_variable表示只对
active_set_variable中的点进行后续操作。关于WHERE子句的更多信息,请参见 graph_pattern。
-
更新:修改活动集变量的点集合,有两种方式:
-
覆盖更新:用新的点集合替换活动集变量,语法如下:
'FINALLY' '{' 'SET' active_set_variable '=' d '}'
-
增量更新:将活动集变量与新的点集合合并,语法如下:
'FINALLY' '{' 'SET' active_set_variable '|=' d '}'
-
减量更新:从活动集变量中移除一组点,语法如下:
'FINALLY' '{' 'SET' active_set_variable '-=' d '}'
关于
FINALLY子句的更多信息,请参见 active_set_operation。 -
示例¶
以下示例基于 CREATE TEMPORARY GRAPH 中创建的临时图#movie_temporary_graph。
用给定点的唯一标识符为活动集变量赋值¶
以下示例给定两个点的唯一标识符(288370005093646336和288370005093646337),演示如何使用活动集变量。
"""
USE #movie_temporary_graph {
// 定义活动集变量
VALUE active_set ACTIVE_SET
// 定义聚合值变量,用于聚合后续语句的返回值
VALUE list_id ListAgg<INT64>
// 将两个点元素的唯一标识符赋值给`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<INT64>
// 匹配名为 "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<INT>
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 |
+---+