概述
FOR
语句展开一个列表,并相应地扩展工作表。
<for statement> ::=
"FOR" <binding variable> "IN" <list value expression> [ <ordinality or offset> ]
<ordinality or offset> ::=
"WITH" { "ORDINALITY" | "OFFSET" } <binding variable>
详情
<ordinality or offset>
定义的变量可以用来表示元素在列表中的位置:ORDINALITY
提供基于1的索引,即1、2、3……OFFSET
提供基于0的索引,即0、1、2……
<ordinality or offset>
中绑定的变量与紧跟FOR
的绑定变量名称必须不同。
展开一个简单列表
FOR item IN [1,2,3]
RETURN item
结果:
item |
---|
1 |
1 |
2 |
3 |
null |
FOR item IN [[1,2], [2,3,5]]
RETURN item
结果:
item |
---|
[1,2] |
[2,3,5] |
展开一个变量
LET user = "Alex"
LET interests = ["tennis", "violin"]
FOR interest IN interests
RETURN user, interest
结果:
user | interest |
---|---|
Alex | tennis |
Alex | violin |
此查询中,FOR
语句将工作表interests
列中的列表展开为两条记录。由此,user
列中对应的记录也复制为两条。

展开一个组变量

CREATE GRAPH myGraph {
NODE Card (),
EDGE Transfers ()-[{label string}]->()
} PARTITION BY HASH(Crc32) SHARDS [1]
INSERT (c1:Card {_id: 'C1'}),
(c2:Card {_id: 'C2'}),
(c3:Card {_id: 'C3'}),
(c4:Card {_id: 'C4'}),
(c5:Card {_id: 'C5'}),
(c1)-[:Transfers {label: 'normal'}]->(c2),
(c1)-[:Transfers {label: 'abnormal'}]->(c5),
(c5)-[:Transfers {label: 'normal'}]->(c2),
(c5)-[:Transfers {label: 'abnormal'}]->(c4),
(c2)-[:Transfers {label: 'normal'}]->(c3),
(c4)-[:Transfers {label: 'normal'}]->(c3)
获取C1
和C3
间的一条最短路径,并返回路径中边属性label
的值:
MATCH SHORTEST 1 ({_id: "C1"})-[trans:Transfers]-{1,6}({_id: "C3"})
FOR tran IN trans
RETURN tran.label
结果:
tran.label |
---|
normal |
normal |
本查询中,带量词路径中声明的变量trans
在路径模式外被引用时,代表路径中的边组成的列表,使用FOR
语句可将其展开,以便单独引用每条边。
WITH ORDINALITY
将列表中处于偶数位置的元素收集到新列表中:
FOR item in ["a", "b", "c", "d"] WITH ORDINALITY index // index从1开始
FILTER index %2 = 0
RETURN collect_list(item)
结果:
collect_list(item) |
---|
["b","d"] |
WITH OFFSET
返回列表中的第二个元素:
FOR item in ["a", "b", "c", "d"] WITH OFFSET index // index从0开始
FILTER index = 1
RETURN item
结果:
item |
---|
b |