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类型
id结构
id序列化结构
各种类型的id策略
属性和边id在序列化存储时,并不是rowkey,所以规则不一样
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);
属性和边分析
点属性名
IDHandler.readRelationType(new ReadArrayBuffer(q)).typeId
点属性值
String vS = new StringSerializer().read(new ReadArrayBuffer(v));
边解析
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)
边属性
属性名和属性值是存在一起的
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 Index结构图):
Rowkey由index label id
和properties value
两大部分组成:
- index label id:标识当前索引类型
- properties value:索引中包含属性的所有属性值,可多个; 存在压缩存储,如果超过
16000
个字节,则使用GZIP
对property value进行压缩存储!
Column由第一个字节0
和 vertex id
组成:
- 第一个字节0:无论是唯一索引,还是非唯一索引此部分都会存在;如图一
- vertex id:非唯一索引才会在column中存在,用于分别多个相同索引值对应的不同节点;如图二
value由vertex id
组成:
vertex id:针对于rowkey + column查询到的value是vertex id,然后通过vertex id查询对应的节点
Composite Index-edge index结构
图一(唯一索引Composite Index结构图):
image.png
图二(非唯一索引Composite Index结构图):
image.png
Rowkey同Vertex index部分
Column由第一个字节0
和edge 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