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
开始
我有这样的图结构-
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
开始