Source: https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/overview/syntax-conventions/ Documentation version: v5.3.2 # 语法标记 本文档的语法标记采用[扩展巴科斯范式(Extended Backus–Naur Form)](https://zh.wikipedia.org/wiki/%E6%89%A9%E5%B1%95%E5%B7%B4%E7%A7%91%E6%96%AF%E8%8C%83%E5%BC%8F),该范式基于一系列生成规则定义了 GQL 语法。 每条生成规则由一系列词法元素组成。语法元素分为终结符和非终结符。 - 终结符是语法的基本元素,不能通过生成规则进行更改。 - 非终结符是可以通过递归地应用生成规则将其替换为终结符的元素。 ## 终结符 终结符用英文单引号(')包围,表示符号本身。终结符可分为关键字和字面符号两类。 ### 关键字 关键字用全大写字母表示。例如: ```` for_statement ::= 'FOR' identifier 'IN' list_value_expression ```` 在上述示例中,`FOR`和`IN`是关键字。关于关键字的更多信息,请参见[关键字和标识符](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/overview/keywords-identifiers/)。 ### 字面符号 下表列举了语法中使用的字面符号: | 字面符号 | 描述 | `,` | 逗号用于分隔元素。 | `.` | 句号用于引用点的属性、边的属性、或记录的字段。更多信息,请参见[属性表达式](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/fe/expressions/property/)。 | `=` | 等号用于给变量赋值。 | `( )` | 圆括号用于包围[函数](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/fe/)的入参、包围[过程](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/procedures/)的参数、指定 [GROUP BY](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/dql/clauses/group-by/) 子句完整的结果集、或指定点类型等。 | `[ ]` | 方括号用于声明[列表类型](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/data-types/list-type/)的值或指定边类型。 | `:` | 冒号用于分隔属性的名称和值、指定点或边的标签。更多信息,请参见[图模式](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/patterns/)。 | `{ }` | 花括号用于指定[子查询](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/fe/expressions/subquery/)、指定边模式重复出现的次数、或包围多个[属性](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/fe/expressions/property/)。 | `*` | 星号的用法如下: 表示两个数值相乘。更多信息,请参见[运算符](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/fe/operators/)。 在以下场景中作为通配符: 在路径模式中,表示边模式出现零或多次。 在 [RETURN](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/dql/return/) 语句中,表示返回所有结果。 在 [count](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/fe/functions/aggregate/#count) 函数中,计算所有行数。 | `/` | 斜杠表示两个数值相除。更多信息,请参见[运算符](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/fe/operators/)。 | `%` | 百分号用于在 [like](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/fe/functions/string/#like) 函数中匹配任意字符序列,包括没有字符的情况;也可用在[时间](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/data-types/temporal-type/#_5)数据类型中指定时间格式。 | `&` | And 符号用于分隔点或边类型的多个标签。 | `@` | At 符号用于指定点或边类型。 | `\` | 反斜杠用于在字符串中转义特殊字符,或表示语句将在下一行继续输入。 | `" "` | 双引号用于包围[保留关键字](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/overview/keywords-identifiers/)或字符串。 | `' '` | 单引号用于包围字符串。 | ```` | 反引号用于包围[保留关键字](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/overview/keywords-identifiers/)。 | `!` | 感叹号表示条件的否定,或在[标签表达式](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/fe/expressions/label/)中排除某个标签。 | `+` | 加号表示两个数值的相加。更多信息,请参见[运算符](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/fe/operators/)。 | `<=` | 小于等于号用于比较两个值。更多信息,请参见[运算符](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/fe/operators/)。 | `>=` | 大于等于号用于比较两个值。更多信息,请参见[运算符](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/fe/operators/)。 | `<>` | 左右尖括号用于表示两个值不相等。更多信息,请参见[运算符](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/fe/operators/)。 | `-[]->` | 该符号表示指向右边的边,例如:`(v1)-[e]->(v2)`。 | `<-[]-` | 该符号表示指向左边的边,例如:`(v1)<-[e]-(v2)`。 | `~[]~` | 该符号表示无向边,例如:`(v1)~[e]~(v2)`。 | `~[]~>` | 该符号表示无向边或指向右边的边,例如:`(v1)~[e]~>(v2)`。 | `<~[]~` | 该符号表示无向边或指向左边的边,例如:`(v1)<~[e]~(v2)`。 | `<-[]->` | 该符号表示指向左边或右边的边,例如:`(v1)<-[e]->(v2)`。 | `-[]-` | 该符号表示任意方向的边,例如:`(v1)-[e]-(v2)`。 | `->` | 该符号表示指向右边的边,例如:`(v1)->(v2)`,或表示通过 [Lambda 表达式](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/fe/expressions/lambda/)将列表中的每个元素转换为新元素。 | `<-` | 该符号表示指向左边的边,例如:`(v1)<-(v2)`。 | `~` | 该符号表示无向边,例如:`(v1)~(v2)`。 | `~>` | 该符号表示无向边或指向右边的边,例如:`(v1)~>(v2)`。 | `<~` | 该符号表示无向边或指向左边的边,例如:`(v1)<~(v2)`。 | `<->` | 该符号表示指向左边或右边的边,例如:`(v1)<->(v2)`。 | `-` | 该符号表示任意方向的边,例如:`(v1)-(v2)`,或表示两个数值相减。更多信息,请参见[运算符](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/fe/operators/)。 ## 非终结符 非终结符是由终结符和非终结符,诸如操作符、参数和语法片段等组成的元素。 非终结符不用英文单引号(')包围。 ### 操作符 操作符定义了将终结符组合成非终结符的操作,具体如下: | 操作 | 操作符 | 描述 | 定义 | `::=` | 双冒号加等号用于分隔规则定义的元素与其定义。被定义的元素出现在运算符的左侧,定义元素的公式出现在运算符的右侧。 | 可选 | `?` | 问号用于表示元素是可选的。 | 替换 | `|` | 竖线用于分隔互为替换的元素。 | 重复 | `*` | 星号表示元素可以出现任意次数。 | 重复 | `+` | 加号表示元素可以出现一次或多次。 | 分组 | `()` | 圆括号用于元素分组。一个组内的元素可视为一个单一元素。 | 终结符 | `''` | 双引号用于包围终结符。 ### 参数 参数采用蛇形命名法表示。在写语句时,必须为每个参数指定一个值。有关参数的更多信息,请参见相应语句的参数部分。 举例: ```` 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`都是语法片段。