简介
文章目录
通过 docker-compose 安装
安装 docker1
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 连接 nebula1
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
5CREATE 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
24use 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
6INSERT 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");
查询特定属性的点
- 为属性建立索引:
- 对存量数据重建索引:
REBUILD TAG INDEX method_access_index;
- 通过 match 语句匹配:
MATCH (v:method_access) WHERE v.method_access.name == "exec" RETURN v LIMIT 3;
查询边
查询路径1
2
3
4
5
6
7
8FIND { 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 typeREVERSELY | BIDIRECT
:REVERSELY
表示反向,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;