跳转至

NebulaGraph 查询语句概述

本文介绍 NebulaGraph 的通用的查询语句分类及各类语句的使用场景。

背景信息

NebulaGraph 的数据以点和边的形式存储。每个点可以有 0 或多个标签(Tag);每条边有且仅有一个边类型(Edge Type)。标签定义点的类型以及描述点的属性;边类型定义边的类型以及描述边的属性。在查询时,可以通过指定点的标签或边的类型来限定查询的范围。更多信息,请参见数据模型

查询语句分类

NebulaGraph 的核心查询语句可分为:

FETCH PROP ONLOOKUP ON更多用于基础的数据查询;GOMATCH用于更复杂的查询和图数据遍历;FIND PATHGET 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 TAGSSHOW 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  |
+----------------------+-----+

更多信息


最后更新: April 19, 2024