AWS neptune 上的 gremlin 遍历

gremlin traversal on AWS neptune

我有这样的图结构-

Node1(Console)   <----Uses---  Node2(Name, Age) -----plays----> Node3(Game)
 

所以,我有三个节点 -

Node1 是一个类似于 PS3/ 任天堂的控制台。

节点 2 是具有属性名称和年龄的人。

Node3 是游戏节点,游戏名称如 'warcraft'.

现在我想要一个 gremlin 查询来告诉我这一点。 有多少用户(节点 2)拥有像 PS3 这样的控制台,玩像 'warcraft'

这样的游戏

我想我需要从 Node2 开始遍历,根据 Node1 属性 过滤它,即控制台 'PS3' 并玩游戏 'warcraft'

我是 gremlin 的新手,正在使用类似这样的东西 -

g.V().hasLabel('user').outE('uses').inV().has('console', 'ps3').count()

以上查询仅回答了我所需结果的一半。我如何根据播放关系过滤 Node2。

感谢任何帮助。

有多种编写查询的方法。

选项 1:从控制台启动

g.V().has('console', 'ps3').in('uses').where(out('plays').has('game', 'warcraft')).valueMap('name')

让我解释一下这里的结构:

g.V().has('console', 'ps3') --> Select 所有具有 属性 且键为 console 且值为 ps3

的顶点

in('uses') --> 从前面的顶点集合,通过标签为 uses 的边跳转到传入顶点。在这个阶段,我们的解决方案中会有玩家顶点。

where(out('plays').has('game', 'warcraft')) --> 对现有解决方案应用过滤器。由于我们正在使用 where 我们不会 jump/traverse 到顶点的下一步。

valueMap('name') --> 如果现有解决方案是玩家顶点,则投射一个或多个属性。

方案二:上面query的另一种写法

g.V().has('console', 'ps3').in('uses').as('myusers').out('plays').has('game', 'warcraft').select('myusers').by('name')

as('myusers') --> 给这个阶段的顶点提供一个reference/alias。请注意,它不会在此阶段存储所有结果,而只是在查询中此时提供对顶点类型的引用。

out('plays').has('game', 'warcraft') --> 与上次使用where不跳转不同,这次我们跳到game个顶点。

select('myusers').by('name') --> 因为我们想要投影用户,但当前的解决方案是游戏顶点,我们需要 select 我们使用之前存储的参考来做的用户顶点。

选项 3:从用户开始

g.V().hasLabel('user').where(out('plays').has('game','warcraft')).where(out('uses').has('console','ps3')).valueMap('name')

还有很多方法可以写这个查询,比如使用path(),但我不会在这里详细介绍。

既然你刚开始学习 Gremlin,我建议你从 https://kelvinlawrence.net/book/Gremlin-Graph-Guide.html

开始