Gremlin-在单个查询中从多个顶点选择属性的最佳方法

时间:2019-10-25 18:00:29

标签: graph-databases gremlin amazon-neptune

我有两个相关的顶点,分别带有标签“ DeviceFamily”和“ Device”。它们之间的关系如下图所示:

(DeviceFamily)-[:RELATION]->(Device)

DeviceFamily顶点具有一些属性,例如p,q,r,而Device顶点具有一些属性,例如x,y,z。

给出设备ID,如果我需要找出相应设备顶点的x,y,z属性和相关DeviceFamily的p,q,r属性,我应该执行什么查询?

我找到的一个解决方案是:

g.V('<id>').hasLabel('Device').as('d1', 'd2', 'd3').inE('RELATION').outV().as('f1', 'f2', 'f3').select('d1', 'd2', 'd3', 'f1', 'f2', 'f3').by('x', 'y', 'z', 'p', 'q', 'r');

此查询有效,但是我不确定这是否是最佳方法。请让我知道是否有更好的方法。

谢谢。

1 个答案:

答案 0 :(得分:1)

我认为您应该使用project()的某种形式:

g.V('<id>').
  project('device','family').
    by(__.valueMap('x','y','z'))
    by(__.in('RELATION').valueMap('p','q','r'))

请注意,由于您知道顶点的唯一标识符,因此省略了hasLabel('Device')是多余的。进一步注意,当我在valueMap()的{​​{1}}调制器中使用by()时,您可以轻松地提供任何您想要的Gremlin来将数据成形为这两个键(我只是选择了{{1} },因为这样写起来很方便。

如果您想要更匹配输出的内容,您仍然可以直接使用project()(我一直假设只有一个“ RELATION”边-希望是这样):< / p>

valueMap()

我认为大多数图形数据库不会将最后三个project()调制器优化为在“ RELATION”边上进行一次遍历。因此,我建议稍作调整-g.V('<id>'). project('x','y','z','p','q','r'). by('x'). by('y'). by('z'). by(in('RELATION').values('p')). by(in('RELATION').values('q')). by(in('RELATION').values('r')) 边缘:

by()