JanusGraph基本用法

基本用法

本节对Gremlin的特性集进行了非常简短的介绍。有关该主题的详细信息,请参阅Gremlin查询语言。

本节中的示例广泛使用了一个与JanusGraph一起分发的玩具图,称为诸神之图。这张图如下图所示。抽象数据模型被称为属性图模型,这个特殊的实例描述了罗马万神殿的存在和地点之间的关系。此外,图表中的特殊文本和符号修饰符(例如粗体、下划线等)表示图表中的不同示意图/类型。

在这里插入图片描述

在这里插入图片描述

将诸神之图加载到JanusGraph中

下面的示例将打开一个JanusGraph图形实例,并加载上面所示的goods数据集的图形。JanusGraphFactory提供了一组静态的open方法,每个方法都以一个配置作为参数并返回一个graph实例。本教程演示如何使用具有不同配置的助手类GraphOf TheGodsFactory加载神的图形。本节跳过配置详细信息,但有关存储后端、索引后端及其配置的其他信息可在“存储后端、索引后端和配置参考”中找到。

使用索引后端加载

下面的示例在使用BerkeleyDB存储后端和Elasticsearch索引后端的配置上调用这些打开方法之一:

gremlin> graph = JanusGraphFactory.open('conf/janusgraph-berkeleyje-es.properties')
==>standardjanusgraph[berkeleyje:../db/berkeley]
gremlin> GraphOfTheGodsFactory.load(graph)
==>null
gremlin> g = graph.traversal()
==>graphtraversalsource[standardjanusgraph[berkeleyje:../db/berkeley], standard]

JanusGraphFactory.open()和GraphOf TheGodsFactory.load()方法在返回新构造的图形之前对其执行以下操作:

  1. 在图形上创建全局索引和顶点中心索引集合。
  2. 将所有顶点添加到图形及其属性。
  3. 将所有边添加到图形及其属性。

有关详细信息,请参阅GraphOfTheGodsFactory源代码。

对于使用janugraph/Cassandra(或JanusGraph/HBase)的用户,请确保使用conf/JanusGraph-cql-es.properties(或conf/JanusGraph HBase.properties)和graphthegodsFactory.load()。

gremlin> graph = JanusGraphFactory.open('conf/janusgraph-cql-es.properties')
==>standardjanusgraph[cql:[127.0.0.1]]
gremlin> GraphOfTheGodsFactory.load(graph)
==>null
gremlin> g = graph.traversal()
==>graphtraversalsource[standardjanusgraph[cql:[127.0.0.1]], standard]

在没有索引后端的情况下加载

您还可以使用conf/janusgraph-cql.properties、conf/janusgraph-berkeleyje.properties、conf/janusgraph-hbase.properties或conf/janusgraph-inmemory.properties配置文件打开未配置索引后端的图形。在这种情况下,您需要使用graphof thegodsfactory.loadwithout mixedIndex()方法来加载神的图形,这样它就不会试图使用索引后端。

gremlin> graph = JanusGraphFactory.open('conf/janusgraph-cql.properties')
==>standardjanusgraph[cql:[127.0.0.1]]
gremlin> GraphOfTheGodsFactory.loadWithoutMixedIndex(graph, true)
==>null
gremlin> g = graph.traversal()
==>graphtraversalsource[standardjanusgraph[cql:[127.0.0.1]], standard]

info

使用conf/janusgraph-inmemory.properties以外的任何配置文件都需要配置并运行专用的后端。如果您只想快速打开一个graph实例并探索JanusGraph的一些特性,您可以简单地选择conf/JanusGraph-inmemory.properties来打开内存中的后端。

全局图索引

访问图形数据库中的数据的典型模式是首先使用图形索引将入口点定位到图形中。该入口点是一个元素(或一组元素) — 例如.顶点或边。从入口元素开始,Gremlin路径描述描述了如何通过显式图结构遍历到图中的其他元素。

如果name属性上有一个唯一的索引,那么就可以检索Saturn顶点。然后可以检查属性映射(即Saturn的键/值对)。如图所示,saturn的顶点有一个名字“saturn”,一个10000岁的年龄,和一个类型的“titan”。saturn的孙子可以通过一个表示:“谁是saturn的孙子?”(“父亲”的反义词是“孩子”)的遍历来取回。结果就是hercules。

gremlin> saturn = g.V().has('name', 'saturn').next()
==>v[256]
gremlin> g.V(saturn).valueMap()
==>[name:[saturn], age:[10000]]
gremlin> g.V(saturn).in('father').in('father').values('name')
==>hercules

属性place也在图索引中。属性place是边的属性。因此,JanusGraph可以索引图索引中的边( Therefore, JanusGraph can index edges in a graph index. )。在雅典50公里范围内发生的所有事件中,可以查询诸神之图(latitude:37.97 and long:23.72). 然后,给定这些信息,哪些顶点参与了这些事件。

gremlin> g.E().has('place', geoWithin(Geoshape.circle(37.97, 23.72, 50)))
==>e[a9x-co8-9hx-39s][16424-battled->4240]
==>e[9vp-co8-9hx-9ns][16424-battled->12520]
gremlin> g.E().has('place', geoWithin(Geoshape.circle(37.97, 23.72, 50))).as('source').inV().as('god2').select('source').outV().as('god1').select('god1', 'god2').by('name')
==>[god1:hercules, god2:hydra]
==>[god1:hercules, god2:nemean]

图索引是JanusGraph中的一种索引结构。JanusGraph会自动选择图索引来回答要求所有顶点(g.V)或所有边(g.E)满足一个或多个约束(如has或interval)的问题。JanusGraph中索引的第二个方面称为顶点中心索引。以顶点为中心的索引用于加速图内部的遍历。顶点中心索引将在后面描述。

图形遍历示例

赫拉克勒斯,朱庇特和阿尔克墨尼之子,拥有超人的力量。赫拉克勒斯是半神,因为他的父亲是神,母亲是人。朱诺,朱庇特的妻子,对朱庇特的不忠感到愤怒。为了报复,她用暂时的精神错乱蒙蔽了赫拉克勒斯的双眼,并让他杀死了妻子和孩子。为了赎罪,赫拉克勒斯被德尔斐的神谕下令服侍尤里修斯。尤里修斯任命赫拉克勒斯担任12个职位。

在上一节中,我们证明了saturn的孙子是大力神。这可以用循环来表示。在本质上,大力神是顶点,是2步远的saturn沿在(“父亲”)路径。

gremlin> hercules = g.V(saturn).repeat(__.in('father')).times(2).next()
==>v[1536]

赫拉克勒斯是半神。为了证明赫拉克勒斯是半人半神,必须对他父母的出身进行考察。有可能从大力神的顶点出发找到他母亲和父亲。最后,可以确定他们的类型 — 属于“上帝”和“人类”

gremlin> g.V(hercules).out('father', 'mother')
==>v[1024]
==>v[1792]
gremlin> g.V(hercules).out('father', 'mother').values('name')
==>jupiter
==>alcmene
gremlin> g.V(hercules).out('father', 'mother').label()
==>god
==>human
gremlin> hercules.label()
==>demigod

迄今为止的例子都是关于罗马万神殿中不同角色的血缘关系。属性图模型的表达能力足以表示多种类型的事物和关系。这样,诸神之图也显示了赫拉克勒斯的各种英雄事迹——他著名的12项劳动。在上一节中,人们发现大力神参与了雅典附近的两次战斗。通过穿越大力神顶点外的战斗边缘来探索这些事件是可能的。

gremlin> g.V(hercules).out('battled')
==>v[2304]
==>v[2560]
==>v[2816]
gremlin> g.V(hercules).out('battled').valueMap()
==>[name:[nemean]]
==>[name:[hydra]]
==>[name:[cerberus]]
gremlin> g.V(hercules).outE('battled').has('time', gt(1)).inV().values('name')
==>cerberus
==>hydra

战斗边上的边属性time由顶点的顶点中心索引索引。根据对time的约束/过滤器检索关联到Hercules的战边比对所有边进行线性扫描和过滤(通常是O(logn),其中n是关联边的数目)要快。JanusGraph足够智能,可以在可用时使用以顶点为中心的索引。Gremlin表达式的toString()显示分解为各个步骤。

gremlin> g.V(hercules).outE('battled').has('time', gt(1)).inV().values('name').toString()
==>[GraphStep([v[24744]],vertex), VertexStep(OUT,[battled],edge), HasStep([time.gt(1)]), EdgeVertexStep(IN), PropertiesStep([name],value)]

更复杂的图形遍历示例

冥王星生活在塔塔鲁斯的深处。他和赫拉克勒斯的关系因为赫拉克勒斯和他的宠物瑟伯鲁斯搏斗而变得紧张。然而,赫拉克勒斯是他的侄子 — 他该如何让赫拉克勒斯为他的傲慢付出代价?

基于诸神之图下面的Gremlin遍历提供了更多的例子。前面一行中提供了对每个遍历的解释,作为//注释。

塔塔鲁斯的同居者

gremlin> pluto = g.V().has('name', 'pluto').next()
==>v[2048]
gremlin> // who are pluto's cohabitants?
gremlin> g.V(pluto).out('lives').in('lives').values('name')
==>pluto
==>cerberus
gremlin> // pluto can't be his own cohabitant
gremlin> g.V(pluto).out('lives').in('lives').where(is(neq(pluto))).values('name')
==>cerberus
gremlin> g.V(pluto).as('x').out('lives').in('lives').where(neq('x')).values('name')
==>cerberus

pluto的兄弟们

gremlin> // where do pluto's brothers live?
gremlin> g.V(pluto).out('brother').out('lives').values('name')
==>sky
==>sea
gremlin> // which brother lives in which place?
gremlin> g.V(pluto).out('brother').as('god').out('lives').as('place').select('god', 'place')
==>[god:v[1024], place:v[512]]
==>[god:v[1280], place:v[768]]
gremlin> // what is the name of the brother and the name of the place?
gremlin> g.V(pluto).out('brother').as('god').out('lives').as('place').select('god', 'place').by('name')
==>[god:jupiter, place:sky]
==>[god:neptune, place:sea]

最后,pluto住在塔塔鲁斯,因为他没有表现出对死亡的关注。另一方面,他的兄弟们选择他们的地点是基于他们对这些地点某些特质的热爱。!

gremlin> g.V(pluto).outE('lives').values('reason')
==>no fear of death
gremlin> g.E().has('reason', textContains('loves'))
==>e[6xs-sg-m51-e8][1024-lives->512]
==>e[70g-zk-m51-lc][1280-lives->768]
gremlin> g.E().has('reason', textContains('loves')).as('source').values('reason').as('reason').select('source').outV().values('name').as('god').select('source').inV().values('name').as('thing').select('god', 'reason', 'thing')
==>[god:neptune, reason:loves waves, thing:sea]
==>[god:jupiter, reason:loves fresh breezes, thing:sky]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值