下图是hugegraph 图模型的类结构
想要自己做图数据库建模的,可以参考它的实现。

Nameifable
实现这个接口,代表子类可以使用一个 name 来唯一的表示。
使用的场景不多,对于一个hugeVertex节点,只有当其ID策略为Primary Key的时候,
才有name,比如一个公司,我们以ticker作为primary key,那么它就可以使用ticker作为name。
这个是hugegraph里的约定。
Typifable
public interface Typifiable {
// Return schema/data type
public HugeType type();
}
hugeTyep 是一个枚举
/* Schema types */
VERTEX_LABEL(1, "VL"),
EDGE_LABEL(2, "EL"),
PROPERTY_KEY(3, "PK"),
INDEX_LABEL(4, "IL"),
/* Data types */
VERTEX(101, "V"),
// System meta
SYS_PROPERTY(102, "S"),
// Property
PROPERTY(103, "U"),
// Edge
EDGE(120, "E"),
// Edge's direction is OUT for the specified vertex
EDGE_OUT(130, "O"),
// Edge's direction is IN for the specified vertex
EDGE_IN(140, "I"),
SECONDARY_INDEX(150, "SI"),
RANGE_INDEX(160, "RI"),
SEARCH_INDEX(170, "FI"),
实现了这个接口,代表子类是一个Hugegraph类型,比如Label,Vertex,Edge,PROPERTY等。
hugegraph 依托与hugeType会对不同Element有很多不同操作。
GraphTYpe
graphType完全extends Namifiable 和Typifible 接口,没有其他操作。
HugeElement
HugeElement是一个抽象类,主要是为后面的Vertex和Edge打基础,把他们公共的东西抽取出来。
不管是Vertex还是Edge,他们公共的就是属性, 以及对于他们元数据的描述。
所以我们看到 HugeElement一大部分内容就是关于属性操作的。
主要的方法包括:
private <V> HugeProperty<V> addProperty(PropertyKey pkey, V value,
public <V> HugeProperty<?> removeProperty(Id key);
public <V> HugeProperty<?> setProperty(HugeProperty<V> prop)
public <V> V getPropertyValue(Id key)
public abstract SchemaLabel schemaLabel();
protected abstract GraphTransaction tx();
HugeVertex/hugeEdge
protected GraphTransaction tx;
protected VertexLabel label;
protected String name;
protected Set<HugeEdge> edges;
public HugeVertex(final GraphTransaction tx, Id id, VertexLabel label) {
this(tx.graph(), id, label);
this.tx = tx;
this.fresh = true;
}
该类继承自HugeElement,可以对属性进行各种操作,在这个类中计入了节点特有的方法。
它的field包括
- VertexLable,是对于这个节点schema的描述信息
- edges,是维护这个节点对外连接的边。
- transaction,则是运行时的概念,当节点需要操作数据,比如删除一条边的时候,就会调用
transaction的方法。
hugeVertex比较重要的方法
- addEdge
- addOutEdge
- addInEdge
- getEdge,removeEdge
- assignId, 对于使用automaticId的节点,需要生成Id,hugegraph使用了snowflakeId算法,这是一个高效的分布式全局唯一ID算法。
另外我们看到 hugeVertex除了继承HugeElement外还是实现了tinkerpop的标准 vertex 接口。
这一点很重要,在后面的查询中会有体现,可以利用很多tinkerpop和gremlin的特性。
hugeEdge和hugeVertex实现的逻辑一样,并且实现了thinkerpop的Edge接口,有兴趣可以参考HugeEdge类的实现。
schema部分
- shemaElement,hugegraph schema建模的基础类,主要包含了ID,name,status 等信息
- 子类1 IndexLabel,如果一个节点或者边定义了Index,则IndexLabel可以描述索引类型是一级索引或是二级,所依赖的节点,以及为哪些property建立索引。
- 子类 PropertyKey, 主要是描述节点的属性,比如数据类型,是否是集合属性等。
- 子类 VertexLabel,描述这个节点的Id策略,是自定义,还是自增;以及这个节点的主键,如果是复合主键,属性都有哪些。
- 子类 EdgeLabel,描述边的边的类型,是否相同两个节点多条边,如果支持 对应的sortKey 都有哪些。
网友评论