nGQL
是一种声明型的文本查询语言,目前尚在开发中。新版本会添加更多功能并优化已有功能。未来的语法规范可能会与现行的不一致。
- 易学
- 易用
- 专注线上查询,同时为离线计算提供基础
- 类 SQL,易学易用
- 可扩展
- 大小写不敏感
- 支持图遍历
- 支持模式匹配
- 支持聚合运算
- 支持图计算
- 支持分布式事务(开发中)
- 无嵌入支持组合语句,易于阅读
- 图空间:物理隔离的不同数据集
- 标签 :拥有一种或多种属性
- 每个标签都有一个人类可读的名称,并且每个标签内部都会分配一个 32 位的整数
- 每个标签与一个属性列表相关联,每个属性都有一个名称和类型
- 标签之间可存在依赖关系作为约束。例如,如果标签 S 依赖于标签 T,则除非标签 T 存在,否则标签 S 无法存在。
- 点 :图数据中代表实体的点
- 每个点都有一个唯一的 64 位(有符号整数)ID (VID)
- 一个点可以拥有多个标签
- 边:点之间的联系称为边
- 每条边由唯一数组 <src_vid, dst_vid, edge_type, rank> 标识
- 边类型 是人类可读的字符串,并且每条边内部都会分配一个 32 位的整数。边类型决定边上的属性(模式)
- 边 rank 是用户分配的不可变的 64 位带符号整数,决定两个点之间相同类型的边顺序。等级值较高的边排名靠前。如未指定,则默认等级值为零。目前的排序依据为“二进制编码顺序“:即 0, 1, 2, ... 9223372036854775807, -9223372036854775808, -9223372036854775807, ..., -1。
- 每条边只能有一种类型
- 路径: 多个点与边的非分支连接
- 路径长度为该路径上的边数,比点数少 1
- 路径可由一系列点,边类型及权重表示。一条边是一个长度为 1 的特殊路径
<vid, <edge_type, rank>, vid, ...>
不熟悉 BNF 的读者可跳过本节
- 整套语句可分为三部分:查询、更改、管理
- 每条语句均可返回一个数据集,每个数据集均包含一个 schema 和多条数据
- 语句组合有两种方式:
- 语句可使用管道函数 “|” 连接,前一条语句返回的结果可作为下一条语句的查询条件
- 支持使用 “;” 批量输入多条语句,批处理时返回最后一条语句结果
- 简单类型: vid、double、int、bool、string 和 timestamp
- vid : 64 位有符号整数,用来表示点 ID
- 一个简单的类型值可以隐式转换为列表
- 列表可以隐式转换为单列元组列表
- "<type>_list" 可用来表示列名
<simple_type> ::= vid | integer | double | float | bool | string | path | timestamp | year | month | date | datetime
<composite_type> ::=
<type> ::= <simple_type> | <composite_type>
<vid_list> ::= vid (, vid)* | "{" vid (, vid)* "}"
<label> ::= [:alpha] ([:alnum:] | "_")*
<underscore_label> ::= ("_")* <label>
<field_name> ::= <label>
<field_def_list> ::= <field_def> (, <field_def>)*
<field_def> ::= <field_name>:<type>
<tuple_list_decl> ::= <tuple_schema> ":" <tuple_data>
<tuple_schema> ::= <field_def_list>
<tuple_data> ::= <tuple> (, <tuple>)* | "{" <tuple> (, <tuple>)* "}"
<tuple> ::= "(" VALUE (, VALUE)* ")"
<var> ::= "$" <label>
Nebula Graph 支持多图空间。不同图空间的数据彼此隔离。在进行查询前,需指定图空间。
USE <graphspace_name>
返回单个值或数据集
RETURN <return_value_decl>
<return_value_decl> ::= vid | <vid_list> | <tuple_list_decl> | <var>
使用以下语句创建新标签
CREATE TAG <tag_name> (<prop_def_list>)
<tag_name> ::= <label>
<prop_def_list> ::= <prop_def>+
<prop_def> ::= <prop_name>,<type>
<prop_name> ::= <label>
使用以下语句创建新的边类型
CREATE EDGE <edge_type_name> (<prop_def_list>)
<edge_type_name> := <label>
使用以下语句插入一个或多个点
INSERT VERTEX [NO OVERWRITE] <tag_list> VALUES <vertex_list>
<tag_list> ::= <tag_name>(<prop_list>) (, <tag_name>(<prop_list>))*
<vertex_list> ::= <vertex_id>:(<prop_value_list>) (, <vertex_id>:(<prop_value_list>))*
<vertex_id> ::= vid
<prop_list> ::= <prop_name> (, <prop_name>)*
<prop_value_list> ::= VALUE (, VALUE)*
使用以下语句插入一条或多条边
INSERT EDGE [NO OVERWRITE] <edge_type_name> [(<prop_list>)] VALUES (<edge_value>)+
edge_value ::= <vertex_id> -> <vertex_id> [@ <rank>] : <prop_value_list>
使用以下语句更新点
UPDATE VERTEX <vertex_id> SET <update_decl> [WHERE <conditions>] [YIELD <field_list>]
<update_decl> ::= <update_form1> | <update_form2>
<update_form1> ::= <prop_name> = <expression> {,<prop_name> = <expression>}+
<update_form2> ::= (<prop_list>) = (<value_list>) | (<prop_list>) = <var>
使用以下语句更新边
UPDATE EDGE <vertex_id> -> <vertex_id> [@<rank>] OF <edge_type> SET <update_decl> [WHERE <conditions>] [YIELD <field_list>]
根据指定条件遍历给定点的关联点,返回点 ID 列表或数组
GO [<steps_decl> STEPS] FROM <data_set_decl> [OVER [REVERSELY] <edge_type_decl>] [WHERE <filter_list>] [YIELD <field_list>]
<data_set_decl> ::= [data_set] [[AS] <label>]
<data_set> ::= vid | <vid_list> | <tuple_list_decl> | <var>
<edge_type_decl> ::= <edge_type_list> [AS <label>]
<edge_type_list> ::= <edge_type> {, <edge_type>}*
<edge_type> ::= <label>
<filter_list> ::= <filter> {AND | OR <filter>}*
<filter> ::= <expression> > | >= | < | <= | == | != <expression> | <expression> IN <value_list>
<field_list> ::= <return_field> {, <return_field>}*
<return_field> ::= <expression> [AS <label>]
WHERE 语句仅适用于最终返回结果,对中间结果不适用。
跳过 STEP[S] 表示 一步
从起始点出发一跳,遍历所有满足WHERE 语句的关联点,只返回满足 WHERE 语句的结果。
多跳查询时,WHERE 语句只适用于最终结果,对中间结果不适用。例如:
GO 2 STEPS FROM me OVER friend WHERE birthday > "1988/1/1"
以上语句查询所有生日在 1988/1/1 之后的二度好友。
以下语句对满足筛选条件的点或边进行搜索。
FIND VERTEX WHERE <filter_list> [YIELD <field_list>]
FIND EDGE WHERE <filter_list> [YIELD <field_list>]
属性关联很常见,如 WHERE 语句和 YIELD 语句。nGQL 采用如下方式定义属性关联:
<property_ref> ::= <object> "." <prop_name>
<object> ::= <alias_name> | <alias_with_tag> | <var>
<alias_name> ::= <label>
<alias_with_tag> ::= <alias_name> '[' <tag_name> "]"
<var> 以 “$” 开始,特殊变量有两类:$- 和 $$。
所有属性名以字母开头。个别系统属性以 “_” 开头。 “_” 保留值。
- _id: 点 ID
- _type: 边类型
- _src: 边起始点 ID
- _dst: 边终点 ID
- _rank: 边 rank