每个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 元素,但不会影响已经创建的数据,需要通过批处理修改数据。

janusgraph整合mysql_JanusGraph的schema及数据建模相关推荐

  1. janusgraph整合mysql_JanusGraph多图配置 (cassandra)

    JanusGraph多图配置目的 :一个端口开启后可根据句柄操作多个图 .(cassandra存储后端) 1.GremlinServer多图配置 服务器gremlin-server.yaml中可以设置 ...

  2. janusgraph整合mysql_图解图库JanusGraph系列-一文知晓“图数据“底层存储结构

    527-7.jpg 大家好,我是洋仔,JanusGraph图解系列文章,实时更新~ 图数据库文章总目录: 版本:JanusGraph-0.5.2 转载文章请保留以下声明: 一:存储模式 留言或私信我, ...

  3. DataWorks数据建模 - 一揽子数据模型管理解决方案

    作者:DataWorks产品经理 刘天鸢 在当下的商业环境中,正确的数据治理策略对于数据增值是非常重要的.据统计,企业的数据一直都在以每年50%的速度增长,因此企业数据治理与整合的难度就不断加大了. ...

  4. 数据仓库——数据仓库架构、维度数据建模、雪花模型和星型模型

    文章目录 一.数据仓库架构 1. 自顶向下 2. 自底向上 二.维度数据建模 三.星型模型和雪花模型 1. 星型模型 2. 雪花模型 本篇文章主要介绍了数据仓库的整体架构.数仓中常用的维度数据建模方法 ...

  5. QuickBI助你成为分析师-数据建模(一)

    产品核心流程第二步为创建数据集,进行数据建模,如果说数据是海,那么创建数据集并合理建模就是划船的浆,有了浆才能在数据的海洋里畅游.目前创建数据集有两种方式:(1)数据表直接创建数据集 (2)通过自定义 ...

  6. 5模型数据起别名_DMBOK 06|数据建模与设计

    数记达摩院 提供高效能数据知识体系学习解决方案 您好,欢迎来到数记达摩院,我是王兵.今天我们来一起学习,DMBOK数据管理知识体系 第五章 数据建模与设计. 开始之前,我们先回顾一下上节课讲述的内容. ...

  7. UML建模之数据建模

    一.数据库模简介 二.数据建模元素 1.表(Table) 2.表索引(Table Index) 3.表触发器(Table Trigger) 4.表约束(Table Constraint) 5.视图(V ...

  8. 连载:阿里巴巴大数据实践—数据建模综述

    简介:数据模型就是数据组织和存储方法,它强调从业务.数据存取和使用角度合理存储数据. 前言: -更多关于数智化转型.数据中台内容请加入阿里云数据中台交流群-数智俱乐部 和关注官方微信公总号(文末扫描二 ...

  9. java对象底层原存储结构图解_图解图库JanusGraph系列-一文知晓“图数据“底层存储结构...

    大家好,我是洋仔,JanusGraph图解系列文章,实时更新~ 图数据库文章总目录: 转载文章请保留以下声明: 一:存储模式 留言或私信我,邀请你加入"图数据库交流"微信群! 1. ...

最新文章

  1. 【怒怼老乔】苹果手机ios系统居然特喵的不支持日期yyyy-MM-dd HH:mm:ss.ms,只支持 yyyy/MM/dd HH:mm:ss
  2. Linux管道的原子性,管道机制
  3. Ubuntu 16.04设置IP、网关、DNS
  4. javaScript学习之正则表达式初探
  5. Unity3D_07_日志、文本打印
  6. Intellij IDEA中Mybatis Mapper自动注入警告的6种解决方案
  7. 北京化工大学2018年10月程序设计竞赛部分题解(A,C,E,H)
  8. UI实用素材模板|天气应用app的ui设计
  9. RFID和安防究竟有什么关系?
  10. html整体移动,html 可以拖动多个div
  11. UIImagePickerController PAD /IPHONE 上注意事项
  12. 国外LEAD赚钱提现到WMZ,附赚钱项目
  13. ArcGIS 读写lyr层文件
  14. 杂记:Atmel sama5d3 DMA Controller (DMAC)
  15. c语言满屏爱心,微信聊天可以发满屏动态爱心了 个性又浪漫!
  16. python闯关训练营怎么样3.0_泡着枸杞写bug的三流程序员凭什么逆袭到一线大厂?...
  17. 企业项目文档库管理系统推荐
  18. 组态王与三菱PLC编程软件GXWorks2通过OPC数据库进行动态仿真
  19. wps插入入html,WPS文字技巧—如何在WPS文字中快速插入域
  20. 微信小程序手机号+授权登录

热门文章

  1. 【软考总结】——正视自己的不足
  2. 印美贸易战变成数据官司,我们能从中学到什么?
  3. Hadoop学习第二天
  4. R语言将汉字转化为拼音方法
  5. Spring Boot 实现万能文件在线预览,已开源,真香!!
  6. linux 终端发出哔声,在Linux Gnome系统上关闭终端的硬件蜂鸣声的方法
  7. 目前流行的装修风格_目前装修流行的主要八大风格
  8. 夏天的风,我永远记得~
  9. Python进阶(十) -- 网络爬虫
  10. 百练4133:垃圾炸弹