跳转至
开发版采用单机部署,无需产品 License 文件。需要多机部署或大规模性能测试? 了解企业版

语法标记

本文档的语法标记采用扩展巴科斯范式(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都是语法片段。