LET#
GQL clause Added in 2.18
Adds computed values to the working record without dropping columns already in
scope. It is the GQL-standard counterpart to Cypher’s WITH *, expr AS v.
Synopsis#
bold keywords · italic placeholders you supply · [ ] optional · ... repeatable. See Syntax conventions.
Description#
LET introduces one or more new variables into the current row, computed from
expressions over variables already in scope. Unlike WITH, it is additive:
every binding in scope is carried forward automatically, so LET can never
accidentally drop a variable from the pipeline.
Each variable is introduce-only. A name already in scope cannot be rebound, inside the body of a subquery expression or of an importing
CALL { }as much as at the top level.Expressions are evaluated row-by-row; aggregates are not allowed.
LETmay lead a query or sit in the middle, but cannot terminate one. It is the clause to open a statement with, becauseWITHin that position is SQL’s common table expression.
Parameters#
- variable
Name of the new binding. Must not already be in scope. Visible to every clause that follows.
- expression
Any row-wise value expression: property access, arithmetic, function calls,
CASE, list/map constructors. Evaluated once per input row.
Examples#
These examples run against the example dataset.
Add a derived value and keep everything in scope#
The GQL and Cypher forms are equivalent. Switch tabs to compare:
MATCH (p:person)
LET age_in_2026 = 2026 - p.born
RETURN p.name AS name, age_in_2026
ORDER BY age_in_2026 LIMIT 3;
MATCH (p:person)
WITH *, 2026 - p.born AS age_in_2026
RETURN p.name AS name, age_in_2026
ORDER BY age_in_2026 LIMIT 3;
name | age_in_2026
-------------------+-------------
"Ryan Gosling" | 46
"Neill Blomkamp" | 47
"Sam Worthington" | 50
(3 rows)
The difference is what happens to p. LET carries it forward automatically.
The WITH form has to ask for it with *, and a WITH that forgets the *
drops p, so the RETURN then fails.
Lead a query with computed values#
Because LET is additive it can open a statement, seeding values with nothing yet in scope:
LET radius = 7, area = 3.14159 * 7 * 7
RETURN radius, area;
radius | area
--------+-----------
7 | 153.93791
(1 row)
Introduce-only#
A name already in scope cannot be rebound:
MATCH (p:person) LET p = 1 RETURN p;
ERROR: variable "p" already exists
HINT: LET cannot redefine an existing variable; use a different name.
GQL conformance
Implements the GQL LET statement (ISO/IEC 39075:2024 §14.7).
Supported — variable definition, multiple bindings, leading position, and row-wise expressions.
Not supported —
LETover aggregate expressions. Track status in the conformance matrix.
Note
LET became a reserved keyword in 2.18. If you used let as a label or
variable name in an earlier version, quote it ("let" — double quotes, not
backticks) or rename it. Property
keys and RETURN aliases are unaffected.