从0开始上手使用nebula图数据库

简介

文章目录

通过 docker-compose 安装

安装 docker

1
https://docs.docker.com/desktop/install/mac-install/

安装 docker-compose:

1
https://github.com/docker/compose/releases

下载 nebula-docker-compose 仓库并启动 nebula 服务

1
2
3
4
$ git clone https://github.com/vesoft-inc/nebula-docker-compose

$ cd nebula-docker-compose
$ docker-compose up

通过 docker-compose 启动时,同时会创建出 console 容器,可通过 console 容器链接 nebula,默认端口为 9669。

通过 nebula-console 连接 nebula

1
2
$ docker exec -it nebula-docker-compose-console-1 sh
$ nebula-console -addr 192.168.18.149 --port 9669 -u root -p 'a'

nebula 快速使用

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

为了在图空间中插入数据,需要为图数据库定义一个 Schema。NebulaGraph 的 Schema 是由如下几部分组成。

组成部分 说明
点(Vertex) 表示现实世界中的实体。一个点可以有 0 到多个标签。
标签(Tag) 点的类型,定义了一组描述点类型的属性。
边(Edge) 表示两个点之间有方向的关系。
边类型(Edge type) 边的类型,定义了一组描述边的类型的属性。

创建 space
语法

1
2
3
4
5
CREATE SPACE [IF NOT EXISTS] <graph_space_name> (
[partition_num = <partition_number>,]
[replica_factor = <replica_number>,]
vid_type = {FIXED_STRING(<N>) | INT64}
)

创建 ast-framework 空间

1
CREATE SPACE IF NOT EXISTS ast_framework_app(vid_type=FIXED_STRING(64));

创建 tag 和 edge
ast_framework_app 中的 tag 属性如下
名称 类型 属性
method_access Tag name string, className string, package string, filePath string, fileLine int, fileColumn int, originTaint string, variantTaint string, methodType int, bizId int;
variant Edge type type (string), value (string)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
use ast_framework_app;


CREATE TAG method_access(name string, className string, package string, methodType int, filePath string, fileLine int, fileColumn int, originTaint string, variantTaint string, bizId int);


INSERT EDGE [IF NOT EXISTS] <edge_type> ( <prop_name_list> ) VALUES
<src_vid> -> <dst_vid>[@<rank>] : ( <prop_value_list> )
[, <src_vid> -> <dst_vid>[@<rank>] : ( <prop_value_list> ), ...];

<prop_name_list> ::=
[ <prop_name> [, <prop_name> ] ...]

<prop_value_list> ::=
[ <prop_value> [, <prop_value> ] ...]


CREATE EDGE variant(type string, value string);

nebula> CREATE TAG IF NOT EXISTS t1 (p1 string, p2 int);
nebula> ALTER TAG t1 ADD (p3 int, p4 string);
nebula> ALTER TAG t1 TTL_DURATION = 2, TTL_COL = "p2";
nebula> ALTER TAG t1 COMMENT = 'test1';
nebula> ALTER TAG t1 ADD (p5 double NOT NULL DEFAULT 0.4 COMMENT 'p5') COMMENT='test2';

插入点和边

1
2
3
4
5
6
INSERT VERTEX methodAccess(name, className, package, filePath, fileLine, fileColumn, originTaint, variantTaint) VALUES 0:("getParameter", "ServletRequest", "http.request", "rt.jar!/asdlfkj/asdfjlk/asdflk/request.class", -1, 0, "", "10202021");
INSERT VERTEX methodAccess(name, className, package, filePath, fileLine, fileColumn, originTaint, variantTaint) VALUES 2:("exec", "Runtime", "java.lang", "rt.jar!/asdlfkj/asdfjlk/asdflk/Runtime.class", 1000, 0, "10202021", "10202022");

INSERT VERTEX method_access(name, className, package, filePath, fileLine, fileColumn, originTaint, variantTaint, bizId) VALUES "1-1-10101010110":("exec", "Runtime", "java.lang", "rt.jar!java/lang/Runtime.class", -1, -1, "123455", "123456", 1);

INSERT EDGE variant(type, value) VALUES 0 -> 2:("java.lang.String", "10202021");

查询特定属性的点

  1. 为属性建立索引:
  2. 对存量数据重建索引:REBUILD TAG INDEX method_access_index;
  3. 通过 match 语句匹配:MATCH (v:method_access) WHERE v.method_access.name == "exec" RETURN v LIMIT 3;

查询边

查询路径

1
2
3
4
5
6
7
8
FIND { SHORTEST | ALL | NOLOOP } PATH [WITH PROP] FROM <vertex_id_list> TO <vertex_id_list>
OVER <edge_type_list> [REVERSELY | BIDIRECT]
[<WHERE clause>] [UPTO <N> STEPS]
YIELD path as <alias>
[| ORDER BY $-.path] [| LIMIT <M>];

<vertex_id_list> ::=
[vertex_id [, vertex_id] ...]

  • SHORTEST:查找最短路径
  • ALL:查找所有路径
  • NOLOOP:查找非循环路径
  • WITH PROP:展示点和边的属性。不添加本参数则隐藏属性
  • <vertex_id_list>:点 ID 列表。多个点用英文逗号(,)分隔。支持$-和$var
  • <edge_type_list>:Edge type 列表。多个 Edge type 用英文逗号(,)分隔。*表示所有 Edge type
  • REVERSELY | BIDIRECTREVERSELY 表示反向,BIDIRECT表示双向
  • <WHERE clause>:可以使用WHERE子句过滤边属性
  • <N>:路径的最大跳数。默认值为5
  • <M>:指定返回的最大行数

FIND PATH语句检索的路径类型为trail,即检索的路径只有点可以重复,边不可以重复。详情请参见路径。

查找节点 “1-31-391527000” 到 “1-36-391540000” 的最短路径
FIND SHORTEST PATH WITH PROP FROM “1-31-391527000” TO “1-36-391540000” OVER * YIELD path AS p;

FIND SHORTEST PATH FROM “1-31-391527000” TO “1-36-391540000” OVER * YIELD path AS p;

查找 source 方法
LOOKUP ON method_access WHERE method_access.bizId == 1 and method_access.methodType == 2 YIELD id(vertex) AS id;

查找 sink 方法
LOOKUP ON method_access WHERE method_access.bizId == 1 and method_access.methodType == 5 YIELD id(vertex) AS id;

查找最短的路径
FIND SHORTEST PATH WITH PROP FROM “1-31-391527000” TO “1-36-391540000” OVER * YIELD path AS p;

owefsad wechat
进击的DevSecOps,持续分享SAST/IAST/RASP的技术原理及甲方落地实践。如果你对 SAST、IAST、RASP方向感兴趣,可以扫描下方二维码关注公众号,获得更及时的内容推送。
0%