hbase列族枚举

graphindex g 103
graphindexlock h 104
janusgraph_ids i 105
edgestore e 101
edgestore lock fs 102
system_properties s 115
systemproperties_lock t 116
systemlog m 109
txlog l 108

详情
HbaseStoreManager.createShortCfMap()

ElementCategory

VERTEX, EDGE, PROPERTY

JanusGraphSchemaCategory

EDGELABEL, PROPERTYKEY, VERTEXLABEL, GRAPHINDEX, TYPE_MODIFIER;

SYSTEM_TYPES_BY_NAME

BaseKey.SchemaCategory 34
BaseKey.SchemaDefinitionDesc 35
BaseKey.SchemaDefinitionProperty 33
BaseKey.SchemaName 32
BaseKey.SchemaUpdateTime 36
BaseKey.VertexExists 1
BaseLabel.VertexLabelEdge
BaseLabel.SchemaDefinitionEdge
ImplicitKey.ID
ImplicitKey.JANUSGRAPHID
ImplicitKey.LABEL
ImplicitKey.KEY
ImplicitKey.VALUE
ImplicitKey.ADJACENT_ID
ImplicitKey.TIMESTAMP
ImplicitKey.TTL
ImplicitKey.VISIBILITY

详情
SystemTypeManager.SYSTEM_TYPES_BY_NAME

点分析

id类型

image.png

id结构

点和边的id都是一个64位的long型数值,结构如下
image.png

id序列化结构

id序列化存储时的结构顺序会做如下变化结构:

image.png

各种类型的id策略

属性和边id在序列化存储时,并不是rowkey,所以规则不一样

image.png

id、rowkey互转

id转rowkey

byte[] rowkey = idManager.getKey(vertexId).asByteBuffer().array();
Result result = hTable.get(new Get(rowkey));

rowkey转id

long id2 = idManager.getKeyID(StaticArrayBuffer.of(result.getRow()));
assert vertexId == id2;

源码
StandardJanusGraph.getVertexIDs()
—RecordIterator.next() ====422行
——idManager.getKeyID(keyIterator.next())

查询label

CacheVertex.label() => AbstractVertex—vertexLabel().name()
——getVertexLabelInternal() 125行
———VertexCentricQueryBuilder.vertices()
————VertexCentricQueryBuilder.execute() 67行
—————BasicVertexCentricQueryBuilder.VertexConstructor.getResult 241

创建点

StandardJanusGraphTx.addVertex(Long vertexId, VertexLabel label) 499
—StandardVertex vertex = new StandardVertex(this, IDManager.getTemporaryVertexID(IDManager.VertexIDType.NormalVertex, temporaryIds.nextID()), ElementLifeCycle.New);

属性和边分析

结构
image.png

点属性名

IDHandler.readRelationType(new ReadArrayBuffer(q)).typeId

点属性值

String vS = new StringSerializer().read(new ReadArrayBuffer(v));

边解析

image.png

id()

CacheEdge.id() => AbstractTypedRelation
—RelationIdentifier.get(this)
——new RelationIdentifier(r.getVertex(0).longId(),r.getType().longId(),r.longId(), (r.isEdge() ? etVertex(1).longId() : 0));
—RelationIdentifier.toString()
——LongEncoding.encode(relationId))

EdgeSerializer
public RelationCache parseRelation(Entry data, boolean excludeProperties, TypeInspector tx)
image.png

边属性

属性名和属性值是存在一起的
EdgeSerializer
PropertyKey type = tx.getExistingPropertyKey(IDHandler.readInlineRelationType(in));
Object propertyValue = readInline(in, type, InlineType.NORMAL);
assert propertyValue != null;
properties.put(type.longId(), propertyValue);

复合索引分析

Composite Index-vertex index结构

图一(唯一索引Composite Index结构图):
composite.png
图二(非唯一索引Composite Index结构图):
composite_only.png
Rowkey由index label idproperties value两大部分组成:

  • index label id:标识当前索引类型
  • properties value:索引中包含属性的所有属性值,可多个; 存在压缩存储,如果超过16000个字节,则使用GZIP对property value进行压缩存储!

Column由第一个字节0vertex id组成:

  • 第一个字节0:无论是唯一索引,还是非唯一索引此部分都会存在;如图一
  • vertex id:非唯一索引才会在column中存在,用于分别多个相同索引值对应的不同节点;如图二

value由vertex id组成:

  • vertex id:针对于rowkey + column查询到的value是vertex id,然后通过vertex id查询对应的节点

    Composite Index-edge index结构

    图一(唯一索引Composite Index结构图):
    JanusGraph数据模型值habse序列化研究 - 图12
    image.png
    图二(非唯一索引Composite Index结构图):
    JanusGraph数据模型值habse序列化研究 - 图13
    image.png
    Rowkey同Vertex index部分
    Column由第一个字节0edge id组成:

  • 第一个字节0:无论是唯一索引,还是非唯一索引此部分都会存在;如图一

  • edge id:非唯一索引才会在column中存在,用于分别多个相同索引值对应的不同节点;如图二

value由以下4部分组成:

  • edge id:边id
  • out vertex id:边对应的出边id
  • type id:edge 的label type id
  • in vertex id:边对应的入边id

    序列化rowkey

    通过复合索引和要查询的值,获取序列化之后的rowkey
    此方法是private,无法直接使用
    IndexSerializer
    private StaticBuffer getIndexKey(CompositeIndexType index, Object[] values)

    反序列化索引关联的点和边的id

    点或边的id
    long id = VariableLong.readPositive(new ReadArrayBuffer(v))

    执行查询

    public Stream query(final JointIndexQuery.Subquery query, final BackendTransaction tx)
    public RelationCache parseRelation(Entry data, boolean excludeProperties, TypeInspector tx)

    边id转换为long型

    边id(格式如:xxx-xxx-xxx-xxxx)转换为RelationIdentifier,拆出边id和点id
    RelationIdentifier string2ElementId(String str)
    image.png

    StandardJanusGraph

    private boolean isValidVertexId(long id) {
    return id>0 && (idInspector.isSchemaVertexId(id) || idInspector.isUserVertexId(id));
    }

    public JanusGraphVertex getVertex(long vertexId) {
    verifyOpen();
    if (null != config.getGroupName()) {
    MetricManager.INSTANCE.getCounter(config.getGroupName(), “db”, “getVertexByID”).inc();
    }
    if (!isValidVertexId(vertexId)) return null;
    //Make canonical partitioned vertex id
    if (idInspector.isPartitionedVertex(vertexId)) vertexId=idManager.getCanonicalVertexId(vertexId);

    1. final InternalVertex v = vertexCache.get(vertexId, externalVertexRetriever);<br /> return (null == v || v.isRemoved()) ? null : v;<br />}

    参考