Nebula Graph 查询语言 (nGQL)

nGQL 概览

nGQL 是一种声明型的文本查询语言,目前尚在开发中。新版本会添加更多功能并优化已有功能。未来的语法规范可能会与现行的不一致。

目标

  • 易学
  • 易用
  • 专注线上查询,同时为离线计算提供基础

特点

  • 类 SQL,易学易用
  • 可扩展
  • 大小写不敏感
  • 支持图遍历
  • 支持模式匹配
  • 支持聚合运算
  • 支持图计算
  • 支持分布式事务(开发中)
  • 无嵌入支持组合语句,易于阅读

术语

  • 图空间:物理隔离的不同数据集
  • 标签 :拥有一种或多种属性
    • 每个标签都有一个人类可读的名称,并且每个标签内部都会分配一个 32 位的整数
    • 每个标签与一个属性列表相关联,每个属性都有一个名称和类型
    • 标签之间可存在依赖关系作为约束。例如,如果标签 S 依赖于标签 T,则除非标签 T 存在,否则标签 S 无法存在。
  • 节点 :图数据中代表实体的点
    • 每个节点都有一个唯一的 64 位(有符号整数)ID (VID)
    • 一个节点可以拥有多个标签
  • 边:节点之间的联系称为边
    • 每条边由唯一数组 标识
    • 边类型 是人类可读的字符串,并且每条边内部都会分配一个 32 位的整数。边类型决定边上的属性(模式)
    • 边 ranking 是用户分配的不可变的 64 位带符号整数,决定两个顶点之间的边顺序。等级值较高的边排名靠前。如未指定,则默认等级值为零。
    • 每条边只能有一种类型
  • 路径 : 多个节点与边的非分支连接
    • 路径长度为该路径上的边数,比节点数少 1
    • 路径可由一系列节点,边类型及权重表示。一条边是一个长度为 1 的特殊路径
  1. <vid, <edge_type, rank>, vid, ...>

查询语言规则概览

不熟悉 BNF 的读者可跳过本节

总览

  • 整套语句可分为三部分:查询、更改、管理
  • 每条语句均可返回一个数据集,每个数据集均包含一个 schema 和多条数据

语句组合

  • 语句组合有两种方式:
    • 语句可使用管道函数 “|” 连接,前一条语句返回的结果可作为下一条语句的查询条件
    • 支持使用 “;” 批量输入多条语句,批处理时返回最后一条语句结果

数据类型

  • 简单类型: vid、double、int、bool、string 和 timestamp
  • vid : 64 位有符号整数,用来表示点 ID
  • 简单类型列表,如: integer[], double[], string[]
  • Map: 键值对列表。键类型必须为 字符,值类型必须与给定 map
  • Object (未来版本支持): 键值对列表。键类型必须为字符,值可以是任意简单类型
  • Tuple List: 只适用于返回值。由元数据和数据(多行)组成 。元数据包含列名和类型。

类型转换

  • 一个简单的类型值可以隐式转换为列表
  • 列表可以隐式转换为单列元组列表
    • <type>_list 可用来表示列名

常用 BNF

  1. ::= vid | integer | double | float | bool | string | path | timestamp | year | month | date | datetime
  2. ::=
  3. <type> ::= |
  4. ::= vid (, vid) | "{" vid (, vid) "}"
  5. <label> ::= [:alpha] ([:alnum:] | "_")
  6. ::= ("_") <label>
  7. ::= <label>
  8. ::= (, )
  9. ::= :<type>
  10. ::= ":"
  11. ::=
  12. ::= <tuple> (, <tuple>) | "{" <tuple> (, <tuple>) "}"
  13. <tuple> ::= "(" VALUE (, VALUE) ")"
  14. <var> ::= "$" <label>

查询语句

选择图空间

Nebula Graph 支持多图空间。不同图空间的数据彼此隔离。在进行查询前,需指定图空间。

USE

返回数据集

返回单个值或数据集

  1. RETURN
  2. ::= vid | | | <var>

创建标签

使用以下语句创建新标签

  1. CREATE TAG ()
  2. ::= <label>
  3. ::= +
  4. ::= ,<type>
  5. ::= <label>

创建边类型

使用以下语句创建新的边类型

  1. CREATE EDGE ()
  2. := <label>

插入节点

使用以下语句插入一个或多个节点

INSERT VERTEX [NO OVERWRITE] VALUES

  1. ::= () (, ())
  2. ::= :() (, :())
  3. ::= vid
  4. ::= (, )
  5. ::= VALUE (, VALUE)

插入边

使用以下语句插入一条或多条边

  1. INSERT EDGE [NO OVERWRITE] [()] VALUES ()+
  2. edge_value ::= -> [@ <weight>] :

更新节点

使用以下语句更新节点

  1. UPDATE VERTEX SET <update_decl> [WHERE <conditions>] [YIELD ]
  2. ::= |
  3. ::= = <expression> {, = <expression>}+
  4. ::= () = () | () = <var>

更新边

使用以下语句更新边

  1. UPDATE EDGE -> [@<weight>] OF SET [WHERE <conditions>] [YIELD ]

图遍历

根据指定条件遍历给定节点的关联节点,返回节点 ID 列表或数组

  1. GO [ STEPS] FROM [OVER [REVERSELY] ] [WHERE ] [YIELD ]
  2. ::= [data_set] [[AS] <label>]
  3. ::= vid | | | <var>
  4. ::= [AS <label>] ::= {, }
  5. ::= <label>
  6. ::= <filter> {AND | OR <filter>}
  7. ::= > | >= | < | <= | == | != <expression> | <expression> IN <value_list>
  8. ::= {, }
  9. ::= <expression> [AS <label>]

WHERE 语句仅适用于最终返回结果,对中间结果不适用。

跳过 STEP[S] 表示 一步

从起始点出发一跳,遍历所有满足WHERE 语句的关联点,只返回满足 WHERE 语句的结果。

多跳查询时,WHERE 语句只适用于最终结果,对中间结果不适用。例如:

  1. GO 2 STEPS FROM me OVER friend WHERE birthday > "1988/1/1"

以上语句查询所有生日在 1988/1/1 之后的二度好友。

搜索

以下语句对满足筛选条件的节点或边进行搜索。

  1. FIND VERTEX WHERE [YIELD ]
  2. FIND EDGE WHERE [YIELD ]

属性关联

属性关联很常见,如 WHERE 语句和 YIELD 语句。nGQL 采用如下方式定义属性关联:

  1. ::= <object> "."
  2. <object> ::= | | <var>
  3. ::= <label>
  4. ::= '[' "]"

<var> 以 “$” 开始,特殊变量有两类:$- 和 $$。

$- 为输入值, $$ 为目标值。

所有属性名以字母开头。个别系统属性以 “_” 开头。 “_” 保留值。

内建属性

_id: 节点 ID _type: 边类型 _src: 边起始点 ID _dst: 边终点 ID _rank: 边 ranking