菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
94
0

从头开始学JanusGraph 0.4

原创
05/13 14:22
阅读数 955

介绍

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的索引相关介绍可以看另一篇笔记

一般情况下建索引的步骤

  1. 确定当前无正在进行的事务
graph.getOpenTransactions() //获取当前正在进行的事务

如果有事务正在进行中,可以尝试用回滚解决

graph.tx().rollback() //回滚事务

执行完回滚后,再次查看是否有无当前事务, 如果依然有正在进行的事务,可以用这个命令终止

for(i=0;i<size;i++) {graph.getOpenTransactions().getAt(0).rollback()} //size替换为事务的数量
  1. 创建索引

官方文档的步骤:

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

发表评论

0/200
94 点赞
0 评论
收藏
为你推荐 换一批