从头开始学JanusGraph 0.4

介绍

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

Image placeholder
cross
未设置
  94人点赞

没有讨论,发表一下自己的看法吧

推荐文章
JanusGraph索引入门及模糊查询

JanusGraph模糊查询与索引1.索引JanusGraph支持两种不同类型的索引来加快查询处理:图形索引和中心顶点索引 图形索引使从由其属性标识的顶点或边列表开始遍历的全局检索操作在大型图形上高效

咱们从头到尾说一次 Java 垃圾回收

⬆️图片来源于网络之前上学的时候有这个一个梗,说在食堂里吃饭,吃完把餐盘端走清理的,是C++程序员,吃完直接就走的,是Java程序员。🤔确实,在Java的世界里,似乎我们不用对垃圾回收那么的专注,很多

Java 程序员眼中的 Linux_1.0.Linux 介绍

Linux介绍 Linux这个名字 Linux的Wiki介绍:http://zh.wikipedia.org/zh/Linux Linux也称:GNU/Linux,而其中GNU的全称又是:Gnu’sN

[Java 程序员眼中的 Linux] Linux 下常用压缩文件的解压、压缩

Linux下常用压缩文件的解压、压缩 常用压缩包解压命令整理 Linux后缀为.tar.gz格式的文件-解压 命令:tarzxvfXXXXXX.tar.gz Linux后缀为.bz2格式的文件-解压

笨办法 学Linux 安装Linux

Linux学习起步 Windows,VirtualBox虚拟机(.ova格式的预配置映像) 学习Linux你需要什么 VitualBox,虚拟机播放器。 putty,终端模拟器。 预配置的Virtua

Linux/Unix 基础:什么是 Linux?

简单来讲,Linux是一个操作系统(OS)。我们都很熟悉其他操作系统,就像Microsoftwindows,AppleMacOS,iOS,Googleandroid,等等这些,linux就像它们一样,

Linux/Unix 基础:Linux 的历史

Linux的诞生 在1991年,来自芬兰Helsinki大学的学生LinusTorvalds认为市场上应该有一个比较统一的Unix版本,从此他就开始为这个项目奋斗。后来这个项目就成为了Linux操作系

别小瞧了 Linux,安卓、华为的自研系统,均源自 Linux!

众所周知,目前国内已有众多的国产系统,基本上均源自linux,以linux为基础进行二次开发。比如红旗linux、深度等等。但不知道为什么,一说起某系统是基于linux而来,很多网友就瞧不起,并且会觉

历经坎坷多次易主,SUSE Linux路在何方?

SUSE近期向媒体发布的一份公告中,至少12次提到了它的独立性。有了投资者的大量资金,这家企业最终能否走向成功?3月15日,SUSE发布公告宣布,瑞典私募股权公司EQT完成从MicroFocus对SU

从零开始入门 K8s:应用编排与管理

一、需求来源 背景问题 首先来看一下背景问题。如下图所示:如果我们直接管理集群中所有的Pod,应用A、B、C的Pod,其实是散乱地分布在集群中。 现在有以下的问题: 首先,如何保证集群内可用Pod的

Python 教程-从变量开始

先认识一下计算机 主要分为五个部分:控制器,运算器,存储器,输入设备,输出设备。输入输出设备大家都比较熟悉,最常见的输入设备比如鼠标、键盘、扫描仪等,输出设备比如,显示器、打印机、音响等。主要说一下

【总结】2019 从零开始入行 1年6 个月以来的感受和体验

2019年已经随着寒潮的袭来进入了年尾。 去年年末的时候写了一篇2018年的总结,当时记录了我从零基础入行半年的一些感想和感受。当时收到了很多人的温暖的鼓励,在这里谢谢大家。因为工作业务上以及个人琐

从零开始入门 K8s | K8s 的应用编排与管理

作者|张振阿里云高级技术专家一、资源元信息1.Kubernetes资源对象我们知道,Kubernetes的资源对象组成:主要包括了Spec、Status两部分。其中Spec部分用来描述期望的状态,St

科技向善,一切从人开始

新闻头条应用依赖于人工智能技术向你推送最合适你的新闻内容;出行软件依托人工智能算法帮助司机选择路线、规划车辆调度方案;搜索引擎早已推升到了智能回答、智能助理、智能搜索的新层次;修图软件利用人工智能技术

从产品到解决方案,GaussDB与FusionData之我见

摘要:连接、计算和数据是ICT基础设施的三大基石,华为IT产品线副总裁、智能数据与存储领域总裁周跃峰在接受媒体采访时强调,这或许是华为在数据领域全面持续发力的原因之一。时隔不足一个月,华为连续召开两次

还在用useState来定义数据吗?教你个更好的方案:useImmer!

以前编写state的方式Hooks上市之前我们是这么定义state的:state={ people:[ { name:'马云', englishName:'JackMa' }, { name:'马化腾

Stylus系列——webpack-spritesmith配合stylus使用示例

一、前言基于Webpack的CSSSprites实现方案,若是直接在html中调用雪碧图图标已经很方便,但是实际开发过程可能遇到需要在伪元素中使用雪碧图,或者需要hover切换另一个图标,这种情况下就

多次问鼎 NuerIPS、MRQA 等国际顶级比赛,百度 NLP 技术到底有多强?

人工智能技术的发展尤其是深度学习技术的成功运用,推动自然语言处理(NLP)进入了高速发展阶段。NLP目前也是应用范围最广的人工智能技术之一,已在智能搜索、智能客服、智能助手、智能推荐等方面得到了大规模

Java教程_在 Java 8 中避免 Null 检查

如何预防Java中著名的NullPointerException异常?这是每个Java初学者迟早会问到的关键问题之一。而且中级和高级程序员也在时时刻刻规避这个错误。其是迄今为止Java以及很多其他编程

Linux Shell 脚本快速入门

shell脚本是在一个文件中写入一起执行的命令集。对于使用像dos操作系统的DOS,windows操作系统的bat,linux操作系统的files的人来说,这几乎都是相同的概念。你只需要把一串命令写

Linux 安装 Node.js

因为我用最简单yum命令安装node.js发现node的版本不是最新的所以自己手动安装了nodejs流程如下 进入服务器安装nodejs安装包 进入保存包的目录 $cddownload 下载二进制

Linux 安装 Node.js

因为我用最简单yum命令安装nodejs发现node的版本不是最新的所以自己手动安装了nodejs流程如下 进入服务器安装nodejs安装包 进入保存包的目录 $cddownload 下载二进制包

NutsDB v0.5.0 发布~

项目地址 https://github.com/xujiajun/nutsdb Changelog [Newfeature]SupportEntryIdxMode:HintBPTSparseIdxMo

Linux Shell 脚本快速入门

shell脚本是在一个文件中写入一起执行的命令集。对于使用像dos操作系统的DOS,windows操作系统的bat,linux操作系统的files的人来说,这几乎都是相同的概念。你只需要把一串命令写入

Linux 文件同步工具之 rsync

学习背景 1.最近公司的项目在使用jenkins做自动化构建,因为jenkins在构建时是比较耗性能的,便单独使用了一台服务器做构建服务器。但是个人觉得这样成本过高,单独拿一台服务器来构建并且该服务器