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

活动集变量

活动集变量用于在过程执行期间存储需要处理的点的集合。活动集变量可以被更新,以便下一步只针对这些点继续计算。

活动集变量只适用于临时图。

语法

active_set_variable_definition
VALUE active_set_variable :: ACTIVE_SET

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 |
+---+