0

我有一个像这样的图形结构-

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

所以,我有三个节点 -

Node1 是一个类似于 PS3/Nintendo 的控制台。

Node2 是具有属性 name 和 Age 的人。

Node3 是游戏节点,其游戏名称如“魔兽”。

现在我想要一个 gremlin 查询来告诉我这一点。有多少用户(Node2)拥有像 PS3 这样的控制台,玩像“魔兽”这样的游戏

我想我需要从 Node2 开始遍历,根据 Node1 属性过滤它,即控制台为“PS3”并玩“魔兽”之类的游戏

我是 gremlin 的新手并使用这样的东西 -

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

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

任何帮助表示赞赏。

4

1 回答 1

2

有多种方法可以编写查询。

选项 1:从控制台开始

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

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

g.V().has('console', 'ps3')--> 选择所有具有 key asconsole和 value as属性的顶点ps3

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

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

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

选项 2:编写上述查询的另一种方式

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

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

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

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

选项 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开始

于 2020-12-10T22:50:32.180 回答