3. JanusGraph快速开始
本节将使用Gods图作为演示示例,此图在JanusGraph演示中广泛使用。该图如下图所示。这个抽象的数据模型对应图模型中的属性,这个特定的实例描述了罗马万神殿中人物和地点之间的关系。此外,图中的特殊文本和符号修饰符(如:粗体、下划线等)表示图中不同的示意图/类型。
标示 | 含义 |
---|---|
加粗的key | 图中的索引键 |
加粗带星的key | 图中的索引键值必须是唯一的 |
带下划线的key | 以顶点为中心的索引键 |
空心箭头的边 | 特定的边(不能重复) |
尾部十字的边 | 单项边(只能在一个方向建立关系) |
下载Janusgraph并运行Gremlin Console
JanusGraph可以从项目仓库的Releases分支下载。下载完成后解压文件夹就可以启动Gremlin Console。Gremlin Console是在JanusGraph包中自带的一个REPL(即交互式的shell),这跟标准的Gremlin Console有所不同,因为它是JanusGraph预安装和预加载的包。或者,用户可以从中心仓库下载JanusGraph包然后使用已有Gremlin Console来安装和激活JanusGraph。在下面的示例中,将使用janusgraph的压缩包,但是,请务必记得先解压下载的zip包。
注意:JanusGraph依赖Java 8(标准版)。 建议使用Oracle Java 8。 JanusGraph的shell脚本执行需要配置$ JAVA_HOME环境变量,它指向JRE或JDK的安装目录。
1 | unzip janusgraph-0.3.1-hadoop2.zip |
Gremlin Console使用Apache Groovy解释执行命令。Groovy构建在Java语言之上,具有很多简洁的语法,使交互式编程变得更加容易。同样的,Gremlin-Groovy也是构建在Groovy之上,具有简洁的语法,使得图的遍历变得容易。下面的例子将展示如何处理numbers、strings和maps。本教程的其他部分将讨论如何构建特定的图。
1 | 100-10 |
提醒:有关Gremlin更多使用方式请参考:Apache TinkerPop、SQL2Gremlin和Gremlin Recipes。
加载Gods图到JanusGraph中
下面的示例将建立一个JanusGraph图实例并加载上图所示的Gods图数据集。JanusGraphFactory提供了一组静态方法,通过配置文件作为参数来获得graph实例。本教程将使用一份使用BerkeleyDB作数据库,Elasticsearch作索引的配置文件来获取graph实例,并使用辅助类GraphOfTheGodsFactory来加载Gods图。 本节将暂时跳过这些详细的配置信息,但有关数据库,索引及其他的配置信息,请参见第III部分“数据库”,第IV部分,“索引”和第15章“配置参考”。
1 | graph = JanusGraphFactory.open('conf/janusgraph-berkeleyje-es.properties') |
JanusGraphFactory.open()
和GraphOfTheGodsFactory.load()
方法构造图的具体操作如下:
- 在图中创建全局的以顶点为中心的索引集。
- 添加所有的顶点及其属性到图中。
- 添加所有的边及其属性到图中。
更多细节请参考GraphOfTheGodsFactory的源码。
对于使用JanusGraph / Cassandra(或JanusGraph / HBase)的用户,请使用conf / janusgraph-cql-es.properties(或conf / janusgraph-hbase-es.properties)相关配置和GraphOfTheGodsFactory.load()
。
1 | graph = JanusGraphFactory.open('conf/janusgraph-cql-es.properties') |
您也可以使用conf / janusgraph-cql.properties、conf / janusgraph-berkeleyje.properties或者conf / janusgraph-hbase.properties配置文件来获取graph实例,而不配置索引。 在这种情况下,你需要使用GraphOfTheGodsFactory.loadWithoutMixedIndex
方法来加载Gods图,这样它将不会创建索引。
1 | graph = JanusGraphFactory.open('conf/janusgraph-cql.properties') |
全局图索引
使用图数据库中数据的典型模式是首先使用图索引来确定起始点。该起始点是一个元素(或一组元素) - 即顶点或边。从起始点,Gremlin路径描述描述了如何通过显示的图结构来遍历图中的其他点。
通过name属性上的唯一索引,可以检索到Saturn顶点,然后可以查到它的所有属性值(即Saturn属性的键值对)。如图所示,顶点Saturn的名字是“Saturn”,年龄是10000,类别是“titan”。 Saturn的孙子通过遍历语句可以表示为:“谁是Saturn的孙子?” (“父亲”的反面是“孩子”)。 检索到的结果是Hercules。
1 | gremlin> saturn = g.V().has('name', 'saturn').next() |
属性place也在图索引中。属性place是边的一个属性。因此JanusGraph可以通过图的索引索引到边。它可以查询Gods图中发生在Athens(纬度:37.97, 经度:23.72) 50km范围内的信息。然后通过这些信息查看涉及到哪些顶点。
1 | gremlin> g.E().has('place', geoWithin(Geoshape.circle(37.97, 23.72, 50))) |
图索引是JanusGraph中的一种索引结构。JanusGraph会自动使用索引来检索满足一个或多个约束条件的所有顶点(g.V)或边(g.E)。JanusGraph中另外一种索引是以顶点为中心的索引。以顶点为中心的索引可以加快图的遍历。以顶点为中心的索引将在后续中讲解。
图遍历示例
Hercules是Jupiter和Alcmene的儿子,拥有超能力。Hercules是一个半神半人,因为他的爸爸是神他的妈妈是人类。Jupiter的妻子Juno对Jupiter的不忠感到愤怒,为了复仇,她弄瞎了Hercules的双眼导致他杀死了自己的妻子和孩子。为了赎罪,Delphi命令Hercules为Eurystheus服务,Eurystheus让他做12年的工人。
上一节中,证明了Saturn的孙子是Hercules。这也可以使用循环的方式来查询,实际上Hercules是从Saturn在in(‘father’) 路径上循环两次到达的点。
1 | gremlin> hercules = g.V(saturn).repeat(__.in('father')).times(2).next() |
Hercules是一个半神半人,为了证明Hercules半神半人,需要查询他父母的起源。可以从Hercules顶点去遍历他的母亲和父亲。最后可以去确定他们的类型是“god”和“human”。
1 | gremlin> g.V(hercules).out('father', 'mother') |
到目前为止,这些例子涉及了罗马万神殿中各种人物的遗传关系。 图的属性模型足以表示各种的事物和关系。 通过这种方式,Gods图也展示了Hercules的各种英雄事迹 - 他著名的12年工作。 在上一节中,发现Hercules参与了雅典附近的两场战争。 可以通过Hercules顶点遍历battled边来检索这些事件。
1 | gremlin> g.V(hercules).out('battled') |
这个在battled边上的time属性是通过点的顶点中心索引来建立的索引。根据约束/过滤通过time检索Hercules的battled边比线性检索所有的边和过滤(通常为O(log n),n代表边的数目)更快。JanusGraph非常智能,在可以使用的时候会使用以顶点为中心的索引。Gremlin的toString()
表达式将分解为单个步骤来展示。
1 | gremlin> g.V(hercules).outE('battled').has('time', gt(1)).inV().values('name').toString() |
更复杂的图遍历示例
下面将展示更多关于Gods图的Gremlin遍历的例子。每个遍历查询的说明在注释中显示。
Tartarus的同居者
1 | gremlin> pluto = g.V().has('name', 'pluto').next() |
Pluto的兄弟
1 | gremlin> // where do pluto's brothers live? |
最后Pluto居住在Tartarus因为他不在乎死亡。而他的兄弟们根据这些地方的品质来选择他们居住的地方。
1 | gremlin> g.V(pluto).outE('lives').values('reason') |
欢迎扫码关注公众号,更好的交流
原文作者: xiuxiuing
原文链接: https://xiuxiuing.gitee.io/blog/2018/11/14/jgstart/
许可协议: 知识共享署名-非商业性使用 4.0 国际许可协议