语法标记¶
本文档的语法标记采用扩展巴科斯范式(Extended Backus–Naur Form),该范式基于一系列生成规则定义了 GQL 语法。
每条生成规则由一系列词法元素组成。语法元素分为终结符和非终结符。
- 终结符是语法的基本元素,不能通过生成规则进行更改。
- 非终结符是可以通过递归地应用生成规则将其替换为终结符的元素。
终结符¶
终结符用英文单引号(')包围,表示符号本身。终结符可分为关键字和字面符号两类。
关键字¶
关键字用全大写字母表示。例如:
for_statement ::=
'FOR' identifier 'IN' list_value_expression
在上述示例中,FOR和IN是关键字。关于关键字的更多信息,请参见关键字和标识符。
字面符号¶
下表列举了语法中使用的字面符号:
| 字面符号 | 描述 |
|---|---|
, |
逗号用于分隔元素。 |
. |
句号用于引用点的属性、边的属性、或记录的字段。更多信息,请参见属性表达式。 |
= |
等号用于给变量赋值。 |
( ) |
圆括号用于包围函数的入参、包围过程的参数、指定 GROUP BY 子句完整的结果集、或指定点类型等。 |
[ ] |
方括号用于声明列表类型的值或指定边类型。 |
: |
冒号用于分隔属性的名称和值、指定点或边的标签。更多信息,请参见图模式。 |
{ } |
花括号用于指定子查询、指定边模式重复出现的次数、或包围多个属性。 |
* |
星号的用法如下: 表示两个数值相乘。更多信息,请参见运算符。 在以下场景中作为通配符: 在路径模式中,表示边模式出现零或多次。 在 RETURN 语句中,表示返回所有结果。 在 count 函数中,计算所有行数。 |
/ |
斜杠表示两个数值相除。更多信息,请参见运算符。 |
% |
百分号用于在 like 函数中匹配任意字符序列,包括没有字符的情况;也可用在时间数据类型中指定时间格式。 |
& |
And 符号用于分隔点或边类型的多个标签。 |
@ |
At 符号用于指定点或边类型。 |
\ |
反斜杠用于在字符串中转义特殊字符,或表示语句将在下一行继续输入。 |
" " |
双引号用于包围保留关键字或字符串。 |
' ' |
单引号用于包围字符串。 |
`` |
反引号用于包围保留关键字。 |
! |
感叹号表示条件的否定,或在标签表达式中排除某个标签。 |
+ |
加号表示两个数值的相加。更多信息,请参见运算符。 |
<= |
小于等于号用于比较两个值。更多信息,请参见运算符。 |
>= |
大于等于号用于比较两个值。更多信息,请参见运算符。 |
<> |
左右尖括号用于表示两个值不相等。更多信息,请参见运算符。 |
-[]-> |
该符号表示指向右边的边,例如:(v1)-[e]->(v2)。 |
<-[]- |
该符号表示指向左边的边,例如:(v1)<-[e]-(v2)。 |
~[]~ |
该符号表示无向边,例如:(v1)~[e]~(v2)。 |
~[]~> |
该符号表示无向边或指向右边的边,例如:(v1)~[e]~>(v2)。 |
<~[]~ |
该符号表示无向边或指向左边的边,例如:(v1)<~[e]~(v2)。 |
<-[]-> |
该符号表示指向左边或右边的边,例如:(v1)<-[e]->(v2)。 |
-[]- |
该符号表示任意方向的边,例如:(v1)-[e]-(v2)。 |
-> |
该符号表示指向右边的边,例如:(v1)->(v2),或表示通过 Lambda 表达式将列表中的每个元素转换为新元素。 |
<- |
该符号表示指向左边的边,例如:(v1)<-(v2)。 |
~ |
该符号表示无向边,例如:(v1)~(v2)。 |
~> |
该符号表示无向边或指向右边的边,例如:(v1)~>(v2)。 |
<~ |
该符号表示无向边或指向左边的边,例如:(v1)<~(v2)。 |
<-> |
该符号表示指向左边或右边的边,例如:(v1)<->(v2)。 |
- |
该符号表示任意方向的边,例如:(v1)-(v2),或表示两个数值相减。更多信息,请参见运算符。 |
非终结符¶
非终结符是由终结符和非终结符,诸如操作符、参数和语法片段等组成的元素。
非终结符不用英文单引号(')包围。
操作符¶
操作符定义了将终结符组合成非终结符的操作,具体如下:
| 操作 | 操作符 | 描述 |
|---|---|---|
| 定义 | ::= |
双冒号加等号用于分隔规则定义的元素与其定义。被定义的元素出现在运算符的左侧,定义元素的公式出现在运算符的右侧。 |
| 可选 | ? |
问号用于表示元素是可选的。 |
| 替换 | | |
竖线用于分隔互为替换的元素。 |
| 重复 | * |
星号表示元素可以出现任意次数。 |
| 重复 | + |
加号表示元素可以出现一次或多次。 |
| 分组 | () |
圆括号用于元素分组。一个组内的元素可视为一个单一元素。 |
| 终结符 | '' |
双引号用于包围终结符。 |
参数¶
参数采用蛇形命名法表示。在写语句时,必须为每个参数指定一个值。有关参数的更多信息,请参见相应语句的参数部分。
举例:
for_statement ::=
'FOR' identifier 'IN' list_value_expression
在上述示例中,identifier和list_value_expression都是参数,实际使用FOR语句时必须为这两个参数指定值。
语法片段¶
语法片段是为了分解过长、过于复杂或重复的语法而引入的非终结符。
每个语法片段都会扩展为一段单独的语法,并在主语法中被递归引用。语法片段的名称也采用蛇形命名法。
举例:
match_statement ::=
( 'OPTIONAL' )? 'MATCH' graph_pattern graph_pattern_yield_clause?
graph_pattern ::= path_pattern ( ',' path_pattern )* ( 'WHERE' search_condition )?
...
在上述示例中,graph_pattern,graph_pattern_yield_clause,path_pattern和search_condition都是语法片段。