知识是永远的流行色!
码友们,点赞再看,养成好习惯~
一:存储模式
留言或私信我,邀请你加入“图数据库交流”微信群!
1、图内容
本文以下所有内容基于:JanusGraph基于属性图来进行构造图数据:
属性图: 属性图是由 顶点(Vertex),边(Edge),属性(Property)组成的有向图
Vertex可以包含Properties;Edge也可以包含Properties;
2、存储方法
图存储的方式常用的有两种:邻接列表 和 邻接矩阵
JanusGraph采用邻接列表进行图数据的存储,如下图所示:(此处将图中节点抽象为 只有节点,没有属性)
在Janusgraph中一个顶点的邻接列表包含该节点对应的属性和关联的边,下述会详细说明 Janusgraph中邻接列表是如何实现的;
3、图切割方式
图的切割方式分为两种:按节点切割(Vertex Cut)和按边切割(Edge Cut)
Vertex Cut:根据点进行切割,每个边只存储一次,只要是节点对应的边便会多一份该节点的存储
Edge Cut:根据边进行切割,以节点为中心,边会存储两次,源节点的邻接列表存储一次,目标节点的邻接列表存储一次
在Janusgraph中既存在Edge Cut,也存在Vertex Cut的情况;
在默认的情况下使用边切割,而针对热点节点可以通过配置makeVertexLabel('product').partition()来将节点类型为product类型的节点进行Vertex Cut;
也就是说,在没有上述makeVertexLabel('product').partition()配置的话,JanusGraph所有的图数据都是以Edge Cut的方式来进行切割存储的;
具体可以查看文章:《JanusGraph-分区》中自定义分区部分中关于图切割部分的介绍;
我们例子来说明一下:
如下图: 张三用户节点通过手机号关联出来李四用户节点
张三 和 李四 代表Vertex;指向的name、age、gender代表张三的属性
edgeA 和edgeB 代表Edge;也可以包含边的属性,例如下图中边包含属性create_time
按边切割后:
节点
张三
name(property)
age(property)
gender(property)
edgeA(edge)
phone
phone(property)
edgeA(edge)
edgeB(edge)
李四
name(property)
age(property)
gender(property)
edgeB(edge)
上述可以看到,按照边切割后每一条边会存储两次!
二:BigTable模型
在JanusGraph的存储中, JanusGraph将图形的邻接列表的表示存储在支持Bigtable数据模型的任何存储后端中
BigTable模型如下图:
在Bigtable数据模型中,每个表是行的集合,由一个key唯一标识。
每行由任意(可以很大数量但是必须有限数量)数量的cell组成;cell由column和value组成,column唯一标识某一个cell。
上述图中,有两部分需要排序的支持:sorted by key 和 sorted by column:
sorted by key:标识存储后端存储的数据时按照key的大小进行排序存储的
sorted by column:这是JanusGraph对Bigtable数据模型有一个额外要求,存储edge(边)的单元格必须按column排序,并且列范围指定的单元格子集必须是有效可检索的; 这句话详细解答在下述文章中有体现
在Bigtable模型中的行称为“宽行”,因为它们支持大量cell,并且不必像关系数据库中那样预先定义这些cell的column。
在关系型数据库中我们必须先定义好表的schema,才可以存储数据,如果存储过程中想要改变表结构,则所有的数据都要对变化的列做出变化。但是Bigtable模型存储中就不必如此,每个行的column不同,我们可以随时仅对某一行进行变化,也不许预先定义行的schema,只需