关于nebula:图查询语言-nGQL-简明教程-vol01-快速入门

46次阅读

共计 5098 个字符,预计需要花费 13 分钟才能阅读完成。

本文旨在让老手疾速理解 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:https://docs.nebula-graph.com.cn/3.2.0/2.quick-start/1.quick-start-workflow/
  • nGQL 常见命令:https://docs.nebula-graph.com.cn/3.2.0/2.quick-start/4.nebula-graph-crud/
  • GO 语句文档:https://docs.nebula-graph.com.cn/3.2.0/3.ngql-guide/7.general-query-statements/3.go/
  • 全方位解说 NebulaGraph 索引原理和应用:https://discuss.nebula-graph.com.cn/t/topic/8074
  • LOOKUP 语句文档:https://docs.nebula-graph.com.cn/3.2.0/3.ngql-guide/7.general-query-statements/5.lookup/
  • FETCH PROP 语句文档:https://docs.nebula-graph.com.cn/3.2.0/3.ngql-guide/7.general-query-statements/4.fetch/
  • GET SUBGRAPH 语句文档:https://docs.nebula-graph.com.cn/3.2.0/3.ngql-guide/16.subgraph-and-path/1.get-subgraph/
  • 管道 | 文档:https://docs.nebula-graph.com.cn/3.2.0/3.ngql-guide/5.operators/4.pipe/
  • 援用符 $ 文档:https://docs.nebula-graph.com.cn/3.2.0/3.ngql-guide/5.operators/5.property-reference/
  • GROUP-BY:https://docs.nebula-graph.com.cn/3.2.0/3.ngql-guide/8.clauses-and-options/group-by/
  • nGQL Cheatsheet:https://docs.nebula-graph.com.cn/3.2.0/2.quick-start/6.cheatsheet-for-ngql-command/
  • MATCH 语句文档:https://docs.nebula-graph.com.cn/3.2.0/3.ngql-guide/7.general-query-statements/2.match/

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

免部署省时省力,当初能够用用 NebulaGraph Cloud 来搭建本人的图数据系统哟~NebulaGraph 阿里云计算巢现 30 天收费应用中,点击链接来用用图数据库吧~

想看源码的小伙伴能够返回 GitHub 浏览、应用、(^з^)-☆ star 它 -> GitHub;和其余的 NebulaGraph 用户一起交换图数据库技术和利用技能,留下「你的名片」一起游玩呢~

正文完
 0