NebulaGraph 查询语句概述¶
本文介绍 NebulaGraph 的通用的查询语句分类及各类语句的使用场景。
背景信息¶
NebulaGraph 的数据以点和边的形式存储。每个点可以有 0 或多个标签(Tag);每条边有且仅有一个边类型(Edge Type)。标签定义点的类型以及描述点的属性;边类型定义边的类型以及描述边的属性。在查询时,可以通过指定点的标签或边的类型来限定查询的范围。更多信息,请参见数据模型。
查询语句分类¶
NebulaGraph 的核心查询语句可分为:
FETCH PROP ON
和LOOKUP ON
更多用于基础的数据查询;GO
和MATCH
用于更复杂的查询和图数据遍历;FIND PATH
和GET SUBGRAPH
用于图数据的路径查询和子图查询;SHOW
用于获取数据库的元数据信息。
用法及使用场景¶
FETCH PROP ON¶
用法:用于获取指定点或边的属性。
场景:已知具体的点 ID 或边 ID,并想获取其属性。
说明:
- 必需指定点或边的 ID。
- 必需指定点或边所属的标签或边类型。
- 使用
YIELD
子句指定返回的属性。
示例:
FETCH PROP ON player "player100" YIELD properties(vertex);
--+--- ----+----- -------+----------
| | |
| | |
| | +--------- 返回点的 player TAG 下所有属性
| |
| +----------------- 从 "player100" 这个点获取
|
+--------------------------- 获取 player 这个 TAG 下的属性
更多信息,请参见 FETCH PROP ON。
LOOKUP ON¶
用法:用于基于索引查询点或边 ID。
场景:根据属性值查找点或边的 ID。
说明:
- 必需预先定义索引。
- 必需指定点或边所属的标签或边类型。
- 使用
YIELD
子句指定返回的 ID。
示例:
LOOKUP ON player WHERE player.name == "Tony Parker" YIELD id(vertex);
--+--- ------------------+--------------- ---+------
| | |
| | |
| | +---- 返回查到点的 VID
| |
| +------------ 过滤条件是属性 name 的值
|
+----------------------------------- 根据点的 TAG player 查询
更多信息,请参见 LOOKUP ON。
GO¶
用法:用于基于给定的点进行图遍历,按需返回起始点、边或目标点的信息。可以指定遍历的深度、边的类型、方向等。
场景:复杂的图遍历,比如找到某个点的朋友、朋友的朋友等。
说明:
- 结合属性引用符(
$^
和$$
)来返回起始点或目标点的属性,例如YIELD $^.player.name
。 - 结合函数
properties($^)
和properties($$)
来返回起始点或目标点的所有属性;或者在函数中指定属性名,来返回指定的属性,例如YIELD properties($^).name
。 - 结合函数
src(edge)
和dst(edge)
来返回边的起始点或目标点 ID,例如YIELD src(edge)
。
示例:
GO 3 STEPS FROM "player102" OVER follow YIELD dst(edge);
-----+--- --+------- -+---- ---+-----
| | | |
| | | |
| | | +--------- 返回最后一跳边的终点
| | |
| | +------ 从 follow 这个边的出方向探索
| |
| +--------------------- 起点是 "player102"
|
+---------------------------------- 探索 3 步
更多信息,请参见 GO。
MATCH¶
用法:用于执行复杂的图模式匹配查询。
场景:复杂的图模式匹配时使用,比如寻找满足特定模式的点和边的组合。
说明:
MATCH 语句兼容 OpenCypher 的语法,但是有一些差异:
- 使用
==
表达相等判断而不是=
,例如WHERE player.name == "Tony Parker"
。
- 引用点的属性时,需要指定点的标签,例如
YIELD player.name
。
- 新增
WHERE id(v) == "player100"
语法。
- 必须使用
RETURN
子句指定返回的信息。
示例:
MATCH (v:player{name:"Tim Duncan"})--(v2:player) \
RETURN v2.player.name AS Name;
更多信息,请参见 MATCH。
FIND PATH¶
用法:用于查询给定的起始点和目标点之间的所有路径;或者查询路径中的点和边的属性时使用。
场景:查询两个点之间的所有路径。
说明:必须使用YIELD
子句指定返回信息。
示例:
FIND SHORTEST PATH FROM "player102" TO "team204" OVER * YIELD path AS p;
-------+----- -------+---------------- ---+-- ----+----
| | | |
| | | |
| | | +---------- 返回路径为 p 列
| | |
| | +----------- 经由所有类型的边的出方向探索
| |
| |
| +------------------ 从给定的起点、终点 VID
|
+--------------------------- 查找最短路径
更多信息,请参见 FIND PATH。
GET SUBGRAPH¶
用法:提取满足特定条件的图的一部分;查询子图中的点和边的属性。
场景:分析图的局部结构或特定区域时非常有用,比如提取某个人的社交网络子图,或者提取某个区域的交通网络。
说明:必须使用YIELD
子句指定返回信息。
示例:
GET SUBGRAPH 5 STEPS FROM "player101" YIELD VERTICES AS nodes, EDGES AS relationships;
-----+- -----+-------- ------------------------+----------------
| | |
| | |
| +------- 从 "player101" 开始出发 +------------ 返回所有的点、边
|
+----------------- 获取 5 步的探索
更多信息,请参见 GET SUBGRAPH。
SHOW¶
SHOW 语句主要用于获取数据库的元数据信息,而不是用于获取存储在数据库中的实际数据内容。这类语句通常用于查询数据库的结构和配置,如查看现有的图空间、标签、边类型、索引等。
语句 | 语法 | 示例 | 说明 |
---|---|---|---|
SHOW CHARSET | SHOW CHARSET |
SHOW CHARSET |
显示当前的字符集。 |
SHOW COLLATION | SHOW COLLATION |
SHOW COLLATION |
显示当前的排序规则。 |
SHOW CREATE SPACE | SHOW CREATE SPACE <space_name> |
SHOW CREATE SPACE basketballplayer |
显示指定图空间的创建语句。 |
SHOW CREATE TAG/EDGE | SHOW CREATE {TAG <tag_name> | EDGE <edge_name>} |
SHOW CREATE TAG player |
显示指定 Tag/Edge type 的基本信息。 |
SHOW HOSTS | SHOW HOSTS [GRAPH | STORAGE | META] |
SHOW HOSTS SHOW HOSTS GRAPH |
显示 Graph、Storage、Meta 服务主机信息、版本信息。 |
SHOW INDEX STATUS | SHOW {TAG | EDGE} INDEX STATUS |
SHOW TAG INDEX STATUS |
重建原生索引的作业状态,以便确定重建索引是否成功。 |
SHOW INDEXES | SHOW {TAG | EDGE} INDEXES |
SHOW TAG INDEXES |
列出当前图空间内的所有 Tag 和 Edge type(包括属性)的索引。 |
SHOW PARTS | SHOW PARTS [<part_id>] |
SHOW PARTS |
显示图空间中指定分片或所有分片的信息。 |
SHOW ROLES | SHOW ROLES IN <space_name> |
SHOW ROLES in basketballplayer |
显示分配给用户的角色信息。 |
SHOW SNAPSHOTS | SHOW SNAPSHOTS |
SHOW SNAPSHOTS |
显示所有快照信息。 |
SHOW SPACES | SHOW SPACES |
SHOW SPACES |
显示现存的图空间。 |
SHOW STATS | SHOW STATS |
SHOW STATS |
显示最近STATS 作业收集的图空间统计信息。 |
SHOW TAGS/EDGES | SHOW TAGS | EDGES |
SHOW TAGS 、SHOW EDGES |
显示当前图空间内的所有 Tag/Edge type。 |
SHOW USERS | SHOW USERS |
SHOW USERS |
显示用户信息。 |
SHOW SESSIONS | SHOW SESSIONS |
SHOW SESSIONS |
显示所有会话信息。 |
SHOW SESSIONS | SHOW SESSION <Session_Id> |
SHOW SESSION 1623304491050858 |
指定会话 ID 进行查看。 |
SHOW QUERIES | SHOW [ALL] QUERIES |
SHOW QUERIES |
查看当前 Session 中正在执行的查询请求信息。 |
SHOW META LEADER | SHOW META LEADER |
SHOW META LEADER |
显示当前 Meta 集群的 leader 信息。 |
复合查询¶
NebulaGraph 的查询语句可以组合使用,以实现更复杂的查询。
复合语句中如需引用子查询的结果,需要为该结果设置别名,并使用管道符|
传递给下一个子查询,同时在下一个子查询中使用$-
引用该结果的别名。详情参见管道符。
示例:
nebula> GO FROM "player100" OVER follow \
YIELD dst(edge) AS dstid, properties($$).name AS Name | \
GO FROM $-.dstid OVER follow YIELD dst(edge);
+-------------+
| dst(EDGE) |
+-------------+
| "player100" |
| "player102" |
| "player125" |
| "player100" |
+-------------+
管道符|
仅适用于 nGQL,不适用于 OpenCypher 语句,即不能在 MATCH 语句中使用管道符。如果需要使用 MATCH 语句进行复合查询,可以使用 WITH 子句。
示例:
nebula> MATCH (v:player)-->(v2:player) \
WITH DISTINCT v2 AS v2, v2.player.age AS Age \
ORDER BY Age \
WHERE Age<25 \
RETURN v2.player.name AS Name, Age;
+----------------------+-----+
| Name | Age |
+----------------------+-----+
| "Luka Doncic" | 20 |
| "Ben Simmons" | 22 |
| "Kristaps Porzingis" | 23 |
+----------------------+-----+