1、JanusGraphElement
Element分为三种:Edge、Property、Vertex
Element的lifecycle: New=1、Loaded=2、AddedRelations=3、RemoveRelations=4、Modified=5、Removed=6
能够操作Element状态的事件Event={REMOVED、REMOVED_RELATION、ADDED_RELATION、UPDATE}
一个最基础的Element包含一个事务tx、id和lifecycle。
2、JanusGraphSchemaCategory包含五种:
EDGELABEL、VERTEXLABEL、PROPERTYKEY、GRAPHINDEX、TYPE_MODIFIER。
前几种都有name,最后一种没有。
EDGELABEL和PROPERTYKEY在构建时Janus为其加上一个前缀作为标识’rt’, GRAPHINDEX的前缀为’gi’,VERTEXLABEL的前缀为’vl’。
此枚举有一个很重要的作用就是检验是否是有效的定义。
3、最基础的BaseLabel、BaseKey、BaseVertexLabel、BaseRelationType
BaseRelationType定义了一个Relation的基本结构,包含String name、Long id、JanusGraphSchemaCategory type,继承了EmptyRelationType实现了SystemRelationType接口。通过getSystemTypeId(id, type)获取不同的种类的Id,以区分EdgeLabel和PropertyKey。
BaseLabel定义了两种最基本的结构,继承了BaseRelationTyoe,实现了EdgeLabel接口。包含的参数有name、id、EDGELABEL,directionality、multiplicity,
共有两种情况:
- SchemaDefinitionEdge分别对应上面的参数为:SchemaRelated,36,Direction.BOTH、Multiplicity.MULTI
- VertexLabelEdge分别对应上面的参数为:vertexlabel,2,Direction.OUT、Multiplicity.MANY2ONE
补充:Direction包含OUT、IN、BOTH。
Multiplicity包含MULTI(multi-graph)、SIMPLE(single-graph)、ONE2MANY(1进多出)、MANY2ONE(多进1出)、ONE2ONE(1进1出)。
Cardinality包含SET、LIST、SINGLE。Multiplicity与Cardinality之间可以进行转换,LIST=MULTI,SET=SIMPLE,SINGLE=MANY2ONE。
BaseKey定义了六种的基本结构,继承了BaseRelationTyoe,实现了PropertyKey接口。包含的参数有name、datatype、PROPERTYKEY、id、index、cardinality
包含以下几种情况:
- VertexExists分别对应参数为:VertexExists, Boolean.class, 1, Index.NONE, Cardinality.SINGLE。
- SchemaName分别对应的参数为:SchemaName, String.class, 32, Index.UNIQUE, Cardinality.SINGLE
- SchemaDefinitionProperty分别对应的参数为:SchemaDefinitionProperty, Object.class, 33, Index.None, Cardinality.LIST
- SchemaCategory分别对应的参数为: SchemaCategory, JanusGraphSchemaCategory.class, 34, Index.STANDARD
- SchemaDefinitionDesc分别对应的参数为:SchemaDefinitionDescription, TypeDefinitionDescription.class, 35, Index.NONE, Cardinality.SINGLE
- SchemaUpdateTime分别对应的参数为:SchemaUpdateTimestamp, Long.class, 36, Index.NONE, Cardinality.SINGLE
BaseKey中的SchemaName和SchemaCategory中含有index,类型为CompositeIndex,通过getKeyIndexes()可以获得当前key上的ComIndex。
BaseVertexLabel定义了VertexLabel的基本结构,继承了EmptyVertex,实现了InternalVertexLabel接口。包含一个基本类型vertex,一个name。还有Vertex的一些属性,properties和Connections都是一样以Collection->ArrayList的形式存在。
4、EdgeLabel、PropertyKey、VertexLabel
EdgeLabel是RelationType的一种,定义了Janus中边的label结构,具体包含以下特征。1、有向性(isDirected)or(isUniDirected);2、多样性(一对多、多对一、一对一详细请看Multiplicity);3、属性(边所包含的属性collection);4、连接(边的连接collection)。是个接口。它继承了RelationType,有两个子类。EdgeLabelVertex和BaseLabel。
PropertyKey也是RelationType的一种,定义了Property的Key结构,包含了一个DataType和一个Cardinality(SINGLE,SET,LIST)分别表明了可以存放Property的数据类型和存放特性。是个接口。它继承了RelationType,有三个子类,PropertyKeyVertex、ImplicitKey、BaseKey。
VertexLabel定义了Vertex的Label结构,具体包含以下特征。1、是否被分割(isPartitioned),表明当前Vertex是否被分割后存储在不同数据库;2、是否是静态(isStatic),表明创建后不能被修改。3、属性(顶点所包含属性collection)。4、连接(顶点的连接collection)。它继承了JanusGraphVertex和JanusGraphSchemaType,有一个子接口InternalVertexLabel,这个接口下又含有两个子类BaseVertexLabel和VertexLabelVertex。
总结,上边三种定义了Janus了一个Edge、Vertex、Property最基本的组成,但是想要把它们存储起来,还需要定义他们存储时需要附加的其他信息,以便唯一区分。
5、VertexLabelVertex、PropertyKeyVertex、EdgeLabelVertex、RelationTypeVertex
VertexLabelVertex继承了JanusGraphSchemaVertex,实现了InternalVertexLabel,而InternalVertexLabel继承自vertexLabel,相对于vertexLabel来说,多出了tx, id, lifecycle, 还有一个TTL。同时多了isPartitioned、isStatic等关于Vertex的一些基本设置,,还有实现了当前顶点包含的Properties和connections。
PropertyKeyVertex继承了RelationTypeVertex,实现了PropertyKey,大部分的功能在RelationTypeVertex实现,此处是用来与EdgeLabel区分,其内容包含了dataType、Cardinality和isProperty,与其他两个相比少了Properties和Connections,这也好理解,因为在Janus中,只有边和顶点有属性。
EdgeLabelVertex继承了RelationTypeVertex,实现了EdgeLabel,其内容包含了检测当前label是够为双向或者单向的,还有实现了当前顶点包含的Properties和connections以及isEdgeLabel。
RelationTypeVertex 继承了JanusGraphSchemaVertex,实现了InternalRelationType。从类的类型上来看,此类对标的是VertexLabelVertex,因为Property和EdgeLabel在Janus中都是关系。此类对他俩做了抽象,定义了关于关系的一系列操作。
6、JanusGraphSchemaVertex
首先说类构造,tx, id, lifecycle都继承于CacheVertex,定义了自身String类型私有的name,私有的TypeDefinitionMap类型的definition,ListMultimap<TypeDefinitionCategory, Entry>类型的outRelations,ListMultimap<TypeDefinitionCategory, Entry> inRelation
7、CacheVertex
包含了一个事务tx,一个id,一个lifecycle。并且多出了一个Map<SliceQuery, EntryList>类型的queryCache来提供查询。
8、StandardEdge、StandardPropertyKey
StandardEdge比EdgeLabel多出了一个Long类型的id和两个InternalVertex 类型的顶点,分别为start和end,还有标识生命周期的lifecycle。id用来唯一辨识一个边,两个顶点分别表示了edge连接的顶点,start表示从哪个顶点开始,end表示到哪个顶点结束。其自身还定义了PreviousID和Map<PropertyKey, Object>类型的properties。
StandardPropertyKey代码与StandardEdge基本相同
9、StandardVertex
相对于AbstractVertex,多出了一个Object类型的lifecycleMutex,一个byte类型的lifecycle和一个AddRelationsContainer类型的addedRelations,这个addedRelation的作用就是用来保存该顶点上所有新增的systemRelation,在commit时提交给存储后端。 AddedRelationContainer是一个接口,定义了relation的add、remove、getView、isEmpty、getAll等方法,且定义了一个EMPTY的内部AddedRelationContainer对象。有两个实现类SimpleAddedRelations和SimpleBufferAddedRelations,这两个类又有各自的子类ConcurrentAddedRelations和ConcurrentBufferAddedRelations。
SimpleAddedRelation是一个ArrayList,内部装的是InternalRelation,初始化长度为10,是在单线程环境下使用。其子类ConcurrentAddedRelation是在并发作业中发挥作用。
SimpleBufferAddedRelations是一个缓存类,定义了初始化增加的ArrayList大小=10,初始化初始化删除大小=10,和最大删除大小=500。其内部也是维护了两个ArrayList,added和deleted,主要作用是实现了AddedRelationContainer。其子类也是保证了实现时同步。
10、AbstractVertex
包含了一个事务tx和一个id
11、AbstractEdge、AbstractVertexProperty
AbstractEdge比EdgeLabel多出了一个Long类型的id和两个InternalVertex 类型的顶点,分别为start和end,id用来唯一辨识一个边,两个顶点分别表示了edge连接的顶点,start表示从哪个顶点开始,end表示到哪个顶点结束。除了以上几点,此抽象类还实现了一些关于边的基本操作方法。
AbstractVertexProperty比PropertyKey多出了一个Long类型的id,一个InternalVertex类型的顶点type,一个Object类型的value,可以看出与AbstractEdge的区别就在于其中一个InternalVertex换成了Object。此外,也实现了一些关于属性的操作方法。·
总结,按照对比此处应该还有个AbstractVertexLabel,但我们仔细想一下,上边AbstractEdge和AbstractVertexProperty已经把如何连接Vertex定义好了结构。而Janus中所有的Element最后都转换为Vertex进行存储,所以此处就没有多此一举的对AbstractVertexLabel进行定义。
本文深入探讨了JanusGraph的元素、数据模型和存储结构,包括Edge、Property、Vertex的生命周期,SchemaCategory的种类及用途,以及各种基础类如BaseLabel、BaseKey的结构与功能。
855

被折叠的 条评论
为什么被折叠?



