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

FOR

FOR语句通过遍历的方式展开列表或表中的所有元素,使得后续语句可以逐个处理这些元素。

如果多个FOR语句级联在一起,它们将生成相应列表或表中所有元素的笛卡尔积。

语法

for_statement
FOR variable_name IN list_value_expression || table_reference_value_expression for_ordinality_or_offset
for_ordinality_or_offset
WITH ORDINALITY WITH OFFSET index_variable_name

for_statement ::=
        'FOR' variable_name 'IN' ( list_value_expression ('||' list_value_expression)* | table_reference_value_expression ) for_ordinality_or_offset?

for_ordinality_or_offset ::=
        ('WITH ORDINALITY' | 'WITH OFFSET') index_variable_name

参数

variable_name

在遍历过程中指代列表或表中每个元素的变量名称。variable_name可以是常规标识符或使用反引号(`)包围的分隔标识符。有关标识符的更多信息,请参见标识符命名规则。

list_value_expression

计算结果为列表或列表的引用的值表达式。可以是变量、函数调用或任何计算结果为列表的表达式。

更多信息,请参见列表类型、列表函数和构造表达式。

||

用于将多个列表合并为一个列表的连接运算符。

table_reference_value_expression

计算结果为表的引用的值表达式,例如表变量。

for_ordinality_or_offset

用于在迭代期间为每个元素添加位置索引的可选子句。

WITH ORDINALITY

为列表或表中的每个元素返回基于 1 (从 1 开始)的索引的子句。

WITH OFFSET

为列表或表中的每个元素返回基于 0 (从 0 开始)的索引的子句。

index_variable_name

索引变量的名称,用于在迭代过程中保存当前元素的序号。

index_variable_name可以是常规标识符或使用反引号(`)包围的分隔标识符。有关标识符的更多信息,请参见标识符命名规则。

index_variable_name不能与variable_name相同。

示例

以下示例基于示例数据集。

展开列表

'''
LET l = list[1, 2, 3] 
FOR e IN l 
RETURN e
'''

上述语句展开列表l并返回结果集e。

返回:

+---+
| e |
+---+
| 1 |
| 2 |
| 3 |
+---+

展开嵌套列表

'''
LET ll = list[list[1, 2, 3], list[4, 5, 6]] 
FOR l IN ll 
FOR e IN l 
RETURN e
'''

上述语句首先展开嵌套列表ll,返回结果集l。然后展开列表l,返回结果集e。

返回:

+---+
| e |
+---+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
+---+

展开两个列表

'''
LET l1 = list[1, 2, 3], l2 = list[4, 5, 6] 
FOR e1 IN l1 
FOR e2 IN l2 
RETURN e1, e2
'''

上述语句展开列表l1,返回结果集e1。然后展开列表l2,返回结果集e2。结果集e1和e2使用笛卡尔积进行组合。

返回:

+----+----+
| e1 | e2 |
+----+----+
| 1  | 4  |
| 1  | 5  |
| 1  | 6  |
| 2  | 4  |
| 2  | 5  |
| 2  | 6  |
| 3  | 4  |
| 3  | 5  |
| 3  | 6  |
+----+----+

展开由函数返回的列表

'''
USE movie 
MATCH p =  (v@Actor)-[]->(f@Movie{name:"Wilbur Wants to Kill Himself"})-[]->(g@Genre) 
LET sz = length(p), vid = v.id, l = range(1, length(p)) 
FOR e IN l 
RETURN DISTINCT sz, vid, l, e 
ORDER BY vid 
LIMIT 6
'''

上述语句执行以下操作:

  1. 匹配从点v开始到点g结束的路径p。路径p包含两个边。
  2. 使用length()计算路径p的长度并赋值给sz,将点v的 ID 赋值给vid,并使用range()生成一个始于 1 ,终于路径长度p的数字列表赋值给l。
  3. 使用FOR语句展开列表l并返回结果集e。
  4. 返回sz、vid、l和e,不包含重复项。
  5. 按点v的 ID 对结果集进行排序,并将结果集限制为 6 行。

返回:

+----+------+-------+---+
| sz | vid  | l     | e |
+----+------+-------+---+
| 2  | 1019 | [1,2] | 2 |
| 2  | 1019 | [1,2] | 1 |
| 2  | 1643 | [1,2] | 1 |
| 2  | 1643 | [1,2] | 2 |
| 2  | 1833 | [1,2] | 2 |
| 2  | 1833 | [1,2] | 1 |
+----+------+-------+---+

展开两个由||连接的列表

'''
LET l1 = list[1, 2, 3], l2 = trim(list[4, 5, 6, 7], 2) 
FOR e IN l1 || l2 
RETURN e
'''

返回:

+---+
| e |
+---+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
+---+

展开表格

'''
TABLE t { id, name, birthDate } =  
    ( 10001, 'Alice', DATE '1990-01-01' ),  
    ( 10002, 'Bob', DATE '1991-02-02' ),  
    ( 10003, 'Charlie', DATE '1992-03-03' ) 
FOR e IN t 
RETURN e.id, e.name, e.birthDate
'''

返回:

+-------+---------+-------------+
| e.id  | e.name  | e.birthDate |
+-------+---------+-------------+
| 10001 | Alice   | 1990-01-01  |
| 10002 | Bob     | 1991-02-02  |
| 10003 | Charlie | 1992-03-03  |
+-------+---------+-------------+

展开列表并返回从 1 开始的索引

'''
LET l=list[10, 20, 30] 
FOR e IN l WITH ORDINALITY idx 
RETURN e, idx
'''

返回:

+----+-----+
| e  | idx |
+----+-----+
| 10 | 1   |
| 20 | 2   |
| 30 | 3   |
+----+-----+

展开列表并返回从 0 开始的索引

'''
FOR i IN range(1, 10239) WITH OFFSET idx
RETURN i, idx
ORDER BY i ASC 
LIMIT 5
'''

返回:

+---+-----+
| i | idx |
+---+-----+
| 1 | 0   |
| 2 | 1   |
| 3 | 2   |
| 4 | 3   |
| 5 | 4   |
+---+-----+