本手册将逐步指导您使用 Nebula Graph。我们将指导您如何创建并使用图空间,定义数据的schema,插入数据,获取数据,更新数据以及删除数据。最后我们将指导您如何通过.ngql
文件来批量插入数据。
我们将通过下图中不同点之间的关系向您展示如何使用 Nebula Graph 数据库。
上图中有两个标签(player、team)以及两条边类型(serve、follow)。
Nebula Graph 中的图空间类似于传统数据库中创建的独立数据库,例如在 MySQL 中创建的数据库。首先,您需要创建一个图空间并使用它,然后才能执行其他操作。
您可以通过以下步骤创建并使用图空间:
- 输入以下语句创建图空间:
nebula> CREATE SPACE nba(partition_num=10, replica_factor=1);
注意:
partition_num
:指定一个副本中的分区数。replica_factor
:指定集群中副本的数量。
- 输入以下语句使用图空间:
nebula> USE nba;
现在,您可以通过以下语句查看刚创建的空间:
nebula> SHOW SPACES;
返回以下信息:
========
| Name |
========
| nba |
--------
在 Nebula Graph 中,我们将具有相同属性的点分为一组,该组即为一个标签。CREATE TAG
语句定义了一个标签,标签名称后面的括号中是标签的属性和属性类型。CREATE EDGE
语句定义边类型,类型名称后面的括号中是边的属性和属性类型。
您可以通过以下步骤创建标签和边类型:
- 输入以下语句创建 player 标签:
nebula> CREATE TAG player (name string, age int);
- 输入以下语句创建 team 标签:
nebula> CREATE TAG team (name string);
- 输入以下语句创建 follow 边类型:
nebula> CREATE EDGE follow(degree int);
- 输入以下语句创建 serve 边类型:
nebula> CREATE EDGE serve(start_year int, end_year int);
现在,您可以查看刚刚创建的标签和边类型。
要获取刚创建的标签,请输入以下语句:
nebula> SHOW TAGS;
返回以下信息:
============
| Name |
============
| player |
------------
| team |
------------
要显示刚创建的边类型,请输入以下语句:
nebula> SHOW EDGES;
返回以下信息:
==========
| Name |
==========
| serve |
----------
| follow |
----------
要显示 player 标签的属性,请输入以下语句:
nebula> DESCRIBE TAG player;
返回以下信息:
===================
| Field | Type |
===================
| name | string |
-------------------
| age | int |
-------------------
要获取 follow 边类型的属性,请输入以下语句:
nebula> DESCRIBE EDGE follow;
返回以下信息:
=====================
| Field | Type |
=====================
| degree | int |
---------------------
您可以根据示意图中的关系插入点和边数据。
INSERT VERTEX
语句通过指定点的标签、属性、点 ID 和属性值来插入一个点。
您可以通过以下语句插入点:
nebula> INSERT VERTEX player(name, age) VALUES 100:("Tim Duncan", 42);
nebula> INSERT VERTEX player(name, age) VALUES 101:("Tony Parker", 36);
nebula> INSERT VERTEX player(name, age) VALUES 102:("LaMarcus Aldridge", 33);
nebula> INSERT VERTEX team(name) VALUES 200:("Warriors");
nebula> INSERT VERTEX team(name) VALUES 201:("Nuggets");
nebula> INSERT VERTEX player(name, age) VALUES 121:("Useless", 60);
注意:
-
在上面插入的点中,关键词
VALUES
之后的数字是点的ID(缩写为VID
)。图空间中的VID
必须是唯一的。 -
最后插入的点将在删除数据部分中删除。
-
如果您想一次插入多个同类型的点,可以执行以下语句:
nebula> INSERT VERTEX player(name, age) VALUES 100:("Tim Duncan", 42), \
101:("Tony Parker", 36), 102:("LaMarcus Aldridge", 33);
INSERT EDGE
语句通过指定边类型名称、属性、起始点ID和目标点ID以及属性值来插入边。
您可以通过以下语句插入边:
nebula> INSERT EDGE follow(degree) VALUES 100 -> 101:(95);
nebula> INSERT EDGE follow(degree) VALUES 100 -> 102:(90);
nebula> INSERT EDGE follow(degree) VALUES 102 -> 101:(75);
nebula> INSERT EDGE serve(start_year, end_year) VALUES 100 -> 200:(1997, 2016);
nebula> INSERT EDGE serve(start_year, end_year) VALUES 101 -> 201:(1999, 2018);
注意:如果您想一次插入多条同类型的边,可以执行以下语句:
INSERT EDGE follow(degree) VALUES 100 -> 101:(95),100 -> 102:(90),102 -> 101:(75);
在 Nebula Graph 中插入数据后,您可以从图空间中检索到插入的数据。
FETCH PROP ON
语句从图空间检索数据。如果要获取点数据,则必须指定点标签和点ID;如果要获取边数据,则必须指定边类型名称、起始点 ID 和目标点 ID。
要获取 VID
为 100
的选手的数据,请输入以下语句:
nebula> FETCH PROP ON player 100;
返回以下信息:
============================
| player.name | player.age |
============================
| Tim | 42 |
----------------------------
要获取 VID
100
和 VID
200
之间的 serve
边的数据,请输入以下语句:
nebula>FETCH PROP ON serve 100 -> 200;
返回以下信息:
=====================================
| serve.start_year | serve.end_year |
=====================================
| 1997 | 2016 |
-------------------------------------
您可以更新刚插入的点和边数据。
UPDATE VERTEX
语句首先选择要更新的点,然后通过在等号右侧为其分配新值来更新点的数据。
以下示例说明如何将 VID
100
的 name
值从 Tim Duncan
更改为 Tim
。
输入以下语句更新 name
值:
nebula> UPDATE VERTEX 100 SET player.name = "Tim";
要检查 name
值是否已更新,请输入以下语句:
nebula> FETCH PROP ON player 100;
返回以下信息:
============================
| player.name | player.age |
============================
| Tim | 41 |
----------------------------
UPDATE EDGE
语句通过指定边的起始点ID和目标点ID,然后在等号右侧为其分配新值来更新边的数据。
以下示例展示了如何更改 VID
100
和 VID
101
之间 follow
边的值。现在,我们将 degree
的值从 95
更改为 96
。
输入以下语句更新 degree
的值:
nebula> UPDATE EDGE 100 -> 101 OF follow SET degree = follow.degree + 1;
要检查 degree
的值是否已更新,请输入以下语句:
nebula> FETCH PROP ON follow 100 -> 101;
返回以下信息:
=================
| follow.degree |
=================
| 96 |
-----------------
如果您有不需要的点或边数据,则可以从图空间中将其删除。
您可以从图空间中删除任何点。DELETE VERTEX
语句通过指定点ID来删除点。
要删除 VID
为 121
的点,请输入以下语句:
nebula> DELETE VERTEX 121;
要检查是否删除了该点,请输入以下语句;
nebula> FETCH PROP ON player 121;
返回以下信息:
Execution succeeded (Time spent: 1571/1910 us)
注意:上面返回结果为空的信息表示查询操作成功,但是由于数据已被删除,因此未能从图空间中查询到任何数据。
您可以从图空间中删除任何边。DELETE EDGE
语句通过指定边类型名称以及起始点ID和目标点ID来删除边。
要删除 VID
100
和 VID
200
之间的 follow
边,请输入以下语句:
nebula> DELETE EDGE follow 100 -> 200;
注意:如果您删除了一个点,则该点所有的入边和出边都将被删除。
本节提供了更多查询示例供您参考。
示例一: 查询 VID
100
关注的点。
输入以下语句:
nebula> GO FROM 100 OVER follow;
返回以下信息:
===============
| follow._dst |
===============
| 101 |
---------------
| 102 |
---------------
示例二: 查询 VID
100
关注的点且该点年龄大于 35
岁。
返回其姓名和年龄并分别把列的名称设置为 Teammate 和 Age。
输入以下语句:
nebula> GO FROM 100 OVER follow WHERE $$.player.age >= 35 \
YIELD $$.player.name AS Teammate, $$.player.age AS Age;
返回以下信息:
=====================
| Teammate | Age |
=====================
| Tony Parker | 36 |
---------------------
注意:
YIELD
指定您希望从查询中返回的值或结果。$$
表示目的点。\
表示换行符。
示例三: 查询球员 100
关注的球员所效力的球队。
有两种方法可获得相同的结果。首先,我们可以使用管道
来检索球队。然后,我们使用临时变量
来检索同一支球队。
输入带管道
的语句:
nebula> GO FROM 100 OVER follow YIELD follow._dst AS id | \
GO FROM $-.id OVER serve YIELD $$.team.name \
AS Team, $^.player.name AS Player;
返回如下信息:
===============================
| Team | Player |
===============================
| Nuggets | Tony Parker |
-------------------------------
输入带临时变量
的语句:
nebula> $var=GO FROM 100 OVER follow YIELD follow._dst AS id; \
GO FROM $var.id OVER serve YIELD $$.team.name \
AS Team, $^.player.name AS Player;
返回以下信息:
===============================
| Team | Player |
===============================
| Nuggets | Tony Parker |
-------------------------------
注意:
$^
表示起始点。|
表示管道。上一个查询的输出作为下一个查询的输入。$-
表示输入流。- 第二种方法采用用户自定义的变量
$var
。该变量的范围仅在复合语句内。
要插入多条数据,可以将所有 DDL(数据定义语言)语句放入 .ngql
文件中,如下所示。
CREATE SPACE nba(partition_num=10, replica_factor=1);
USE nba;
CREATE TAG player(name string, age int);
CREATE TAG team(name string);
CREATE EDGE follow(degree int);
CREATE EDGE serve(start_year int, end_year int);
- 如果您是通过编译源代码来安装 Nebula Graph,则可以通过以下命令批量写入console:
$ cat schema.ngql | ./bin/nebula -u user -p password
- 如果您通过
docker-compose
来使用 Nebula Graph,则可以通过以下命令批量写入console:
$ cat nba.ngql | sudo docker run --rm -i --network=host \
vesoft/nebula-console:nightly --addr=127.0.0.1 --port=3699
注意:
- 您必须将IP地址和端口号更改为您自己的IP地址和端口号。
- 您可以下在这里载
nba.ngql
文件。
同样,您可以在 data.ngql 文件中放置数百或数千个 DML(数据操作语言)语句来插入数据。如果您要插入数百万条记录,建议使用 csv 导入工具(或 sst 提取工具)。