- Quick Start
- Docker 方式
- 硬件资源需求(推荐)
- Docker 集群部署
- 启动服务
- 连接 Nebula Graph
- 创建图数据
- 创建图空间
- 定义图数据 Schema
- 插入数据
- 更新数据
- 查看数据
- 删除数据
- 查询示例
- 提示
Quick Start
Docker 方式
试用 Nebula Graph 最简单的方式是使用 Docker。开始试用前,请确保:
- 已安装最新版的 Docker。
- 从 Nebula Docker Hub 获取最新的 Nebula Graph 镜像。如未获取,请使用如下命令获取:
> docker pull vesoft/nebula-graph:nightly
硬件资源需求(推荐)
建议使用 SSD
,并预留 50GB 以上的空间,内存建议在 8GB 以上。如果配置过低,有可能导致服务非正常退出。
Docker 集群部署
试用 Nebula Graph 集群部署最简单的方式是使用 docker compose。详情参见 Nebula Graph docker 部署。
启动服务
nebula
镜像下载完成后,运行容器:
> docker run -it vesoft/nebula-graph:nightly /bin/bash
进入容器后,默认在根目录下 /
,切换到 Nebula
主目录:
> cd /usr/local/nebula/
启动 metad,storaged 和 graphd 服务:
> scripts/nebula.service start all
查看服务状态:
> scripts/nebula.service status all
连接 Nebula Graph
> bin/nebula -u=user -p=password
- -u 为用户名,默认值为
user
- -p 为密码,用户
user
的默认密码为password
此外,如果 console (bin/nebula
) 与 graphd
不在同台服务器上,你需要指定 graphd
的 ip 和 port
> bin/nebula -u=user -p=password --addr={graphd ip} --port={graphd port}
在部署过程遇到的任何问题,欢迎前往 GitHub 向社区提 issue。
创建图数据
本节介绍如何构建图数据并进行查询。本示例基于下图构建:
示例数据有三种类型的标签(course, building,student),两种类型的边(choose 和 follow)。
创建图空间
Nebula Graph 中的图存储于 SPACE 中,每个 Space 是一个物理隔离的空间。首先,需要创建一个 Space ,并使用该 Space 以完成之后的操作。
列出已有的 Space:
nebula> SHOW SPACES;
创建一个名为 test 的新 Space:
nebula> CREATE SPACE test(partition_num=100, replica_factor=1);
-- 使用这个 space
nebula> USE test;
replica_factor
用来指定集群副本数。partition_num
用来指定一个副本中的分区数量。
定义图数据 Schema
使用 CREATE TAG
语句定义带有标签类型和属性列表的标签:
nebula> CREATE TAG course(name string, credits int);
nebula> CREATE TAG building(name string);
nebula> CREATE TAG student(name string, age int, gender string);
使用 CREATE EDGE
语句定义边类型:
nebula> CREATE EDGE follow(likeness double);
nebula> CREATE EDGE choose(grade int);
查看上述创建的标签和边类型:
-- 查看标签列表
nebula> SHOW TAGS;
============
| Name |
============
| building |
------------
| course |
------------
| student |
------------
-- 查看边类型列表
nebula> SHOW EDGES;
==========
| Name |
==========
| choose |
----------
| follow |
----------
查看标签或边类型的属性:
-- 查看标签的属性
nebula> DESCRIBE TAG student;
===================
| Field | Type |
===================
| name | string |
-------------------
| age | int |
-------------------
| gender | string |
-------------------
-- 查看边类型的属性
nebula> DESCRIBE EDGE follow;
=====================
| Field | Type |
=====================
| likeness | double |
---------------------
插入数据
根据上图,插入相应的点和边:
-- 插入点
nebula> INSERT VERTEX student(name, age, gender) VALUES 200:("Monica", 16, "female");
nebula> INSERT VERTEX student(name, age, gender) VALUES 201:("Mike", 18, "male");
nebula> INSERT VERTEX student(name, age, gender) VALUES 202:("Jane", 17, "female");
nebula> INSERT VERTEX course(name, credits),building(name) VALUES 101:("Math", 3, "No5");
nebula> INSERT VERTEX course(name, credits),building(name) VALUES 102:("English", 6, "No11");
-- 插入边
nebula> INSERT EDGE choose(grade) VALUES 200 -> 101:(5);
nebula> INSERT EDGE choose(grade) VALUES 200 -> 102:(3);
nebula> INSERT EDGE choose(grade) VALUES 201 -> 102:(3);
nebula> INSERT EDGE choose(grade) VALUES 202 -> 102:(3);
nebula> INSERT EDGE follow(likeness) VALUES 200 -> 201:(92.5);
nebula> INSERT EDGE follow(likeness) VALUES 201 -> 200:(85.6);
nebula> INSERT EDGE follow(likeness) VALUES 201 -> 202:(93.2);
更新数据
-- 更新点
nebula> UPDATE VERTEX 101 SET course.credits = $^.course.credits + 1, building.name = "No8"
-- 更新边
nebula> UPDATE EDGE 200 -> 101 OF choose SET grade = choose.grade +1
查看数据
查看更新点的数据
nebula> FETCH PROP ON course 101;
================================
| course.name | course.credits |
================================
| Math | 4 |
--------------------------------
nebula> FETCH PROP ON choose 200 -> 101
================
| choose.grade |
================
| 6 |
----------------
删除数据
删除点
nebula> DELETE VERTEX $vid
查询示例
Q1. 查询点 201 关注的点:
nebula> GO FROM 201 OVER follow;
=============
| follow._dst |
=============
| 200 |
-------------
| 202 |
-------------
Q2. 查询点 201 关注的点,并筛选出年龄大于 17 岁的点,并返回其姓名,年龄,性别,将其重命名为 Friend,Age,Gender。
nebula> GO FROM 201 OVER follow WHERE $$.student.age >= 17 YIELD $$.student.name AS Friend, \
$$.student.age AS Age, $$.student.gender AS Gender;
=========================
| Friend | Age | Gender |
=========================
| Jane | 17 | female |
-------------------------
说明: 可以使用反斜杠(\
)来换行
YIELD
用来指定返回信息。$^
为起始点。$$
为目标点。
Q3. 查询点 201 关注的点选择了哪些课程和其对应年级。
-- 使用管道
nebula> GO FROM 201 OVER follow yield follow._dst as id \
| GO FROM $-.id OVER choose YIELD $^.student.name AS Student,\
$$.course.name AS Course, choose.grade AS Grade;
=============================
| Student | Course | Grade |
=============================
| Monica | Math | 6 |
-----------------------------
| Monica | English | 3 |
-----------------------------
| Jane | English | 3 |
-----------------------------
-- 使用临时变量
nebula> $var=GO FROM 201 OVER follow yield follow._dst as id;\
GO FROM $var.id OVER choose YIELD $^.student.name AS Student,\
$$.course.name AS Course, choose.grade AS Grade;
=============================
| Student | Course | Grade |
=============================
| Monica | Math | 6 |
-----------------------------
| Monica | English | 3 |
-----------------------------
| Jane | English | 3 |
-----------------------------
说明:
|
表示管道操作,前一个子查询的结果传递给后一个子查询。$-
表示输入流。
第二种方法使用了用户定义变量 $var
,此变量可以在整个复合语句内使用。
提示
在测试过程中,通常需要多次修改 schema,因此可以将 schema 修改命令写入文件中来批量执行。
假设将如下操作命令保存为 schema.ngql,行尾使用分号断句。
DROP SPACE test; -- 删除无用的 space
CREATE SPACE test(partition_num=100, replica_factor=1);
USE test;
CREATE TAG course(name string, credits int);
CREATE TAG building(name string);
CREATE TAG student(name string, age int, gender string);
CREATE EDGE like(likeness double);
CREATE EDGE select(grade int);
那么就可以批量写入
cat schema.ngql | ./bin/nebula -u user -p password
同样的,也可以将待插入的数据语句批量写入到一个文件中,再如上操作。此外也可以使用 csv 工具来导入。