如题,本文讲述向HugeGraph写入一个Vertex(PRIMARY_KEY ID策略为例),存到RocksDB中会生成几个KV
说在前面:此文仅为个人学习笔记分享,工作中涉及到对HugeGraph做二次开发,所以涉及到对这方面的一些源码阅读,若有不足或错误之处欢迎指出。
HugeGraph版本:0.10.4
存储端:RocksDB
序列化方式:binary
HugeGraph对用户显示的格式
即将插入的Vertex
插入vertex之前,已经插入的propertyKey
插入vertex之前,已经插入的vertexLabel
插入后的vertex
HugeGraph做了什么
在源码中,HugeGraph会把要插入的Vertex对应的Json串先转换成对应的HugeVertex对象,然后转换成待插入到RocksDB的BackendEntry,BackendEntry中有BackendColumn,这个BackendColumn是一个要存到RocksDB的kv。一个BackendEntry中有多个BackendColumn,如图。
源码分析
GraphTransaction中在insert前,会做此序列化操作,所有属性的转换都是基于源码中一个名为BytesBuffer的类,先写到BytesBuffer,再获取byte[]
HugeVertex —> BackendEntry
进来这个方法我们可以看到:
formatLabel会把label信息封装成column
formatProperty会把属性封装成多个column
每个column的name是存到RocksDB的key,column的value是存到RocksDB的value
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[]
进入这个生成name的方法,看看是如何转换的
可以看出,这里会把id和HugeType和keyType的code写到buffer中
看看往buffer中写id做了什么
这里只截出String类型的id,可以看出是一些校验和位运算,然后写入buffer
formatProperty
看formatProperty结果
key:vertexId+hugeType+propertyId转byte[]
value:property的value转byte[]
value可以直接看出,就是property的value转byte[]
看看name是如何生成的
显然,会写入Vertex的id,hugeType的code和propertyKey的id
结论
综上,一个这样的vertex通过HugeGraph存到RocksDB,会变成1+N个kv,1指label,N是property的个数。
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中的截图有区别。