JanusGraph数据存储
1.1基本概念介绍
VertexLabel。节点的类型,用于表示现实世界中的实体对象;
EdgeLabel。边的类型,用于表示现实世界中的关系类型;
Edge。边,用于表示具体的联系。JanusGraph的边都是单向边。如果需要双向边,则通过两条相反方向的单向边组成;
PropertyKey。属性的类型。Property Key有Cardinality的概念。Cardinality有SINGLE、LIST和SET三种选项;
Property。属性,用于表示具体的附加信息,采用Key-Value结构。
MULTI 在一对vertex间可以有任意多个同样label的edge;
SIMPLE在一对vertex间多只能有一个同样label的edge;
MANY2ONE多对一。在任何顶点上多允许此标签的一个传出边,但不对传入边施加约束。如mother;
ONE2MANY一对多。在任何顶点上多允许此标签的一个传入边,但不对传出边施加约束。如winnerOf;
ONE2ONE 某verex中具有同样Label的edge,只能有多一个incomingedge和多一个outgoing edge,如marry。
Property Key Cardinality:
SINGLE。每个KEY只允许一个Value (默认);
LIST。以LIST形式保存Value,也即可以有重复值;
SET。以SET形式保存Value,不能有重复值;
Property Key Data Type:
图切割
按Vertex切割时,切割线通过图的Vertex,而不是Edge。每一条Edge边只保存一次,并且每一条Edge只出现在一台机器上,邻居多的Vertex会被分发到不同的机器上。按Edge切割时,切割线只穿过连接vertex的edge,此时,每一个vertex只保存一次。切断的Edge会保存到多台机器上。
作为一种分布式图数据库,JanusGraph需要将数据切分存储到多台机器上。JanusGraph采用的分片方式是按Edge切割,而且对于每一条边,都会被切断。切断后,该边会在起始Vertex上和目的Vertex上各存储一次。通过这种方式,JanusGraph不管是通过起始Vertex,还是从目的Vertex,都能快速找到对端Vertex。
如上述例图:
JanusGraph采用邻接表存储图,存储了顶点的邻接表集合。以顶点为key,顶点的邻接表中包含所有的边,边的属性以及顶点属性。这种存储结构,允许JanusGraph将数据存储在任何支持bigtable的存储后端中。
JanusGraph Data Model:
Bigtabel Data Model:cell(单元格)、column(列)、value(列值):
Vertex id以Rowkey的形式存储在HBase中。共有64个bit,三部分组成:partition id、count、ID padding
后几个bit是ID padding, 表示Vertex的类型。具体的位数长度根据不同的Vertex类型而不同。常用的普通Vertex,其值为’000’。下图是所有可能的ID padding:
2.2 Property
每个Property和Edge都作为一个cell存储在其相邻顶点的行中。它们会被序列化并且column的字节顺序会遵循edge的column中的sort key进行存储。变量id编码方案和压缩对象序列化使每个cell所占存储空间都尽可能小。
可变长度编码方案编码的数字,以减少它们消耗的字节数;Edge和Property在cell中都是由column(列)和value(值)组成。
一个PropertyKey所关联的属性值有可能有一个,也有可能有多个,JanusGraph使用Cardinality来描述这种特点,有三种类型。
SINGLE:HBase的列名只存储Property Key的id。具体的PropertyValue值以及Property id,都存放在Cell的Value中
LIST:Propertyid放在列名中
SET:Propertyid放在列名中
2.2.1 Property Key id
Property Key和EdgeLabel被抽象成了Relation Type,并采用相同的数据结构:
2.2.2 Property id & Property Value
2.3 Edge
2.3.1 Edge Label id + direction
2.3 2 Others
相关文章