有多种方法可以编写查询。
选项 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开始