网站首页 > 技术文章 正文
JanusGraph本体概念
每个JanusGraph图都有一个由其中使用的边标签、属性键和顶点标签组成的概念集合,称之为本体(Schema)。JanusGraph Schema可以显式定义,也可以隐式定义。鼓励用户在应用程序开发过程中明确定义图形模式。显式定义的模式是健壮的图形应用程序的重要组成部分,它极大地改进了协作软件开发。请注意,JanusGraph模式可以随着时间的推移而发展,而不会中断正常的数据库操作。扩展模式不会减慢查询应答的速度,也不需要数据库停机。
% cd ~/Downloads/janusgraph-full-0.6.3
% ./bin/gremlin.sh
// 连接上以后建立和JanusGraph的连接后:
gremlin> graph = JanusGraphFactory.open('/Users/tutu/workspace/janusgraph-v0.6/janusgraph-dist/src/assembly/cfilter/conf/janusgraph-cql-es.properties')
gremlin> mgmt = graph.openManagement()
gremlin> mgmt.printSchema()
NOTE: 通关系型数据库不同,图数据的schema是定义一张图,而非定义一个vertex的。在Mysql中,我们通常将建立一张表定义为创建一个schema,而在JanusGraph中,一个Graph用于一个schema。
如何所示,能看到Gremlin Console打印出来的schema分三个大的基本维度呈现。
JanusGraph Schema
|
|-----------Vertex Lables
|
|-----------Property Keys
|
|-----------Edge Labels
Schema Type如edge label, vertex label及property key在元素首次创建时被赋予元素,且不能修改。
Vertex Labels (顶点)
虽然vertex label无论在概念还是数据模型层面都是可选的,但JanusGraph为所有的vertex都指定了一个label,addVertex()方法创建的vertex都使用了janusGraph的默认vertex label。vertex label在graph中必须是唯一的。
可以理解每个实体都得有一个类型。
gremlin> mgmt = graph.openManagement()
gremlin> person = mgmt.makeVertexLabel('person').make()
gremlin> mgmt.commit()
// Create a labeled vertex
gremlin> person = graph.addVertex(label,'person')
// Create an unlabeled vertex
gremlin> v = graph.addVertex()
gremlin> graph.tx().commit()
Edge Labels(边)
边都有一个label,用于表示关系的语义。例如一个edge label:friend表明了两个vertex有朋友关系。
gremlin> mgmt = graph.openManagement()
gremlin> follow = mgmt.makeEdgeLabel('follow').multiplicity(MULTI).make()
gremlin> mother = mgmt.makeEdgeLabel('mother').multiplicity(MANY2ONE).make()
gremlin> mgmt.commit()
要定义edge lable,调用makeEdgeLabel(String)方法,该方法返回一个builder,可以通过该builder设置edge的多样性(multiplicity),多样性属性定义了具有该label的edge的多样性约束,也即在一对vertex间的最大edge的个数。JanusGraph支持如下多样性:
1. MULTI (多个)
在一对vertex间可以有任意多个同样label的edge。
2. SIMPLE(简单关系)
在一对vertex间最多只能有一个同样label的edge
3. MANY2ONE (多对一)
图中任意一个Vertex最多有一个出度(outgoing)edge,和不限个数的入度(incoming)edge,注意:这些对edge的限制对同一个label生效。
4. ONE2MANY(一对多)
和上图相反即可,图中任意一个Vertex最多有一个入度(incoming)edge,和不限个数的出度(outgoing)edge,注意:这些对edge的限制对同一个label生效。
5. ONE2ONE(一对一)
某verex中具有同样Label的edge,只能有最多一个incoming edge和最多一个outgoing edge。
Property Keys(属性Key)
我们说JanusGraph是属性图,vertex和edge上的property是键值对,如name="Danie",中name就是键,value则是Danie,Property Key是Graph Schema中的一部分,并且也用约束value的值类型。
使用dataType定义某个property key的数据类型,JanusGraph强制具有相同Key的value都有相同的数据类型来保证加入到图中的数据是有效的。可以将某个property key的数据类型定义为Object.class来使该value存储任何值(可序列化的),但是还是推荐使用具有具体类型的值类型。设置的类的名称必须是一个确切的类而且不能是接口或抽闲类。JanusGraph提供了class 相等性,所有设置为子类型也是不可以的。
JanusGraph提供如下的数据类型:
类型 | 说明 |
String | 字符串 |
Character | 字符 |
Boolean | 布尔 |
Byte | byte value |
Short | 短整型 |
Integer | 整型 |
Long | 长整型 |
Float | 浮点4byte |
Double | 浮点8byte |
Decimal | Number with 3 decimal digitals |
Precision | Number with 6 decimal digitals |
Date | 日期 |
GeoShape | 地理位置 |
UUID | UUID |
Property Key Cardinality(属性key基数)
使用cardinality(Cardinality)来定义Vertex上某个指定key的value的基数。
SINGLE
每个KEY只允许一个VALUE
LIST
以LIST形式保存VALUE,也即可以有重复值。
SET
以SET形式保存VALUE,不能有重复值。
gremlin> mgmt = graph.openManagement()
//创建了一个名字为birthDate的属性,并设置值类型为LONG,且只能保存一个值
gremlin> birthDate = mgmt.makePropertyKey('birthDate').dataType(Long.class).cardinality(Cardinality.SINGLE).make()
//创建了一个名字为name的属性,并设置值类型为String,且可以保存不能重复的多个值
gremlin> name = mgmt.makePropertyKey('name').dataType(String.class).cardinality(Cardinality.SET).make()
//创建了一个名字为sensorReading的属性,并设置值类型为Double,且可以保存可以重复的多个值
gremlin> sensorReading = mgmt.makePropertyKey('sensorReading').dataType(Double.class).cardinality(Cardinality.LIST).make()
gremlin> mgmt.commit()
Relation Types (关系类型)
Edge Labels和property keys结合起来被称为relation types,relation type的在图中必须唯一,也意味着property key和edge label不能有相同的名字。在JanusGraph中有查询relation type的API。
gremlin> mgmt = graph.openManagement()
gremlin> if(mgmt.containsRelationType('name'))
gremlin> name = mgmt.getPropertyKey('name')
gremlin> mgmt.getRelationTypes(EdgeLabel.class)
gremlin> mgmt.commit()
自动化创建Schema
如果edge label, property key和vertex label没有被显式创建,则会在第一次使用时通过默认DefaultSchemaMaker创建。默认的,隐式创建的edge label的multiplicity被设置为MULTI;隐式创建的property key设置为SINGLE,value数据类型为Object.class。用户可以通过实现和注册自己的DefaultSchemaMaker来自定义。
schema.default=none
强烈建议用户显式创建,并配置系统为不支持隐式创建。
变更Schema
edge label,property key和vertex label的定义一旦提交到graph就不能修改了,但是schema元素的名字是可以修改的。通过JanusGraphManagement.changeName(JanusGraphSchemaElement, String)。
gremlin> mgmt = graph.openManagement()
gremlin> place = mgmt.getPropertyKey('place')
gremlin> mgmt.changeName(place,'location')
gremlin> mgmt.commit()
需要注意的是,更新schema element的名称可能不会立即可见,需要等待JanusGraph同步数据或后端数据同步完成。在更名可能导致冲突的情况下,可能要重启实例。如果需要更名,可以先将原来元素改名为新的不存在的元素名称,然后创建新的schema 元素,但不会影响已经创建的数据,需要通过批处理修改数据。
猜你喜欢
- 2024-10-26 读图数据库实战笔记01_初识图 图数据库查询
- 2024-10-26 (一)图数据库概览第一讲 图数据库教程
- 2024-10-26 一、图数据库系统简介 图数据库原理是什么
- 2024-10-26 「图」完全托管的图形数据库服务Amazon Neptune上线
- 2024-10-26 (十四) JanusGraph 索引管理 索引图英文翻译
- 2024-10-26 (十六) JanusGraph部署架构 jgrapht
- 2024-10-26 (十) JanusGraph事务机制 事务型结构数据流图的特点是
- 2024-10-26 (十一) JanusGraph配置化及部分运维能力说明
- 2024-10-26 (十三) JanusGraph 本体管理高级特性
- 2024-10-26 浅谈图数据库 图数据库原理
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)