Quick Start

Docker 方式

试用 Nebula Graph 最简单的方式是使用 Docker。开始试用前,请确保:

  • 已安装最新版的 Docker
  • Nebula Docker Hub 获取最新的 Nebula Graph 镜像。如未获取,请使用如下命令获取:
  1. > docker pull vesoft/nebula-graph:nightly

硬件资源需求(推荐)

建议使用 SSD,并预留 50GB 以上的空间,内存建议在 8GB 以上。如果配置过低,有可能导致服务非正常退出。

Docker 集群部署

试用 Nebula Graph 集群部署最简单的方式是使用 docker compose。详情参见 Nebula Graph docker 部署

启动服务

nebula 镜像下载完成后,运行容器:

  1. > docker run -it vesoft/nebula-graph:nightly /bin/bash

进入容器后,默认在根目录下 / ,切换到 Nebula 主目录:

  1. > cd /usr/local/nebula/

启动 metad,storaged 和 graphd 服务:

  1. > scripts/nebula.service start all

查看服务状态:

  1. > scripts/nebula.service status all

连接 Nebula Graph

  1. > bin/nebula -u=user -p=password
  • -u 为用户名,默认值为 user
  • -p 为密码,用户 user 的默认密码为 password

此外,如果 console (bin/nebula) 与 graphd 不在同台服务器上,你需要指定 graphd 的 ip 和 port

  1. > bin/nebula -u=user -p=password --addr={graphd ip} --port={graphd port}

在部署过程遇到的任何问题,欢迎前往 GitHub 向社区提 issue。

创建图数据

本节介绍如何构建图数据并进行查询。本示例基于下图构建:

image

示例数据有三种类型的标签(coursebuildingstudent),两种类型的边(choosefollow)。

创建图空间

Nebula Graph 中的图存储于 SPACE 中,每个 Space 是一个物理隔离的空间。首先,需要创建一个 Space ,并使用该 Space 以完成之后的操作。

列出已有的 Space:

  1. nebula> SHOW SPACES;

创建一个名为 test 的新 Space:

  1. nebula> CREATE SPACE test(partition_num=100, replica_factor=1);
  2. -- 使用这个 space
  3. nebula> USE test;
  • replica_factor 用来指定集群副本数。
  • partition_num 用来指定一个副本中的分区数量。

定义图数据 Schema

使用 CREATE TAG 语句定义带有标签类型和属性列表的标签:

  1. nebula> CREATE TAG course(name string, credits int);
  2. nebula> CREATE TAG building(name string);
  3. nebula> CREATE TAG student(name string, age int, gender string);

使用 CREATE EDGE 语句定义边类型:

  1. nebula> CREATE EDGE follow(likeness double);
  2. nebula> CREATE EDGE choose(grade int);

查看上述创建的标签和边类型:

  1. -- 查看标签列表
  2. nebula> SHOW TAGS;
  3. ============
  4. | Name |
  5. ============
  6. | building |
  7. ------------
  8. | course |
  9. ------------
  10. | student |
  11. ------------
  12. -- 查看边类型列表
  13. nebula> SHOW EDGES;
  14. ==========
  15. | Name |
  16. ==========
  17. | choose |
  18. ----------
  19. | follow |
  20. ----------

查看标签或边类型的属性:

  1. -- 查看标签的属性
  2. nebula> DESCRIBE TAG student;
  3. ===================
  4. | Field | Type |
  5. ===================
  6. | name | string |
  7. -------------------
  8. | age | int |
  9. -------------------
  10. | gender | string |
  11. -------------------
  12. -- 查看边类型的属性
  13. nebula> DESCRIBE EDGE follow;
  14. =====================
  15. | Field | Type |
  16. =====================
  17. | likeness | double |
  18. ---------------------

插入数据

根据上图,插入相应的点和边:

  1. -- 插入点
  2. nebula> INSERT VERTEX student(name, age, gender) VALUES 200:("Monica", 16, "female");
  3. nebula> INSERT VERTEX student(name, age, gender) VALUES 201:("Mike", 18, "male");
  4. nebula> INSERT VERTEX student(name, age, gender) VALUES 202:("Jane", 17, "female");
  5. nebula> INSERT VERTEX course(name, credits),building(name) VALUES 101:("Math", 3, "No5");
  6. nebula> INSERT VERTEX course(name, credits),building(name) VALUES 102:("English", 6, "No11");
  7. -- 插入边
  8. nebula> INSERT EDGE choose(grade) VALUES 200 -> 101:(5);
  9. nebula> INSERT EDGE choose(grade) VALUES 200 -> 102:(3);
  10. nebula> INSERT EDGE choose(grade) VALUES 201 -> 102:(3);
  11. nebula> INSERT EDGE choose(grade) VALUES 202 -> 102:(3);
  12. nebula> INSERT EDGE follow(likeness) VALUES 200 -> 201:(92.5);
  13. nebula> INSERT EDGE follow(likeness) VALUES 201 -> 200:(85.6);
  14. nebula> INSERT EDGE follow(likeness) VALUES 201 -> 202:(93.2);

更新数据

  1. -- 更新点
  2. nebula> UPDATE VERTEX 101 SET course.credits = $^.course.credits + 1, building.name = "No8"
  3. -- 更新边
  4. nebula> UPDATE EDGE 200 -> 101 OF choose SET grade = choose.grade +1

查看数据

查看更新点的数据

  1. nebula> FETCH PROP ON course 101;
  2. ================================
  3. | course.name | course.credits |
  4. ================================
  5. | Math | 4 |
  6. --------------------------------
  7. nebula> FETCH PROP ON choose 200 -> 101
  8. ================
  9. | choose.grade |
  10. ================
  11. | 6 |
  12. ----------------

删除数据

删除点

  1. nebula> DELETE VERTEX $vid

查询示例

Q1. 查询点 201 关注的点:

  1. nebula> GO FROM 201 OVER follow;
  2. =============
  3. | follow._dst |
  4. =============
  5. | 200 |
  6. -------------
  7. | 202 |
  8. -------------

Q2. 查询点 201 关注的点,并筛选出年龄大于 17 岁的点,并返回其姓名,年龄,性别,将其重命名为 Friend,Age,Gender。

  1. nebula> GO FROM 201 OVER follow WHERE $$.student.age >= 17 YIELD $$.student.name AS Friend, \
  2. $$.student.age AS Age, $$.student.gender AS Gender;
  3. =========================
  4. | Friend | Age | Gender |
  5. =========================
  6. | Jane | 17 | female |
  7. -------------------------

说明: 可以使用反斜杠(\)来换行

  • YIELD 用来指定返回信息。
  • $^ 为起始点。
  • $$ 为目标点。

Q3. 查询点 201 关注的点选择了哪些课程和其对应年级。

  1. -- 使用管道
  2. nebula> GO FROM 201 OVER follow yield follow._dst as id \
  3. | GO FROM $-.id OVER choose YIELD $^.student.name AS Student,\
  4. $$.course.name AS Course, choose.grade AS Grade;
  5. =============================
  6. | Student | Course | Grade |
  7. =============================
  8. | Monica | Math | 6 |
  9. -----------------------------
  10. | Monica | English | 3 |
  11. -----------------------------
  12. | Jane | English | 3 |
  13. -----------------------------
  14. -- 使用临时变量
  15. nebula> $var=GO FROM 201 OVER follow yield follow._dst as id;\
  16. GO FROM $var.id OVER choose YIELD $^.student.name AS Student,\
  17. $$.course.name AS Course, choose.grade AS Grade;
  18. =============================
  19. | Student | Course | Grade |
  20. =============================
  21. | Monica | Math | 6 |
  22. -----------------------------
  23. | Monica | English | 3 |
  24. -----------------------------
  25. | Jane | English | 3 |
  26. -----------------------------

说明:

  • | 表示管道操作,前一个子查询的结果传递给后一个子查询。
  • $- 表示输入流。

第二种方法使用了用户定义变量 $var,此变量可以在整个复合语句内使用。

提示

在测试过程中,通常需要多次修改 schema,因此可以将 schema 修改命令写入文件中来批量执行。

假设将如下操作命令保存为 schema.ngql,行尾使用分号断句。

  1. DROP SPACE test; -- 删除无用的 space
  2. CREATE SPACE test(partition_num=100, replica_factor=1);
  3. USE test;
  4. CREATE TAG course(name string, credits int);
  5. CREATE TAG building(name string);
  6. CREATE TAG student(name string, age int, gender string);
  7. CREATE EDGE like(likeness double);
  8. CREATE EDGE select(grade int);

那么就可以批量写入

  1. cat schema.ngql | ./bin/nebula -u user -p password

同样的,也可以将待插入的数据语句批量写入到一个文件中,再如上操作。此外也可以使用 csv 工具来导入。