本文旨在让新手快速了解 nGQL,掌握方向,之后可以脚踩在地上借助文档写出任何心中的 NebulaGraph 图查询。

视频

本教程的视频版在B站这里

准备工作

在正式开始 nGQL 实操之前,记得先看过文档「快速入门流程」,部署、连接过 NebulaGraph,并且看过了「常用命令」。如果你还没看过这两个文档,为了跟上进度,记得先快速过一遍,上面两个文档链接可在文末「参考资料」中获取。

我们的目标是

本教程目的在于让大家大概知道了 NebulaGraph 的查询语句后,解决“不知道什么样的查询应该用什么语句”的问题。

nGQL 是什么

我们先强调一下概念:nGQL 是 NebulaGraph Query Language 的缩写,它表示 NebulaGraph 的查询语言,可以不严谨地分为这 5 部分:

  • NebulaGraph 独有 DQL(Data Query Language)查询语句
  • NebulaGraph openCypher DQL
  • NebulaGraph DML(Data Mutation Language)写语句
  • NebulaGraph DDL(Data Definition Language) Schema 语句
  • NebulaGraph Admin Queries 管理语句

这里,作为简明教程一把梭,我们只关注前两个部分,后边的内容会在 Part 2 中介绍。

nGQL 速查表 cheatsheet

大家可以保存下这份单页速查表,一次了解所有 nGQL 的用法。

NebulaGraph 独有 DQL

NebulaGraph 的独有读查询语句的设计非常简洁,对初学者非常友好。它结合了管道的概念,做到了只涉及了几个关键词就可以描述出大多数的图查询模式。由于篇幅的问题,所有 DQL 查询语句的更多用法记得查阅本文的「参考资料」

简单来说,nGQL 的独有 DQL 一共分成四类语句:

  • 图拓展 / 遍历:GO
  • 索引反查:LOOKUP
  • 取属性:FETCH
  • 路径与子图:FIND PATHGET SUBGRAPH

和两个特别的元素:

  • 管道:|
  • 引用属性: $ 开头的几个符号,用来描述一些特定的上下文

用 GO 来图拓展 / 遍历

GO 的语义非常直观:从给定的起点,向外拓展,按需返回终点、起点的信息。

# 图拓展
GO 3 STEPS FROM "player102" OVER follow YIELD dst(edge);
───┬─── ───┬─────── ─┬──── ──┬──────
│ │ │ ┌─────────┘
│ │ │ │
│ │ │ └── 返回最后一跳边的终点
│ │ │
│ │ └────── 从 follow 这个边[出方向]探索
│ │
│ └───────────────────── 起点是 "player102"

└────────────────────────────────── 探索 3 步

这里只是做了一个简单的 GO 语法示例,像 GO 实现的反向、双向拓展,指定可变跳数遍历等,更多 GO 语句用法可查阅参考资料。

LOOKUP 基于索引反查 ID

GO 的从已知的点出发相反,LOOKUP 是一个类似于 SQL 里 SELECT 语义的关键字,它实际的作用也类似与关系型数据库中的扫表

LOOKUP 需要手动创建相应 TAG、边类型上索引才能进行相关查询

为什么 LOOKUP 需要索引?

因为 NebulaGraph 中的数据默认是按照邻接表的形式存储,在分布式设计中,扫描一个类型的点、边是非常昂贵的,所以它被默认禁止了。NebulaGraph 索引的存在增加了类似于表结构数据库的排序数据,可以用来做像是 SELECT 的查询。

# 索引反查
LOOKUP ON player WHERE player.name == "Tony Parker" YIELD id(vertex);
──┬─── ──────┬────────────────────────── ──┬──────
│ │ ┌───────────────────┘
│ │ │
│ │ └──────────── 返回查到点的 VID
│ │
│ └─────────────────────── 过滤条件是属性 name 的值

└─────────────────────────────────── 根据点的类别/TAG player 查询

本文仅作 LOOKUP 语法的使用入门,关于索引原理和使用,比如:创建索引会有什么代价?索引会加速读么?记得查看文末的参考资料。

FETCH PROP 获取属性

如字面意思,如果我们知道一个点、边的 ID,想要获取它上边的属性,这时候我们要用 FETCH PROP 而非 LOOKUP

# 取属性
FETCH PROP ON player "player100" YIELD properties(vertex);
──┬─── ────┬───── ─────────┬────────
│ │ ┌───────────┘
│ │ │
│ │ └─────── 返回点的 player TAG 下所有属性
│ │
│ └───────────────── 从 "player100" 这个点获取

└─────────────────────────── 获取 player 这个 TAG 下的属性

路径查找 FIND PATH

如果我们要找到指定两点之间的所有路径,一定要用 FIND PATH

# 起点终点间路径
FIND SHORTEST PATH FROM "player102" TO "team204" OVER * \
──┬───── ───────────┬─────────── ───┬───
YIELD│path AS p; ┌────────────────┘ │
│────┬──── │ ┌──────────────────────────┘
│ │ │ │
│ │ │ └───────── 经由所有类型的边出向探索
│ │ │
│ │ └─────────────── 从给定的起点、终点 VID
│ │
│ └────────────────────── 返回路径为 p 列

└─────────────────────────── 查找最短路径

单点子图 GET SUBGRAPH

和路径查找类似,如果我们只给定一个起点和拓展步数,用 GET SUBGRAPH 可以帮我们获取同样的 BFS 出去的子图。

# 单点 BFS 子图

GET SUBGRAPH 5 STEPS FROM "player101" \
───┬─── ─────┬──────────
YIELD VERTICES AS nodes, EDGES AS relationships;
────┬───┼─────────┼───────────────────────
┌────────┘ │ │
│ │ └─────── 从 "player101" 开始触发
│ │
│ └───────────────── 获取 5 步的探索

└────────────────────────────── 返回所有的点、边

利用管道和属性引用符

NebulaGraph 的管道设计和 Unix-Shell 的设计很像,可以将简单的几种语句结合起来,有强大的表达力。

# 使用通道
GO FROM "player100" OVER follow YIELD dst(edge) AS did | \
─────┬──────────────────────────────────────────── ─┬─
GO FROM│$-.did OVER follow YIELD dst(edge); │
│────┬── ┌─────────────────────────────────┘
│ │ │
│ │ └──────── 管道将左边的 AS 输出作为右边语句输入
│ │
│ └──────────────── 从管道左边的 did 属性开始探索

└───────────────────── 第一个查询语句

除了以上的集中表达之外,NebulaGraph 独有查询语句还有聚合的表达参考 GROUP-BY,另外在文档里还有一个 Cheatsheet供大家查询一些复杂的例子。

NebulaGraph openCypher DQL

从 NebulaGraph v2.0 起,openCypher 的 MATCH 语句也被 NebulaGraph 原生支持了。虽然 NebulaGraph 这里是一个“方言”,有一些使用细节差异。

MATCH <pattern> [<clause_1>] RETURN <output>  [<clause_2>];

MATCH 的基本表达是由 (v:tag_a) 包裹的点和 --> 或者 <-[:edge_type_1]- 表达的边组成的模式,再与 RETURN 结合表达输出。

如果你从 Cypher 的查询语言入门图数据库,可以从下边几个例子了解到若干 NebulaGraph 里的使用细节差异:

  • 增加了 WHERE id(v) == "foo" 的表达;
  • == 表达相等判断而不是 =
  • 点的属性表达需要填写 TAG,例如 v3.player.name 而不是 v3.name
MATCH (v:`player`{name:"Tim Duncan"})-->(v2)<--(v3) \
RETURN v3.`player`.name AS Name; MATCH (v:`player`) \
WHERE NOT (v)--() \
RETURN v; MATCH (v:`player`)--(v2) \
WHERE id(v2) IN ["player101", "player102"] \
RETURN v; MATCH (m)-[]->(n) WHERE id(m)=="player100" \
OPTIONAL MATCH (n)-[]->(l) WHERE id(n)=="player125" \
RETURN id(m), id(n), id(l);

以上,为本次简明教程的第一集。

参考资料


谢谢你读完本文 (///▽///)

免部署省时省力,现在可以用用 NebulaGraph Cloud 来搭建自己的图数据系统哟~NebulaGraph 阿里云计算巢现 30 天免费使用中,点击链接来用用图数据库吧~

想看源码的小伙伴可以前往 GitHub 阅读、使用、(з)-☆ star 它 -> GitHub;和其他的 NebulaGraph 用户一起交流图数据库技术和应用技能,留下「你的名片」一起玩耍呢~

图查询语言 nGQL 简明教程 vol.01 快速入门的更多相关文章

  1. JasperReports入门教程(一):快速入门

    JasperReports入门教程(一):快速入门 背景 现在公司的项目需要实现一个可以配置的报表,以便快速的适应客户的需求变化.后来在网上查资料发现可以使用JasperReports + Jaspe ...

  2. Spring Boot 2 快速教程:WebFlux 快速入门(二)

    摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 02:WebFlux 快速入门实践 文章工程: JDK 1.8 ...

  3. spring boot入门教程——Spring Boot快速入门指南

    Spring Boot已成为当今最流行的微服务开发框架,本文是如何使用Spring Boot快速开始Web微服务开发的指南,我们将使创建一个可运行的包含内嵌Web容器(默认使用的是Tomcat)的可运 ...

  4. Expression Blend实例中文教程(9) - 行为快速入门Behaviors

    在Blend强大的设计功能支持下,设计人员和开发人员可以无代码实现Silverlight/WPF动画效果,例如上文介绍的StoryBoard,就是一个典型例子,设计人员和开发人员仅需提供必要元素,即可 ...

  5. MyBatis 学习总结 01 快速入门

    本文测试源码下载地址: http://onl5wa4sd.bkt.clouddn.com/MyBatis0918.rar 一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级 ...

  6. Expression Blend实例中文教程(2) - 界面快速入门

    上一篇主要介绍Expression系列产品,另外概述了Blend的强大功能,本篇将用Blend 3创建一个新Silverlight项目,通过创建的过程,对Blend进行快速入门学习. 在开始使用Ble ...

  7. emWin 2天速成实例教程000_如何快速入门ucGUI/emWin

    备注:(1)打开工程目录下的"Exe\GUISimulationDebug.exe"即可看到效果.(2)看完教程000-005就基本会用emWin做项目,其他章节可以需要时再参考. ...

  8. 几张图帮你理解 docker 基本原理及快速入门

    写的非常好的一篇文章,不知道为什么被删除了.  利用Google快照,做个存档. 快照地址:地址 作者地址:青牛 什么是docker Docker 是一个开源项目,诞生于 2013 年初,最初是 do ...

  9. SignalR系列教程:SignalR快速入门

    ---恢复内容开始--- 本篇是SignalR系列教程的第一篇,本篇内容介绍了如何创建SignalR应用,如何利用SignalR搭建简易的聊天室等,本篇内容参考自:http://www.asp.net ...

  10. Shell脚本深入教程(1):快速入门

    Shell脚本基础入门 Bash注释 Bash只支持单行注释,使用#开头的都被当作注释语句: # 整行注释 echo hello world # 行尾注释 通过Bash的一些特性,可以取巧实现多行注释 ...

随机推荐

  1. fiddler如何抓取https请求

    pc端browse 1.打开下载好的fiddler,点击tools选择options后进入https tab下,勾选Decrypt  HTTPS CONNECTS 和Ignore server cer ...

  2. 小程序之使用阿里字体图标 定义主题的颜色 控制首页标题的样式 如何使用组件 水平居中和垂直居中的方式 H5 关于上线后,

    项目搭建 1==> 需要创建的文件夹 styles 存放公共的样式 components 存放组件 lib第三方库的 utils 自己的帮助库 reques 自己的接口 2==>如何快速创 ...

  3. 【第4个渗透靶机项目】 Tr0ll

    每天都要加油哦! 0x00  信息搜集 首先找到一下靶机的ip,并扫描端口. 靶机和kali都是桥接. 那么先看一下kali的ifconfig信息. nmap -sn 192.168.0.0/24  ...

  4. gRPC with JWT

    在 gRPC 中使用 JWT(JSON Web Tokens)进行身份验证是一种常见的做法,它可以帮助你确保请求方的身份和权限.下面是一种使用 gRPC 和 JWT 进行身份验证的步骤: 生成和签发 ...

  5. go多版本管理

    在日常开发工作过程中,很多时候我们都需要在自己的机器上安装多个go版本,像是go1.16引入的embed,go1.18引入了泛型:又或是自己本地使用的是最新版,但公司的项目中使用的go1.14.go1 ...

  6. 根据TxID获取上链数据

    根据TxID获取上链信息 前段时间应甲方爸爸的要求,需要在现有的业务系统中新增一个根据TxID来查询上链信息的接口.搜了一圈发现相关的信息很少,最后只能祭出终极大招:Read Source Code. ...

  7. 从零开始配置 vim(6)——缩写

    关于vim能快速编辑文本的能力,我们见识到了 operator + motion ,见识到了. 范式和宏.甚至可以使用命令来加快文本编辑.在后面我们又介绍了快捷键绑定来快速执行我们想要的操作.今天我们 ...

  8. tensorflow语法【zip、tf.tile、tf.truncated_normal、tf.data.Dataset.from_tensor_slices、dataset中shuffle()】

    相关文章: [一]tensorflow安装.常用python镜像源.tensorflow 深度学习强化学习教学 [二]tensorflow调试报错.tensorflow 深度学习强化学习教学 [三]t ...

  9. 【5】Vscode Todo Tree插件使用和TODO、FIXME和XXX的注释使用说明以及自制自己的TODO图标样式!

    相关文章: [一]tensorflow安装.常用python镜像源.tensorflow 深度学习强化学习教学 [二]tensorflow调试报错.tensorflow 深度学习强化学习教学 [三]t ...

  10. C/C++ 原生套接字抓取FTP数据包

    网络通信在今天的信息时代中扮演着至关重要的角色,而对网络数据包进行捕获与分析则是网络管理.网络安全等领域中不可或缺的一项技术.本文将深入介绍基于原始套接字的网络数据包捕获与分析工具,通过实时监控网络流 ...