FOR¶
FOR语句通过遍历的方式展开列表或表中的所有元素,使得后续语句可以逐个处理这些元素。
如果多个FOR语句级联在一起,它们将生成相应列表或表中所有元素的笛卡尔积。
语法¶
- for_statement
- for_ordinality_or_offset
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
'''
上述语句执行以下操作:
- 匹配从点
v开始到点g结束的路径p。路径p包含两个边。 - 使用
length()计算路径p的长度并赋值给sz,将点v的 ID 赋值给vid,并使用range()生成一个始于 1 ,终于路径长度p的数字列表赋值给l。 - 使用
FOR语句展开列表l并返回结果集e。 - 返回
sz、vid、l和e,不包含重复项。 - 按点
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 |
+---+-----+