[英]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。
给定一个设备 id,如果我需要找出相应设备顶点的 x,y,z 属性和相关设备族的 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()
,因为它方便编写)。
如果您想要与您的 output 更匹配的东西,您仍然可以以这种直接方式使用project()
(我一直假设只有一个“关系”边缘 - 希望是这样):
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'))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.