Nebula Graph 查询语言 (nGQL)
nGQL 概览
nGQL
是一种声明型的文本查询语言,目前尚在开发中。新版本会添加更多功能并优化已有功能。未来的语法规范可能会与现行的不一致。
目标
- 易学
- 易用
- 专注线上查询,同时为离线计算提供基础
特点
- 类 SQL,易学易用
- 可扩展
- 大小写不敏感
- 支持图遍历
- 支持模式匹配
- 支持聚合运算
- 支持图计算
- 支持分布式事务(开发中)
- 无嵌入支持组合语句,易于阅读
术语
- 图空间:物理隔离的不同数据集
- 标签 :拥有一种或多种属性
- 每个标签都有一个人类可读的名称,并且每个标签内部都会分配一个 32 位的整数
- 每个标签与一个属性列表相关联,每个属性都有一个名称和类型
- 标签之间可存在依赖关系作为约束。例如,如果标签 S 依赖于标签 T,则除非标签 T 存在,否则标签 S 无法存在。
- 节点 :图数据中代表实体的点
- 每个节点都有一个唯一的 64 位(有符号整数)ID (VID)
- 一个节点可以拥有多个标签
- 边:节点之间的联系称为边
- 每条边由唯一数组
标识 - 边类型是人类可读的字符串,并且每条边内部都会分配一个 32 位的整数。边类型决定边上的属性(模式)
- 边权重 是用户分配的不可变的 64 位带符号整数,决定两个顶点之间的边顺序。等级值较高的边排名靠前。如未指定,则默认等级值为零。
- 每条边只能有一种类型
- 每条边由唯一数组
- 路径 : 多个节点与边的非分支连接
- 路径长度为该路径上的边数,比节点数少 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: 只适用于返回值。由元数据和数据(多行)组成 。元数据包含列名和类型。
类型转换
- -一个简单的类型值可以隐式转换为列表
- -列表可以隐式转换为单列元组列表
- “
_list” 可用来表示列名
- “
常用 BNF
::= “$”
查询语句
选择图空间
Nebula Graph 支持多图空间。不同图空间的数据彼此隔离。在进行查询前,需指定图空间。
USE
返回数据集
返回单个值或数据集
RETURN
创建标签
使用以下语句创建新标签
CREATE TAG
创建边类型
使用以下语句创建新的边类型
CREATE EDGE
插入节点
使用以下语句插入一个或多个节点
INSERT VERTEX [NO OVERWRITE]
插入边
使用以下语句插入一条或多条边
INSERT EDGE [NO OVERWRITE]
edge_value ::=
更新节点
使用以下语句更新节点
UPDATE VERTEX
更新边
使用以下语句更新边
UPDATE EDGE
图遍历
根据指定条件遍历给定节点的关联节点,返回节点 ID 列表或数组
GO[
WHERE 语句仅适用于最终返回结果,对中间结果不适用。
跳过 STEP[S] 表示 一步
从起始点出发一跳,遍历所有满足WHERE 语句的关联点,只返回满足 WHERE 语句的结果。
多跳查询时,WHERE 语句只适用于最终结果,对中间结果不适用。例如:
GO 2 STEPS FROM me OVER friend WHERE birthday > "1988/1/1"
以上语句查询所有生日在 1988/1/1 之后的二度好友。
又例如:
GO UPTO 3 STEPS FROM me OVER friend WHERE birthday > "1988/1/1/"
以上语句查询所有生日在 1988/1/1 之后的好友,最多查询为 3 度。如果只查询到一条,则会全部返回。如果没有满足条件的数据,则查询 2 度好友,如果还是没有则查询 3 度。
以下语句查询生日在 1988/1/1 之后的3 度 至 5 度好友。
GO 3 TO 5 STEPS FROM me OVER friend WHERE birthday > "1988/1/1/"
搜索
以下语句对满足筛选条件的节点或边进行搜索。
FIND VERTEXWHERE
FIND EDGEWHERE
属性关联
属性关联很常见,如 WHERE 语句和 YIELD 语句。nGQL 采用如下方式定义属性关联:
以 “$” 开始,特殊变量有两类:$- 和 $$。
$- 为输入值, $$ 为目标值。
所有属性名以字母开头。个别系统属性以 “_“ 开头。 “_“ 保留值。
内建属性
_id : 节点 ID_type : 边类型_src : 边起始点 ID_dst : 边终点 ID_rank : 权重值