我有两个相关的顶点,分别带有标签“ 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');
此查询有效,但是我不确定这是否是最佳方法。请让我知道是否有更好的方法。
谢谢。
答案 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()