NebulaGraph是图数据库的一种,不同于mysql类数据库的表关系,整个space内分为顶点(tag)和边(edge),构成一种图的网状关系,每个顶点都有一个全局唯一的顶点id(vid)。
具体帮助文档:https://docs.nebula-graph.com.cn/
现进行具体说明:
一、库级操作语句
1、查看所有库:
show spaces;
2、查看库信息:
describe space sqlLineage;
二、tag语句-》确定顶点的类型和承载信息
1、查看所有tag:
show tags;
2、创建tag:
变长类型为string,定长类型为fixed_string(),布尔值为bool,日期为timestamp,可以设置默认值,如日期可以设置默认函数为now()、 timestamp(),当利用该tag插入顶点时,不对该属性进行传参,则会设置默认值为当前时间。
create tag phone(name string,color fixed_string(5),size double,isSell bool default false,ct timestamp default timestamp());
3、删除tag:
注意,带有索引的tag不能被删除,否则会报出:confict!
drop tag phone;
4、查看单个tag信息:
describe tag phone;
三、edge type语句-》确定边的类型和承载信息
1、查看所有edge type
show edges;
2、创建edge type
create edge flow1(degree int);
3、删除edge type
注意,带有索引的edge type不能被删除,否则会报出:confict!
drop edge flow1;
4、查看单个edge type信息:
describe edge flow1;
四、顶点语句
1、插入顶点:
插入顶点时,必须指出顶点的vid,这里为hash(“iphone”)
insert vertex phone(name,color,size) values hash("iphone"):("iphone","black",6.8);
2、删除顶点:
delete vertex hash("iphone")
五、边语句
1、插入边
插入边时,必须指出边是由哪个顶点到哪个顶点的,也是通过对应顶点的vid,这里是hash(“iphone”)顶点到hash(“xiaomi”)顶点,属性为degree。
insert edge flow1(degree) values hash("iphone")->hash("xiaomi"):(1);
2、删除边
delete edge flow2 hash("iphone")->hash("xiaomi");
六、无索引查询语句
1、查看单个顶点信息
fetch prop on phone hash("iphone");
2、查看单个边信息
fetch prop on flow1 hash("iphone")->hash("xiaomi")
3、跳跃查询
下面例子表示,从vid为hash(“iphone”)的这个顶点,按照flow1这个边,查询跳跃1次到跳跃10次所有符合条件的顶点,并把该顶点的vid信息进行输出。
go 1 to 10 steps from hash("iphone") over flow1;
可以对该语句进行修改,下面例子,yield可以控制输出的内容,$ 表 示 的 是 对 应 边 的 下 一 个 节 点 , 还 可 以 用 表示的是对应边的下一个节点,还可以用 表示的是对应边的下一个节点,还可以用^,表示对应边的上一个节点,找到节点后,将节点上的phone的name属性取别名nm,然后进行输出。
go 1 to 10 steps from hash("iphone") over flow1 yield $$.phone.name as nm;
如下面例子,可以对边进行条件限定
go 1 to 10 steps from hash("iphone") over flow1 where flow1.degree >3 yield $$.phone.name as nm;
如下面例子,可以对顶点(这个是下位顶点)进行条件限定,并且还额外做了输出名的去重工作,并且对输出的size进行了数据类型强制转换。
go 1 to 10 steps from hash("iphone") over flow1 where $$.phone.size > 6 yield distinct($$.phone.name) as nm,toInteger($$.phone.size) as size;
如下面例子,引入管道符号,$-指代管道符号前的语句输出的起了别名的节点,先按照size进行排序,然后取前3个。
go 1 to 10 step from hash("iphone") over flow1 where $$.phone.size >6 yield $$.phone.name as name,toInteger($$.phone.size) as size,flow1.degree as degree| order by $-.size |limit 3;
七、索引语句
索引分为顶点索引和边索引:
1、查看当前space下的所有索引
(1)顶点索引
show tag indexes;
(2)边索引
show edge indexes;
2、创建索引
(1)顶点(边)全字段索引
create tag index index1 on phone();
(2)顶点(边)单字段索引
create tag index index2 on phone(name(10));
(3)顶点(边)复合字段索引
create tag index index3 on phone(name(10),size);
注意变长的字段在创建索引时,必须要制定长度,如上的name(10)
3、查看索引创建语句
show create tag index index3;
4、查看索引属性
describe tag index index2;
5、删除索引
drop tag index index3;
八、有索引查询语句
需要在插入数据前,对相应的tag(edge)建立索引,才能执行如下语句
1、按条件批量查询顶点(边)–lookup
lookup on phone where phone.size == 6.8
2、按条件批量查询顶点(边)–match
match (p:phone) where p.size > 6.0 return p;