JanusGraph采用邻接表(adjacency list)的方式存储图,也即图以顶点(vertex)和其邻接表组成。邻接表中保存某个顶点的所有入射边(incident edges)。
通过将图采用邻接表的形式存储,JanusGraph确保了某个顶点的所有入射边和属性都被紧凑的存储在一起,从而能够加快遍历速度,缺点是数据存储了两次。而且JanusGraph以sort key指定的顺序存储数据。
JanusGraph可以采用任何支持big table数据模型的存储后端存储邻接表。

Bigtable Data Model


在Bigtable data model下,表就是行的集合。每个行都唯一的由一个key标识,每行由大量的cell组成。一个cell是由列和值组成的。一个cell唯一的由指定行的制定列所标识。行在bigtable模型中称为“宽行”,表因此称为“宽表”。cell的数量可以非常大,而且不需要预定义。

JanusGraph对bigtable数据模型有一个特殊的要求:cell必须是根据列来排序的,而且由column制定的cell的子集必须可以高效查询。

而且,如果bigtable实现可以根据行的key排序,JanusGraph则可以利用该特性实现更高的图遍历性能。

JanusGraph Data Layout


JanusGraph将每个邻接表作为以个row保存在存储后端,64位的vertex id是指向邻接表的key。每个边和属性都是作为独立的cell保存的,以实现更高效插入和删除。没行中最大能保存的cell的个数,也就是vertex的edge的数量限制。

Individual Edge Layout


每个edge和property都作为邻接表的一个cell存储,并通过序列化之后,byte order即表示了edge label的sort key。variableid对schema进行编码和压缩来节省空间。上图中深蓝色的色块表示了对schema进行编码压缩后的ID,用以减少存储消耗。红色快代码一个或多个属性值,该值也被压缩并关联到属性key上。灰色块代表未压缩的属性值,如(序列化的OBJECT)。

Edge有edge label唯一ID开始,并附加一个表示方向的数据位;之后有属性key组成的排序键,再之后是邻接表IDD,和边ID。Janus并不保存实际的vertex id,而是相对于邻接表的偏移量,因其比压缩更节省空间。value部分保存了序列化后的值。

对于属性来说就简单一点,column是属性的key id,property id和property key保存在value部分,如果property key被定义为LIST,property id也保存在列中。

总结

对于理解JanusGraph的存储,关键在于理解其bigtable的邻接表存储结构,而在邻接表中保存了边(包括边的属性)及vertex的属性。
由于边是由两个vertex定义的,故肯定存在有edge的重复保存,这增加了存储空间,但通过冗余也提高了查询效率。
最后是每个邻接表:行,的数据结构,对于一般的应用场景,我们没有必要深入到行存储中去,只是了其存储的一般原理即可。

JaunsGraph数据模型的更多相关文章

  1. MongoDB学习笔记~数据模型属性为集合时应该为它初始化

    回到目录 今天要说一下技术点,我们在设计mongodb的数据模型时,如果属性是数组或者集合类型,我们在模型初始化时,需要为它们初始化一下,否则在数据库里将会被存储为NULL,当被存储为NULL时,我们 ...

  2. 从零自学Hadoop(20):HBase数据模型相关操作上

    阅读目录 序 介绍 命名空间 表 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,SourceLink 序 ...

  3. Entity Framework 教程——创建实体数据模型

    创建实体数据模型: 本文将带你创建实体数据模型(EDM)SchoolDB数据库和理解基础建设模块. 实体数据模型(EDM)是用于描述实体之间关系的一种模型,以下将使用Visual Studio 201 ...

  4. ZooKeeper:数据模型

    ZooKeeper数据模型 ZNode ZNode 分类 Stat Watcher Watcher工作原理 Watcher事件说明 Watcher注册 事件发布 示例 ZooKeeper 数据模型 整 ...

  5. 从零自学Hadoop(21):HBase数据模型相关操作下

    阅读目录 序 变量 数据模型操作 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,SourceLink 序 ...

  6. ExtJS 数据模型

    自定义数据模型 数据模型类其实就是一个继承自Ext.data.Model 的类. Ext.define('MyApp.User', { extend: 'Ext.data.Model', fields ...

  7. 在powerdesigner中创建物理数据模型

    物理数据模型(PDM)是以常用的DBMS(数据库管理系统)理论为基础,将CDM/LDM中所建立的现实世界模型生成相应的DBMS的SQL语言脚本.PDM叙述数据库的物理实现,是对真实数据库的描述 PDM ...

  8. Visual 2015创建新项,缺少ADO.NET 实体数据模型的解决方法

    现在的某度查资料真的很麻烦,突然我自身的VS2015创建EF的时候找不到 ADO.NET 实体数据模型,但是使用CodeFrist是可以生成数据表的.所有特别郁闷. 打开界面如下 某度半天,都没有查出 ...

  9. ASP.NET MVC 5 - 给数据模型添加校验器

    在本节中将会给Movie模型添加验证逻辑.并且确保这些验证规则在用户创建或编辑电影时被执行. 拒绝重复 DRY ASP.NET MVC 的核心设计信条之一是DRY: "不要重复自己(DRY ...

随机推荐

  1. 洛谷 P1583 魔法照片【二级结构体排序】

    题目描述 一共有n(n≤20000)个人(以1--n编号)向佳佳要照片,而佳佳只能把照片给其中的k个人.佳佳按照与他们的关系好坏的程度给每个人赋予了一个初始权值W[i].然后将初始权值从大到小进行排序 ...

  2. Oracle alter table modify column Syntax example

    http://www.dba-oracle.com/t_alter_table_modify_column_syntax_example.htm For complete tips on Oracle ...

  3. 某考试 T2 orzcyr

    非常nice的一道行列式的题目. 考虑如果没有路径不相交这个限制的话,那么这个题就是一个行列式:设 a[i][j] 为从编号第i小的源点到编号第j小的汇点的路径条数,那么矩阵a[][]的行列式就是的答 ...

  4. [CF403D]Beautiful Pairs of Numbers

    题意:给定$n,k$,对于整数对序列$\left(a_1,b_1\right),\cdots,\left(a_k,b_k\right)$,如果$1\leq a_1\leq b_1\lt a_2\leq ...

  5. [Interview]读懂面试问题,在面试官面前变被动为主动

    面试是供需双方心理的较量,作为求职者来说,了解对方问题的内涵,做到“明明白白他的心”,就能变被动为主动.因此,读懂面试问题,掌握面试考官的提问的目的,有准备.有针对性地回答,对提高应聘的成功率是有很大 ...

  6. 泳池迷宫(p24)

    /*2018年8月26日15:55:29作者:冰樱梦page-24泳池迷宫*/public class swiming{public static void main(String[] args){i ...

  7. 微服务之SpringCloud实战(四):SpringCloud Eureka源码分析

    Eureka源码解析: 搭建Eureka服务的时候,我们会再SpringBoot启动类加上@EnableEurekaServer的注解,这个注解做了一些什么,我们一起来看. 点进@EnableEure ...

  8. Problem M: 第几天——C语言初学者百题大战之十八

    #include<stdio.h> int main() { int a,b,c,s; scanf("%d-%d-%d",&a,&b,&c); ...

  9. Linux下使用Shell过滤重复文本(转)

    ffffffffffffffffff ffffffffffffffffff eeeeeeeeeeeeeeeeeeee fffffffffffffffffff eeeeeeeeeeeeeeeeeeee ...

  10. 利用hsdis和JITWatch查看分析HotSpot JIT compiler生成的汇编代码

    http://blog.csdn.net/hengyunabc/article/details/26898657