Nebula Graph - nGQL 指令操作

举报
程序员-上善若水 发表于 2022/06/23 23:27:20 2022/06/23
【摘要】 一、图空间和 Schema 上篇文章简单介绍了 Nebula Graph ,以及 Nebula Graph 的安装,本篇文章给予上篇继续使用 nGQL 操作 Nebula Graph。 下面是上篇文章...

一、图空间和 Schema

上篇文章简单介绍了 Nebula Graph ,以及 Nebula Graph 的安装,本篇文章给予上篇继续使用 nGQL 操作 Nebula Graph。

下面是上篇文章的地址:

https://blog.csdn.net/qq_43692950/article/details/124574794

一个 Nebula Graph 实例由一个或多个图空间组成。每个图空间都是物理隔离的,用户可以在同一个实例中使用不同的图空间存储不同的数据集。

  1. 创建空间

    create space bxc(partition_num=15, replica_factor=1, vid_type=fixed_string(30));
    
        
       
    • 1

    partition_num:指定图空间的分片数量。建议设置为5倍的集群硬盘数量。例如集群中有3个硬盘,建议设置15个分片。默认值为100。

    replica_factor:指定每个分片的副本数量。建议在生产环境中设置为3,在测试环境中设置为1。由于需要基于多数表决,副本数量必须是奇数。默认值为1。

    vid_type:必选参数。指定点ID的数据类型。可选值为FIXED_STRING(<N>)INT64INT等同于INT64FIXED_STRING(<N>)表示数据类型为字符串,最大长度为N,超出长度会报错;INT64表示数据类型为整数。

  2. 查看空间

    show spaces;
    
        
       
    • 1
  3. 使用空间

    use bxc;
    
        
       
    • 1

二、TAG 及 EDGE 操作

  1. 创建 TAG

    create tag team(team_name string, persion_num int);
    create tag game(name string);
    # 创建包含默认值的Tag
    create tag if not exists team1(name string, persion_num  int default 20);
    # 对字段设置TTL为2秒
    create tag if not exists game(name string) ttl_duration = 2, ttl_col = "name ";
    #没属性
    create tag if not exists game2();
    
        
       
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
  2. 创建关系(和创建 TAG 相同)

    create edge info(num int);
    
        
       
    • 1
  3. 添加 vertex 定点

    insert vertex team(team_name, persion_num) values "team_1":("team_1", 42);
    insert vertex game(name) values "game_1":("game_1");
    
        
       
    • 1
    • 2
  4. 添加关系

    如果已有Edge type、起点、终点、rank都相同的边,则覆盖原边。

    insert edge info(num) values "team_1" -> "game_1":(95);
    insert edge info(num) values "team_2" -> "game_1":(96);
    insert edge info(num) values "team_2" -> "game_1"@1:(96);
    
        
       
    • 1
    • 2
    • 3

三、FETCH 查询

FETCH可以获取指定点或边的属性值。

  1. 根据 vid 查询点数据

    fetch prop on team "team_1" yield properties(vertex);
    
        
       
    • 1
  2. 获取 点的属性:

    fetch prop on team "team_1" yield id(vertex),properties(vertex).team_name,properties(vertex).persion_num;
    
        
       
    • 1
  3. 获取多个点的属性值

    fetch prop on team "team_1","team_2" yield properties(vertex).team_name,properties(vertex).persion_num;
    
        
       
    • 1
  4. 在所有标签中获取点的属性值

    fetch prop on * "team_1", "team_2" yield vertex as v;
    
        
       
    • 1
  5. 获取边的属性值

    fetch prop on info "team_1" -> "game_1" yield properties(edge);
    
        
       
    • 1
  6. 获取边的属性值,根据 rank

    fetch prop on info "team_2" -> "game_1"@1 yield properties(edge);
    
        
       
    • 1
  7. 获取多条边的属性值

    fetch prop on info "team_2" -> "game_1"@1,"team_2" -> "game_1" yield properties(edge);
    
        
       
    • 1
  8. 复合语句

    GO FROM "team_1" OVER info YIELD src(edge) AS s, dst(edge) AS d \
    | FETCH PROP ON info $-.s -> $-.d YIELD properties(edge);
    
        
       
    • 1
    • 2

四、GO 查询

GO从给定起始点开始遍历图。GO语句采用的路径类型是walk,即遍历时点和边都可以重复。

  1. 遍历图,得到边的属性

    go from "team_1" over info yield properties(edge);
    
        
       
    • 1
  2. 指定步长,获取2跳的点。

    go 2 steps from "team_1" over info yield dst(edge);
    
        
       
    • 1
  3. 条件过滤

    go 2 steps from "team_1" over info where properties(edge).name == "game_1_2" yield properties(edge);
    
        
       
    • 1
  4. 返回 game_1 入方向的邻居点。

    go from "game_1" over info reversely yield src(edge) as destination;
    
        
       
    • 1
  5. 获取 1- 2 跳的数据

    go 1 to 2 steps from "team_1" over info yield dst(edge) as destination;
    
        
       
    • 1
  6. 使用符号

    go from "team_1" over info yield id($$),properties($$);
    go from "team_1" over follow where properties($$).age >= 40 yield properties($$);
    go from "team_1" over info yield properties(edge),rank(edge)
    
        
       
    • 1
    • 2
    • 3

    $^ : 表示边的起点。
    $$: 表示边的终点。
    $- : 表示管道符前面的查询输出的结果集。

  7. 判断非空

    go from "team_1" over info where properties($$).name is not empty yield properties($$);
    
        
       
    • 1

五、MATCH 查询

MATCH语句提供基于模式(pattern)匹配的搜索功能。一个MATCH语句定义了一个搜索模式,用该模式匹配存储在 Nebula Graph 中的数据,然后用RETURN子句检索数据。

与GO或LOOKUP等其他查询语句相比,MATCH的语法更灵活。MATCH语句采用的路径类型是trail,即遍历时只有点可以重复,边不可以重复。

注意事项

除以下三种情况之外,请确保 MATCH 语句有至少一个索引可用。

  • MATCH语句中WHERE子句使用 id() 函数指定了点的 VID,不需要创建索引即可执行。

  • 当遍历所有点边时,例如MATCH (v) RETURN v LIMIT N,不需要创建索引,但必须使用LIMIT限制输出结果数量。

  • 当遍历指定 Tag 的点或指定 Edge Type 的边时,例如MATCH (v:player) RETURN v LIMIT N,不需要创建索引,但必须使用LIMIT限制输出结果数量。

目前 match 语句无法查询到悬挂边。

  1. 为 team 创建索引

    create tag index if not exists team_index on team (team_name (20));
    
        
       
    • 1
  2. 重建索引使其生效。

    rebuild tag index team_index ;
    
        
       
    • 1
  3. 查看TAG 下的点

    match (v:team) return v limit 3;
    
        
       
    • 1
  4. 匹配多个 Tag 的点

    match (v:team),(v2:game) return v,v2 limit 3;
    
        
       
    • 1
  5. 匹配点的属性

    match (v:team{team_name:"team_2"}) return v limit 3;
    
        
       
    • 1
  6. 使用WHERE子句,筛选

    match (v:team) where v.team.team_name == "team_2" return v ;
    
        
       
    • 1
  7. 匹配点 ID

    match (v.team) where id(v) == "team_2" return v;
    
        
       
    • 1
  8. IN 匹配多个

    match (v:team) where id(v) in ["team_1","team_2"] return v;
    
        
       
    • 1
  9. 匹配连接的点
    可以使用--符号表示两个方向的边,并匹配这些边连接的点。在--符号上增加<>符号指定边的方向。

    获取team 中 点 team_name 为 team_1 指向 game 中所有的点:

    match (v:team{team_name:"team_1"})-->(v2:game) return v2;
    
        
       
    • 1
  10. 对结果进行判断 CASE

    match (v:team{team_name:"team_1"})-->(v2:game) return \
    case \
    when v2.game.name is null then  "0" \
    when v2.game.name == "game_1_1"  then   "1" \
    else "2" \
    end as name;
    
        
       
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  11. 查询和自己同样关联team 的点:

    match (v:team{team_name:"team_2"})-->(v2:game)<--(v3:team) return v3;
    
        
       
    • 1
  12. 匹配路径

    match p=(v:team{team_name:"team_1"})-->(v2:game) return p;
    
        
       
    • 1
  13. 查看所有的边

    match ()-[e:info]->() return e limit 10;
    
        
       
    • 1
  14. 同时匹配点和边的属性

    match (v:team{team_name:"team_1"})-[e:info{num:95}]->() return e;
    
        
       
    • 1
  15. 匹配多个 Edge

    match (v:team{team_name:"team_1"})-[e:info|:info1]->() return e;
    
        
       
    • 1
  16. 匹配定长路径
    使用:<edge_type>*<hop>匹配定长路径。hop必须是一个非负整数

    match (v:team{team_name:"team_1"})-[e:info*2]->() return e;
    
        
       
    • 1

    如果hop为 0,模式会匹配路径上的起始点。

  17. 匹配变长路径

    match (v:team{team_name:"team_1"})-[e:info*1..3]->() return e;
    
        
       
    • 1
  18. 使用 distinct 去除重复的数据

    match (v:team{team_name:"team_1"})-[e:info*1..3]->() return distinct  e;
    
        
       
    • 1

六、索引

索引会导致写性能大幅降低(降低 90%甚至更多)。请不要随意在生产环境中使用索引,除非很清楚使用索引对业务的影响。

  1. 创建索引

    create tag index if not exists team_index on team(team_name(20));
    create tag index if not exists game_index on game(name(20));
    create edge index if not exists info_index on info();
    
        
       
    • 1
    • 2
    • 3
  2. 重建索引确保能对已存在数据生效

    rebuild tag index team_index
    rebuild tag index game_index
    rebuild edge index info_index;
    
        
       
    • 1
    • 2
    • 3
  3. 根据索引查询数据

    lookup on team1 where team1.name == "team_1" yield properties(vertex).name AS name, properties(vertex).age AS age;
    
        
       
    • 1
  4. 根据索引查询数据 match

    match (v:team1{name:"team_1"}) return v;
    
        
       
    • 1

七、LOOKUP 根据索引遍历数据

LOOKUP根据索引遍历数据。可以使用LOOKUP实现如下功能:

  • 根据WHERE子句搜索特定数据。
  • 通过 Tag 列出点:检索指定 Tag 的所有点 ID。
  • 通过 Edge type 列出边:检索指定 Edge type 的所有边的起始点、目的点和 rank。
  • 统计包含指定 Tag 的点或属于指定 Edge type 的边的数量。

请确保LOOKUP语句有至少一个索引可用。如果已经存在相关的点、边或属性,必须在新创建索引后重建索引,才能使其生效。

  1. 检索点

    lookup on team where team.team_name == "team_1" yield id(vertex),properties(vertex);
    
        
       
    • 1
    lookup on team where team.persion_num > 42 yield id(vertex),properties(vertex);
    
        
       
    • 1
    lookup on team where team.team_name in ["team_1","team_2"] and team.persion_num > 41 yield id(vertex),properties(vertex);
    
        
       
    • 1
  2. 检索边

    lookup on info where info.num > 50 yield id(edge),properties(edge);
    
        
       
    • 1
    lookup on info yield id(edge),properties(edge);
    
        
       
    • 1

文章来源: blog.csdn.net,作者:小毕超,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq_43692950/article/details/124579284

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。