首发于 图数据库

Titan/JanusGraph图数据库实战总结与深入分析

TitanDB/JanusGraph图数据库入门简介|实战总结|选型对比|存储结构深入分析

历史背景

JanusGraph图数据库,源自于TitanDB开源图数据库。TitanDB在2012年发布第一个版本,2015年被Datastax公司收购,后续不再维护导致项目停滞。

图数据库有2个最具代表性的查询语言:Cypher 及 Gremlin。Cypher是商业公司Neo4j出品,Neo4j图数据库在2007年发布了第一个版本,是商用图数据库领域的开拓者。Gremlin是Apache TinkerPop框架下规范的语言,TinkerPop属于当前图数据库领域最流行的框架规范,具备开源开放、功能丰富、生态完善等特点,拥有大量厂商支持(超过20家),Titan当属TinkerPop框架下最成功的开源图数据库实现,后续的不少图数据库或多或少借鉴了Titan的思想,Titan的几位核心作者包括:Dan、Matthias、Marko(okram)、Stephen(spmallette)等,其中的两位--Marko和Stephen同时也是TinkerPop的核心作者。个人在此致敬Titan和TinkerPop。

非常令人遗憾的是,Titan在2015年被收购后,其开源社区无人维护,否则以其前三年的势头来看,大有一统图江湖的趋势,不过没有如果。而Janus稍许弥补了这个遗憾,也算是后继之人,但是Janus绝大部分功能沿袭自Titan,没有更上一个台阶发扬光大,只是做了一些小修补。下面是对Titan/Janus的一些总结和分析。

2016年由其他人基于Titan源码Fork出了Janus,到目前(2020年)Janus已经合入了700多个Pull Request,主要包括:

总结来说,在大方向上Janus对Titan改进并不多,主要包括2方面:

整体架构

整体架构

Janus整体架构分为3层,中间层是图引擎,最底层是存储层,最上层是应用程序层:

数据模型/存储结构(整体)

数据模型/存储结构(整体)
图概念简介:图的核心是顶点和边,顶点代表现实世界中的实体,边代表现实世界中的关系,“我喜欢你”就可以抽象为两个顶点和一条边,同时顶点和边还可以有属性。

图是如何被存储的?在Titan/Janus中,使用的是邻接表存储结构(见上图,另一种流行的结构是Neo4j的邻接链表)。比对着上图来详细看:Janus把每个顶点的数据存为一行,当插入图数据时,会为每个顶点分配一个递增的Long类型ID(vertex id),查询的时候使用这个ID来进行索引查找。顶点的数据包括两方面内容:顶点属性(property)和邻接边(edge),每个顶点属性存为一列,每条邻接边也存为一列,列内部的详细结构见下一部分。

数据模型/存储结构(边及属性)

数据模型/存储结构(边及属性)

一个顶点的各顶点属性和边数据是按照顺序排列的,内部规则如下:

Janus这种存储结构的优点是:

针对上述第2个场景,邻接链表的存储结构是难于进行类似性能优化的。因此当一个顶点的邻接边超多时,即使用户只需要查询其部分邻接边,也还是需要从磁盘先读取所有邻接边,从而导致性能低下。

Janus大功能总结

Janus官方公布的技术限制:

  1. 最大支持2^60条边。
  2. 虽然允许定义Object类型,但是为了性能考虑,依然建议定义确切的类型。
  3. 根据ID获取一条边时,代价是O(log(k)),与邻接点的关联邻接边数量有关。(注:感觉官网说的有错误,理论上应该是与边的总数有关,代价是O(log(N))比较合理)
  4. 并发删除与更新操作,可能导致残留顶点的部分属性或边。
  5. 边不允许在跨事务中使用,包括创建或查询出来的边。

Janus实战问题总结:

  1. 只允许自动生成ID,不支持主键ID或用户自定义ID。当数据规模达到10亿并有大量覆盖写需求时,需要建立索引并在写之前进行大量随机读操作,导致整体性能严重降低。
  2. 大规模数据读取,返回大量查询结果时会爆内存,无法将全量数据读到客户端。
  3. 顶点的 [属性]列表 和 [邻接边]列表 两种数据存在一起(cells in a row),顶点和边读写性能相互影响严重。
  4. 顶点属性存为多个列(cell),其实并不利于OLTP查询性能,写入的KV对数量也增大若干倍。
  5. 边和属性存储了多余的ID,属性ID和边ID实际作用不大。
  6. 忽视后端存储的区别,所有的后端都当成是KV存储,使用大一统的序列化封装,以至于大部分默认的操作把整个顶点的邻接边和属性都读出来,浪费了IO资源、代价很大。
  7. 没有针对性的根据后端存储进行优化,比如数据类型、查询/计算下推等优化。
  8. 模糊索引依赖ES、Solr等外部系统,存在运维问题和双写问题。具体而言,部署运维麻烦,数据量大的时候问题很多,需要依赖ES专业人员调优;双写则引入额外问题,比如:数据一致性、图和索引两种后端性能不匹配、数据同步与稳定性等问题。(如:Vertex TTL does not remove indexed value from ES mixed index #987 )
  9. 元数据与索引的创建方式略复杂,配置项过多也导致运维难度增大。
  10. 缺少常用的图算法库,比如路径搜索、相似性等算法。
  11. 缺少导入数据、可视化界面、备份恢复等工具链。有一些第三方工具可供集成,但配置和使用起来都不是很友好。


面对这些问题,我们是如何解决的?请听下回分解。


原文链接:


Janus参考资料:

配置项文档:

docs.janusgraph.org/bas


技术限制:

docs.janusgraph.org/bas

docs.janusgraph.org/bas


数据类型支持:

docs.janusgraph.org/ind

docs.janusgraph.org/bas


索引介绍:

docs.janusgraph.org/ind

docs.janusgraph.org/ind


数据模型:

docs.janusgraph.org/adv


高级特性:

docs.janusgraph.org/adv


第三方可视化界面集成:

Arcade Analytics, Cytoscape, Gephi plugin for Apache TinkerPop, Graphexp, Key Lines by Cambridge Intelligence, Linkurious and Tom Sawyer Perspectives.


Janus版本增强:

github.com/JanusGraph/j

github.com/JanusGraph/j

代做工资流水公司柳州工资银行流水制作鞍山企业银行流水样本黄冈查工资证明厦门查询工资银行流水泰州对公账户流水公司烟台做公司流水薪资银行流水样本阜阳车贷银行流水 报价开封代办签证银行流水漳州入职银行流水报价廊坊贷款工资流水 办理宜春银行流水单代做大庆入职工资流水代做济宁自存流水图片舟山企业对私流水样本荆州背调流水查询汕头查银行流水保定签证流水模板厦门代办银行流水修改南昌转账流水信阳开工作收入证明芜湖做房贷工资流水莆田办银行流水账海口银行流水账单公司泰安代做背调银行流水兰州做企业流水打印江门工资流水单报价南昌打日常消费流水盐城转账流水代办合肥个人工资流水 多少钱香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

代做工资流水公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化