第五章:数据模型
Chapter 5. Schema and Data Modeling
每个JanusGraph
图都是由边标签(edge label)、属性key、顶点标签(vertex label)构成。JanusGraph
图模型(schema)可以显示定义也可以隐示定义。在实际应用开发过程中图模型定义是强烈建议采用显示定义的。一个显示的图模型定义对构建一个稳定的图应用非常重要并且可以提升协同开发效率。值得注意的是,随着时间的推移图模型演进是不需要对图进行任何中断操作的。扩展图模型定义不会使查询变慢并且也不需要停机操作。
图元素(边、属性、顶点)在图中被第一次创建的时候其模型定义(即边标签、属性key、顶点标签)是需要明确指定的,并且指定后不可改变。这样更容易使模型保持稳定。
除了本章介绍的模型定义选项外,将在30章高级模型中继续讨论模型定义的优化选项。
5.1 边标签定义
5.1. Defining Edge Labels
连接2个顶点的边的标签被定义为这2个顶点之间的具体关联关系。例如顶点A和顶点B间的边的标签类型为朋友,则表明A、B两人之间存在友谊。
定义边标签需要在一个打开的图或者管理事物中调用makeEdgeLabel(String)
方法,参数即为边标签名。边标签名在图中必须唯一。此方法返回一个允许定义其多样性边标签的生成器。多样性标签定义会约束所有该标签的边,也就是说,限制了两个顶点最多能够有多少条边。JanusGraph
承认下面这些多样性约束:
边标签多样性
5.1.1. Edge Label Multiplicity
多样性设置
- 多对多(MULTI): 任意2个顶点相同标签的边允许有多条。换句话说,这种图是包含此类标签的多图。这在边的多样性上没有约束。
- 简单(SIMPLE): 任意2个顶点间相同边标签的边最多有一条,换句话说,这种图是包含此类标签的简单图。这确保任意2个顶点间这类边标签的边唯一。
- 多对一(MANY2ONE): 在图中此类边标签在任意顶点出边只能有一条,入边没有限制。++母亲++边标签就是这种多对一的例子,一个人只能有一个母亲,但是一个母亲可以有多个孩子。
- 一对多(ONE2MANY): 在图中此类边标签的边一个顶点只能有一个入边,出边不限制。++赢得比赛++边标签就是这样的例子,一场比赛最多只能被一个人赢得比赛,但是一个人可以赢得多场比赛。
- 一对一(ONE2ONE):在图中此类标签只能有一条入边和一条出边,++结婚++边标签就是这样的一对一的例子,表示一个人只能和另外一个人结婚。
默认的边多样性限制是多对多。在定义边标签的时候调用make()
完成边标签定义并返回定义的边标签,就像下面这个例子。
mgmt = graph.openManagement()
follow = mgmt.makeEdgeLabel('follow').multiplicity(MULTI).make()
mother = mgmt.makeEdgeLabel('mother').multiplicity(MANY2ONE).make()
mgmt.commit()
定义属性key
5.2. Defining Property Keys
边和顶点的属性是键值对,例如属性name='Daniel'
具有属性键name
,属性值Daniel
。属性键是JanusGraph
图模型的一部分并且只能是允许的数据类型和基准值。
定义属性性键,可以在打开的图或者管理事物上调用`makePropertyKey(String)
方法,传递的参数就是图属性标签。图中属性key必须唯一,建议在图属性名中避免使用空格和特殊字符。这个方法返回一个图键构造器。
5.2.1属性key数据类型
5.2.1. Property Key Data Type
使用dataType(Class)
定义属性key数据类型。JanusGraph
将强制该属性key的数据的数据类型必须是这个方法定义的。这保证如图的数据都是有效的。例如可以定义name
key具有String类型。
数据类型定义为Object.class
允许该key可以设置任何数据类型的值。然而,应尽量使用固定类型的值。配置的数据类型必须是具体的类,不能是结构和抽象类。JanusGraph
强制类相等,所以配置数据类型是子类是不允许的。
JanusGraph
原生支持下面这些数据类型。
Table 5.1. Native JanusGraph Data Types
Name | Description |
---|---|
String | Character sequence |
Character | Individual character |
Boolean | true or false |
Byte | byte value |
Short | short value |
Integer | integer value |
Long | long value |
Float | 4 byte floating point number |
Double | 8 byte floating point number |
Date | Specific instant in time (java.util.Date) |
Geoshape | Geographic shape like point, circle or box |
UUID | Universally unique identifier (java.util.UUID) |