介绍
JanusGraph支持三种数据库后端: Apache Cassandra, Apache HBase, and Oracle Berkeley DB Java Edition
Berkeley DB是非分布式的数据库, 仅在学习和测试中使用
HBase保证一致性
Cassandra保证可用性
JanusGraph的优势
- 支持数据量巨大的图形
- 支持巨大的并发事务和操作图形处理。JanusGraph事务容量随集群的计算机数量扩展而扩展,并且相应时间只有几毫秒
- 支持通过Hadoop框架进行全局图分析和批处理
- 支持地理、数值范围、全文搜索非常大的图形上的顶点和边
- 本机支持ApacheTinkerPop属性图数据模型
- 支持Gremlin图形遍历语言
- 为性能调优提供了大量的图形级配置
- 以顶点为中心的索引提供顶点级问题,以缓解臭名昭著的超级节点问题
- 提供优化的磁盘表示,以便有效的使用存储和访问速度
- 开源自由
JanusGraph基础
架构和数据建模
显示架构信息
使用以下命令显示当前图库的架构
mgmt = graph.openManagement()
mgmt.printSchema()
定义边的标签
makeEdgeLabel(String)
边标签的多样性
- MULTI: 允许任意一对顶点之间使用同一标签的多个边. 边的多重性没有约束
- SIMPLE: 允许最多任意一对顶点之间出现这种标签的一条边. 边对于给定的顶点和标签对是唯一的
-
MANY2ONE: 在图形中的任何顶点上最多允许一个输出边的此类标签, 例如: 但不对传入边进行约束. 比如每个人最多只有一个母亲, 但母亲可以有多个孩子. 多对一的关系
mother
-
ONE2MANY: 在图形中的任何顶点最多允许一个此类标签的传入边, 但不对输出边进行约束. 例如: 每场比赛只有一个人赢得, 但一个人可以赢得多场比赛
winnerof
- ONE2ONE: 在图形中的任何顶点上最多允许一个传入和一个传出的此标签边. 例如: 结婚, 一个人只能对应一个人
默认的多重性是MULTI
边的标签的定义如下所示:
mgmt = graph.openManagement()
follow = mgmt.makeEdgeLabel('follow').multiplicity(MULTI).make()
mother = mgmt.makeEdgeLabel('mother').multiplicity(MANY2ONE).make()mgmt.commit()
定义属性键
属性键数据类型
Name | Description |
---|---|
String | |
Character | |
Boolean | |
Byte | |
Short | |
Integer | |
Long | |
Float | |
Double | |
Date | java.util.Date |
Geoshape | 地理形状,如点、圆或框 |
UUID | java.util.UUID |
属性键cardinality
- SINGLE: 单个, 对于图形中的所有元素, 属性键的键值映射都是唯一的
- LIST: 允许此类键的每个元素任意数量的值, 允许重复的值列表
- SET: 允许多个值, 但此类键的每个元素没有重复值
默认属性值设置为SINGLE
属性键的定义如下所示:
mgmt = graph.openManagement()
birthDate = mgmt.makePropertyKey('birthDate').dataType(Long.class).cardinality(Cardinality.SINGLE).make()
name = mgmt.makePropertyKey('name').dataType(String.class).cardinality(Cardinality.SET).make()
sensorReading = mgmt.makePropertyKey('sensorReading').dataType(Double.class).cardinality(Cardinality.LIST).make()
mgmt.commit()
定义顶点标签
与边的标签不同, 顶点标签是可选的
JanusGraph将所有顶点指定为内部实现详细信息.
顶点标签的定义如下所示:
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()
对标签或属性重命名
mgmt = graph.openManagement()
place = mgmt.getPropertyKey('place')
mgmt.changeName(place, 'location')
mgmt.commit()
定义索引
JanusGraph的索引相关介绍可以看另一篇笔记
一般情况下建索引的步骤
- 确定当前无正在进行的事务
graph.getOpenTransactions() //获取当前正在进行的事务
如果有事务正在进行中,可以尝试用回滚解决
graph.tx().rollback() //回滚事务
执行完回滚后,再次查看是否有无当前事务, 如果依然有正在进行的事务,可以用这个命令终止
for(i=0;i<size;i++) {graph.getOpenTransactions().getAt(0).rollback()} //size替换为事务的数量
- 创建索引
官方文档的步骤:
graph.tx().rollback() //回滚事务
mgmt = graph.openManagement() //打开管理
name = mgmt.getPropertyKey('name') //获取属性键
mgmt.buildIndex('byNameComposite', Vertex.class).addKey(name).buildCompositeIndex() //创建索引
mgmt.commit()
//Wait for the index to become available 等待索引成功
ManagementSystem.awaitGraphIndexStatus(graph, 'byNameComposite').call()
//Reindex the existing data
mgmt.updateIndex(mgmt.getGraphIndex("byNameComposite"), SchemaAction.REINDEX).get()
mgmt.commit()
事实上官方文档的步骤只是一种理想情况
在创建完索引后,需要执行以下命令,这一步的目的是把刚创建的索引的状态由INSTALLED -》REGISTERED
m = graph.openManagement()
m.updateIndex(m.getGraphIndex('index'), SchemaAction.REGISTER_INDEX).get()
m.commit()
这一步需要比较长的时间去执行,可以使用awaitGraphIndexStatus()查看索引状态:
PS: 若迟迟没有变为REGISTERED,也可以尝试下一步,更新到ENABLE
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。