Gremlin - 在单个查询中从多个顶点获取 select 属性的最佳方法

Gremlin - Best way to select properties from multiple vertices in single query

我有两个相关的顶点,标签为 'DeviceFamily' 和 'Device'。它们的关系如下所示:

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

DeviceFamily 顶点有几个属性 p、q、r,Device 顶点有 x、y、z 属性。

给定一个Device id,如果我需要找出对应Device顶点的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');

这个查询有效,但我不确定这是否是最好的方法。如果有更好的方法请告诉我。

谢谢。

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

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

请注意,我省略了 hasLabel('Device'),因为它是多余的,因为您知道顶点的唯一标识符。进一步注意,虽然我在 project()by() 调制器中使用了 valueMap(),但你可以轻松地提供任何你想要的 Gremlin,将你的数据整形为这两个键(我只是选择 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() 调制器优化为在 "RELATION" 边上的单次遍历。因此,我建议稍微调整一下 - project() 边缘:

g.V('<id>').
  inE('RELATION').
  project('x','y','z','p','q','r').
    by(inV().values('x')).
    by(inV().values('y')).
    by(inV().values('z')).
    by(outV().values('p')).
    by(outV().values('q')).
    by(outV().values('r'))