百度开源图数据库HugeGraph与RocksDB映射关系

如题,本文讲述向HugeGraph写入一个Vertex(PRIMARY_KEY ID策略为例),存到RocksDB中会生成几个KV

说在前面:此文仅为个人学习笔记分享,工作中涉及到对HugeGraph做二次开发,所以涉及到对这方面的一些源码阅读,若有不足或错误之处欢迎指出。

HugeGraph版本:0.10.4
存储端:RocksDB
序列化方式:binary

HugeGraph对用户显示的格式

即将插入的Vertex
要插入的Vertex
插入vertex之前,已经插入的propertyKey
插入vertex之前,已经插入的propertyKey
插入vertex之前,已经插入的vertexLabel
插入vertex之前,已经插入的vertexLabel
插入后的vertex
插入后的vertex

HugeGraph做了什么

在源码中,HugeGraph会把要插入的Vertex对应的Json串先转换成对应的HugeVertex对象,然后转换成待插入到RocksDB的BackendEntry,BackendEntry中有BackendColumn,这个BackendColumn是一个要存到RocksDB的kv。一个BackendEntry中有多个BackendColumn,如图。
HugeGraph做了什么

源码分析

GraphTransaction中在insert前,会做此序列化操作,所有属性的转换都是基于源码中一个名为BytesBuffer的类,先写到BytesBuffer,再获取byte[]
HugeVertex —> BackendEntry
序列化
进来这个方法我们可以看到:
formatLabel会把label信息封装成column
formatProperty会把属性封装成多个column
每个column的name是存到RocksDB的key,column的value是存到RocksDB的value
writeVertex

formatLabel

先直接说formatLabel结果
key:vertexId+hugeType+keyType转byte[]
value:label的id转byte[]
注:
keyType指的是key的类型,这里的类型是label,具体类型可参考源码中HugeKeys这个枚举类
hugeType指的是数据类型,可参考源码中HugeType这个类

如图可以看出,name是id+keyType转byte[],value存的是label的id转byte[]
formatLabel
进入这个生成name的方法,看看是如何转换的
可以看出,这里会把id和HugeType和keyType的code写到buffer中
format
看看往buffer中写id做了什么
这里只截出String类型的id,可以看出是一些校验和位运算,然后写入buffer
writeId

formatProperty

看formatProperty结果
key:vertexId+hugeType+propertyId转byte[]
value:property的value转byte[]

value可以直接看出,就是property的value转byte[]
format
看看name是如何生成的
显然,会写入Vertex的id,hugeType的code和propertyKey的id
format

结论

综上,一个这样的vertex通过HugeGraph存到RocksDB,会变成1+N个kv,1指label,N是property的个数。
body
labelKey:vertexId+hugeType+keyType转byte[]
labelValue:label的id转byte[]
propKey:vertexId+hugeType+propertyId转byte[]
propValue:property的value转byte[]

-------------------------------------手动分割线-2021.01更新---------------------------------------------

上文是0.10.4的Hugegraph,最近0.11.2的Hugegraph发布了,映射关系有变,现在是一个Vertex存入RocksDB对应一个kv了。新版本相关核心代码截图如下。可以看到此方法中的edtry.colum()部分与0.10.4中的截图有区别。
新版截图

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值