图数据库nebulagraph的入门(图数据库教程)

图数据库nebulagraph的入门(图数据库教程)

技术教程gslnedu2025-01-23 11:07:5515A+A-

最近因为项目需要,研究了一下图数据库,图数据根据图处理和图存储的方式是否原生,大致可以归为下图中的四类


下来我再来解释一下这其中的区别:

原生图存储:数据存储模式专门为存储和处理图而设计优化,可支持各类图算法的快速遍历

非原生图存储:采用关系数据库、面向对象数据库或其它通用数据存储策略存储数据,未专门优化存储方式


原生图处理:采用免索引邻接(index-free adjacency)机制,通过指针专门保存节点之间的指向关系,每个节点都会维护对相邻节点的引用

非原生图处理:不采用免索引邻接机制保存节点之间的关系


然后项目需要支持高可用的集群架构,所以就选择了Nebula Graph,Nebula Graph采用shared-nothing架构,支持在不停止数据库服务的情况下扩缩容

一个Nebula Graph实例由一个或多个图空间组成。每个图空间都是物理隔离的,用户可以在同一个实例中使用不同的图空间存储不同的数据集。为了在图空间中插入数据,需要为图数据库定义一个Schema,Nebula Graph是一个强Schema的图数据库,schema是由如下几部分组成:



Nebula Graph的数据类型主要有下面几种



我们使用官方示例首先创建一个空间,然后定义两个点和两条边的定义

#创建一个图空间,partition_num是分片数,replica_factor是副本数,vid_type是vid类型,vid是图数据中的主键,是整个图空间中唯一的,目前支持int和fixed_string定长字符串两种类型
create space basketballplayer(partition_num=10,replica_factor=1,vid_type=fixed_string(32));

#指定使用图空间
use basketballplayer;

#定义点类型
create tag player(name string,age int);
create tag team(name string);

#定义边类型
create edge serve(start_year int,end_year int);
create edge follow(degree int);


然后我们再插入一些数据

插入点的语法:

INSERT VERTEX <tag_name> (<property_name>[, <property_name>...])[, <tag_name> (<property_name>[, <property_name>...]), ...]{VALUES | VALUE}
<vid>: (<property_value>[, <property_value>...])[, <vid>: (<property_value>[, <property_value>...];

插入边的语法:

INSERT EDGE <edge_type> (<property_name>[, <property_name>...])
{VALUES | VALUE} <src_vid> -> <dst_vid>[@<rank>] : (<property_value>[, <property_value>...])
[, <src_vid> -> <dst_vid>[@<rank>] : (<property_name>[, <property_name>...]), ...];

整体语法跟SQL还是比较类似的

#插入点数据
insert vertex player(name,age) values "player100":("Tim Duncan", 42);
insert vertex player(name,age) values "player101":("Tony Parker", 36);
insert vertex team(name) values "team204":("Spurs");

#插入边数据
insert edge follow(degree) values "player100"->"player101":(95);
insert edge serve(start_year,end_year) values "player100"->"team204":(1997, 2016);
insert edge serve(start_year,end_year) values "player101"->"team204":(1999, 2018);

目前的图数据库的查询语法还不统一,大致有Nebula Graph支持的ngql,Neo4j支持的cypher、hugegraph支持的gremlin大概几种,同时Nebula Graph对opencyper的部分语法也是支持的,下面我们就介绍一些相关的查询语法

先介绍一些ngql的几种查询方法及语法特点


其中lookup语句是需要对字段建立索引才可以使用的,因为其他语句都是基于vid进行的查询是可以不用建立索引的,但是lookup是根据字段的值做条件匹配的,这也是由于Nebula Graph底层是基于RocksDB存储的,存储时key里只包含了vid的引用,属性都是二进制数据存储在value里的,没有办法直接查找,所以需要基于具体的字段去建立索引,基于字段值建立key才可以进行查找

#建立索引需要指定字段的长度
create tag index player_index_1 on player(name(20));


同时Nebula Graph也支持opencyper的match语法查询,同样也是需要建立索引才可以使用

下面是一些查询例子

MATCH (v:player{name:"Tony Parker"}) RETURN v;
MATCH (v:player{name:"Tim Duncan"})-->(v2)<--(v3) RETURN v3.name AS Name;
MATCH p=(v:player{name:"Tim Duncan"})-->(v2) RETURN p;
MATCH (v:player{name:"Tim Duncan"})-[e:follow|:serve]->(v2) RETURN e;
MATCH p=(v:player{name:"Tim Duncan"})-[e:follow*2]->(v2) RETURN DISTINCT v2 AS Friends;
MATCH p=(v:player{name:"Tim Duncan"})-[e:follow*1..3]->(v2) RETURN v2 AS Friends;
MATCH p=(v:player{name:"Tim Duncan"})-[e:follow|serve*2]->(v2) RETURN DISTINCT v2;
MATCH p=(v:player{name:"Tim Duncan"})-[]->(v2) RETURN nodes(p);
MATCH p=(v:player{name:"Tim Duncan"})-[]->(v2) RETURN relationships(p);



点击这里复制本文地址 以上内容由朽木教程网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

朽木教程网 © All Rights Reserved.  蜀ICP备2024111239号-8