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'))
我有两个相关的顶点,标签为 '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'))