每个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的schema及数据建模的更多相关文章

  1. 《Entity Framework 6 Recipes》翻译系列 (3) -----第二章 实体数据建模基础之创建一个简单的模型

    第二章 实体数据建模基础 很有可能,你才开始探索实体框架,你可能会问“我们怎么开始?”,如果你真是这样的话,那么本章就是一个很好的开始.如果不是,你已经建模,并在实体分裂和继承方面感觉良好,那么你可以 ...

  2. NoSQL 数据建模技术(转)

    本文转载自:http://coolshell.cn/articles/7270.html ================================================ 全文译自墙外 ...

  3. NoSQL数据建模技术

    原文来自“NoSQL Data Modeling Techniques”,由酷壳网陈皓编译<NoSQL数据建模技术>.这篇文章看完之后,你可能会对NoSQL的数据结构会有些感觉.我的感觉是 ...

  4. Azure CosmosDB (13) CosmosDB数据建模

    <Windows Azure Platform 系列文章目录> 我们在使用NoSQL的时候,如Azure Cosmos DB,可以非常快速的查询非结构化,或半结构化的数据.我们需要花一些时 ...

  5. Cassandra数据建模

    1.  概述 Apache Cassandra将数据存储在表中,每个表都由行和列组成.CQL(Cassandra查询语言)用于查询存储在表中的数据.Apache Cassandra数据模型基于查询并针 ...

  6. TDengine的数据建模?库、表、超级表是什么?怎么用?

    ​欢迎来到物联网的数据世界 在典型的物联网场景中,一般有多种不同类型的采集设备,采集多种不同的物理量,同一种采集设备类型,往往有多个设备分布在不同的地点,系统需对各种采集的数据汇总,进行计算和分析对于 ...

  7. 《驾驭Core Data》 第三章 数据建模

    本文由海水的味道编译整理,请勿转载,请勿用于商业用途.    当前版本号:0.1.2 第三章数据建模 Core Data栈配置好之后,接下来的工作就是设计对象图,在Core Data框架中,对象图被表 ...

  8. 【mysql的设计与优化专题(1)】ER图,数据建模与数据字典

    需求分析是做项目中的极为重要的一环,而作为整个项目中的'血液'--数据,更是重中之重.viso,workbench,phpmyadmin等软件可以帮我们更好的处理数据分析问题. ER图 E-R方法是& ...

  9. EF数据建模(一)

    大中型软件开发过程中常会使用ORM技术,ORM全称是“对象-关系映射Object-Relation-Mappping”.是将数据库中的数据对象的形式表现出来,并将通过面向对象的方式将这些对象组织起来, ...

随机推荐

  1. aoj 0033 Ball【dfs/枚举】

    有一个形似央视大楼(Orz)的筒,从A口可以放球,放进去的球可通过挡板DE使其掉进B裤管或C裤管里,现有带1-10标号的球按给定顺序从A口放入,问是否有一种控制挡板的策略可以使B裤管和C裤管中的球从下 ...

  2. 51nod 子序列的个数(动态规划)

    子序列的个数 给定一个正整数序列,序列中元素的个数和元素值大小都不超过105, 求其所有子序列的个数.注意相同的只算一次:例如 {1,2,1}有子序列{1} {2} {1,2} {2,1}和{1,2, ...

  3. 礼物(BFS)

    礼物 时间限制: 1 Sec  内存限制: 64 MB提交: 39  解决: 4[提交][状态][讨论版] 题目描述 给出一个n行m列的点阵,“.”表示可通行格子,“#”表示不可通行格子,“K”表示国 ...

  4. CSS中的层叠、特殊性、继承、样式表中的@import

    CSS中的层叠.特殊性.继承.样式表中的@import 层叠 CSS有一个机制是层叠,层叠可以理解为对样式的覆盖,优先性为: 网站开发者的样式表 用户样式(通过设置浏览器的显示选项) 浏览器默认的样式 ...

  5. (转)python之并行任务的技巧

    Python的并发处理能力臭名昭著.先撇开线程以及GIL方面的问题不说,我觉得多线程问题的根源不在技术上而在于理念.大部分关于Pyhon线程和多进程的资料虽然都很不错,但却过于细节.这些资料讲的都是虎 ...

  6. 取消Gridvie中button的焦点

    Gridview中添加button,onclick方法使得 GridView的setOnItemClickListener方法无效. 解决方法: 设置Button的XML布局文件,也就是自定义的Ada ...

  7. [BZOJ3816][清华集训2014]矩阵变换(稳定婚姻问题)

    3816: 矩阵变换 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 803  Solved: 578[Submit][Status][Discuss] ...

  8. 【动态规划】bzoj1270 [BeijingWc2008]雷涛的小猫

    暴力dp是n^2*m的……我们计算每棵树在每层的答案的时候,都需要计算出从那棵树转移过来最优. 但是我们发现,对一棵树而言,从上面转移过来都是一样的,所以我们可以在计算每棵树在每层的答案的时候,先预处 ...

  9. 上手 Webpack ? 这篇就够了!

    JavaSript 模块化打包已混迹江湖许久.2009年,RequireJS 就提交了它的第一个版本,Browserify 接踵而至,随后其他打包工具也开始大行其道.最终,Webpack 从其中脱颖而 ...

  10. Error: Top-level design entity "demo" is undefined

    原因:顶层模块的module名没有和工程名同名 解决方法:把顶层模块 module名改成和工程名同名 最近在玩QUARTUS 11遇到此问题! 问题补充:本人用的时VERILOG HDL硬件描述语言! ...