美文网首页
五 hugegraph源代码 - 图模型

五 hugegraph源代码 - 图模型

作者: NazgulSun | 来源:发表于2019-06-21 17:23 被阅读0次

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


image.png

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 都有哪些。

相关文章

网友评论

      本文标题:五 hugegraph源代码 - 图模型

      本文链接:https://www.haomeiwen.com/subject/oijuqctx.html