zoukankan      html  css  js  c++  java
  • JanusGraph的schema及数据建模

    每个JanusGraph都有一个schema,该schema由edge labels, property keys和vertex labels组成。JanusGraph的schema可以显式或隐式创建,推荐用户采用显式定义的方式。JanusGraph的schema是可以在使用过程中修改的,而且不会导致服务宕机,也不会拖慢查询速度。
     
    注意:通关系型数据库不同,图数据的schema是定义一张图,而非定义一个vertex的。在Mysql中,我们通常将建立一张表定义为创建一个schema,而在JanusGraph中,一个Graph用于一个schema。
    组成结构如下:
     
    JanusGraph Schema
                | 
                |-----------Vertex Lables
                |
                |-----------Property Keys
                |
                |-----------Edge Labels
     
    Schema Type如edge label, vertex label及property key在元素首次创建时被赋予元素,且不能修改。

    Definging Edge Labels

    每个连接了两个vertex的edge都有一个label,用于表示关系的语义。例如一个edge label:friend表明了两个vertex有朋友关系。
     
    要定义edge lable,调用makeEdgeLabel(String)方法,该方法返回一个builder,可以通过该builder设置edge的多样性(multiplicity),多样性属性定义了具有该label的edge的多样性约束,也即在一个vertex间的最大edge的个数。JanusGraph支持如下多样性。

    Edge Label Multiplicity(边的标签多样性)

    • MULTI
    在一对vertex间可以有任意多个同样label的edge。
     
    • SIMPLE
    在一对vertex间最多只能有一个同样label的edge。
     
    • MANY2ONE
    图中任意一个Vertex最多有一个出度(outgoing)edge,和不限个数的入度(incoming)edge,注意:这些对edge的限制对同一个label生效。例如:
     
                              Label: mother
        (大儿子)---------------------------------->|
        (二儿子)---------------------------------->|------------------------>(母亲)
        (小儿子)---------------------------------->|
     
    • ONE2MANY
    图中任意一个Vertex最多有一个入度(incoming)edge,和不限个数的出度(outgoing)edge,注意:这些对edge的限制对同一个label生效。例如:
     
                                Label:winnerof
                                                              |-------------------------->(game1)
        (person)--------------------------->|-------------------------->(game2)
                                                              |-------------------------->(game3)
     
    • ONE2ONE
    某verex中具有同样Label的edge,只能有最多一个incoming edge和最多一个outgoing edge。
     
    默认的多样性设置为MULTI,设置方法如下所示:
    mgmt = graph.openManagement()
    follow = mgmt.makeEdgeLabel('follow').multiplicity(MULTI).make()
    mother = mgmt.makeEdgeLabel('mother').multiplicity(MANY2ONE).make()
    mgmt.commit()

    Defining Property Keys

    vertex和edge上的property是键值对,如name="Danie",中name就是键,value则是Danie,Property Key是Graph Schema中的一部分,并且也用约束value的值类型。

    Property Key Data Type

    使用dataType定义某个property key的数据类型,JanusGraph强制具有相同Key的value都有相同的数据类型来保证加入到图中的数据是有效的。
     
    可以将某个property key的数据类型定义为Object.class来使该value存储任何值(可序列化的),但是还是推荐使用具有具体类型的值类型。设置的类的名称必须是一个确切的类而且不能是接口或抽闲类。JanusGraph提供了class 相等性,所有设置为子类型也是不可以的。
     
    JanusGraph提供如下的数据类型:
     
     

    Property Key Cardinality(属性key基数)

    使用cardinality(Cardinality)来定义Vertex上某个指定key的value的基数。
    • SINGLE
    每个KEY只允许一个VALUE
    • LIST
    以LIST形式保存VALUE,也即可以有重复值。
    • SET
    以SET形式保存VALUE,不能有重复值。
     
    默认的cardinality是SINGLE,因此试图向默认property中写入多个值是不可以的。
    mgmt = graph.openManagement()
    //创建了一个名字为birthDate的属性,并设置值类型为LONG,且只能保存一个值
    birthDate = mgmt.makePropertyKey('birthDate').dataType(Long.class).cardinality(Cardinality.SINGLE).make()
    //创建了一个名字为name的属性,并设置值类型为String,且可以保存不能重复的多个值
    name = mgmt.makePropertyKey('name').dataType(String.class).cardinality(Cardinality.SET).make()
    //创建了一个名字为sensorReading的属性,并设置值类型为Double,且可以保存可以重复的多个值
    sensorReading = mgmt.makePropertyKey('sensorReading').dataType(Double.class).cardinality(Cardinality.LIST).make()
    mgmt.commit()

    Relation Types

    Edge Labels和property keys结合起来被称为relation types,relation type的在图中必须唯一,也意味着property key和edge label不能有相同的名字。在JanusGraph中有查询relation type的API。
    mgmt = graph.openManagement()
    if(mgmt.containsRelationType('name'))
    name = mgmt.getPropertyKey('name')
    mgmt.getRelationTypes(EdgeLabel.class)
    mgmt.commit()

    Defining Vertex Labels

    类似于edge,vertex也有label,但与edge不同的是,edge label是可选的,可用于区分不同类型的vertex,如user vertex和product vertex。
     
    虽然vertex label无论在概念还是数据模型层面都是可选的,但JanusGraph为所有的vertex都指定了一个label,addVertex()方法创建的vertex都使用了janusGraph的默认vertex label。vertex label在graph中必须是唯一的。
     
    下面是创建代码:
    mgmt = graph.openManagement()
    person = mgmt.makeVertexLabel('person').make()
    mgmt.commit()
    // Create a labeled vertex
    person = graph.addVertex(label,'person')
    // Create an unlabeled vertex
    v = graph.addVertex()
    graph.tx().commit()

    Automatic Schema Maker(自动创建schmea)

    如果edge label, property key和vertex label没有被显式创建,则会在第一次使用时通过默认DefaultSchemaMaker创建。
     
    默认的,隐式创建的edge label的multiplicity被设置为MULTI;隐式创建的property key设置为SINGLE,value数据类型为Object.class。用户可以通过实现和注册自己的DefaultSchemaMaker来自定义。
     
    强烈建议用户显式创建,并配置系统为不支持隐式创建。
    schema.default=none

    Changing Schema Elements

    edge label,property key和vertex label的定义一旦提交到graph就不能修改了,但是schema元素的名字是可以修改的。通过JanusGraphManagement.changeName(JanusGraphSchemaElement, String)。
    mgmt = graph.openManagement()
    place = mgmt.getPropertyKey('place')
    mgmt.changeName(place,'location')
    mgmt.commit()
    需要注意的是,更新schema element的名称可能不会立即可见,需要等待JanusGraph同步数据或后端数据同步完成。在更名可能导致冲突的情况下,可能要重启实例。如果需要更名,可以先将原来元素改名为新的不存在的元素名称,然后创建新的schema 元素,但不会影响已经创建的数据,需要通过批处理修改数据。
     
     
  • 相关阅读:
    想让进程后台运行,试试Linux的nohup命令,3分钟学会。
    面试官:你能说一下Redis的常见应用场景吗?
    面试被问MySQL 主从复制,怎么破?
    Spring Boot 解决跨域问题的 3 种方案!
    Kafka如果丢了消息,怎么处理的?
    惊呆,这样操作 Nginx 并发数就能达到3w?
    easyexcel 自动设置列宽(转)
    Ubuntu18.04自适应VMware调整桌面大小
    IDEA将maven项目打包时同时带上项目的maven依赖(转)
    python 定时框架APScheduler
  • 原文地址:https://www.cnblogs.com/jiyuqi/p/7127178.html
Copyright © 2011-2022 走看看