概述
LET
语句可定义新变量,并向中间结果表添加相应列。它使用=
运算符为变量赋值。
<let statement> ::=
"LET" <let variable definition> [ { "," <let variable definition> }... ]
<let variable definition> ::=
<binding variable> "=" <value expression>
| <value variable definition>
<value variable definition> ::=
"VALUE" <binding variable> [ "TYPED" ] <value type> "=" <value expression>
详情
LET
不改变中间结果表的记录数。LET
不修改中间结果表中现有的列,除非在LET
语句内重新定义已有变量。- 无法在同一条
LET
语句中定义新变量并引用它。
示例图

CREATE GRAPH myGraph {
NODE Paper ({title string, score uint32, author string}),
EDGE Cites ()-[{}]->()
} PARTITION BY HASH(Crc32) SHARDS [1]
INSERT (p1:Paper {_id:"P1", title:'Efficient Graph Search', score:6, author:'Alex'}),
(p2:Paper {_id:"P2", title:'Optimizing Queries', score:9, author:'Alex'}),
(p3:Paper {_id:"P3", title:'Path Patterns', score:6, author:'Zack'}),
(p1)-[:Cites]->(p2),
(p2)-[:Cites]->(p3)
定义变量
LET threshold = 6
MATCH (p:Paper) WHERE p.score > threshold
RETURN p.title, p.score - threshold
结果:
p.title | p.score - threshold |
---|---|
Optimizing Queries | 3 |
定义值变量
你可以定义一个指定类型的值变量。引擎会验证所赋的值是否已经是该类型,或者是否可以安全地转换为该类型。如果该值无法转换为指定类型,系统将在运行时抛出异常。
LET VALUE x TYPED INT = 28
RETURN 28
结果:
x |
---|
28 |
这种方式可以确保查询中的类型安全,并有助于在执行过程中及早发现数据类型错误。
在LET中引用变量
如果在LET
语句中引用了某个变量,该语句将对该变量的每一条记录逐行进行计算。
本查询在LET
中引用x
,并判断其score
属性值是否大于7:
MATCH (x:Paper)
LET recommended = x.score > 7
RETURN x.title, recommended
此查询相当于:
MATCH (x:Paper)
CALL (x) {
LET recommended = x.score > 7
RETURN x, recommended
}
RETURN x.title, recommended
结果:
x.title | recommended |
---|---|
Optimizing Queries | 1 |
Efficient Graph Search | 0 |
Path Patterns | 0 |
以下查询在LET
语句中引用p
来计算每条路径的长度:
MATCH p = ()->{1,2}()
LET length = path_length(p)
RETURN p, length
结果:
p | length |
---|---|
![]() |
1 |
![]() |
1 |
![]() |
2 |