【问题标题】:Gremlin - Best way to select properties from multiple vertices in single queryGremlin - 在单个查询中从多个顶点中选择属性的最佳方法
【发布时间】:2019-10-25 18:00:29
【问题描述】:

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

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

谢谢。

【问题讨论】:

    标签: graph-databases gremlin amazon-neptune


    【解决方案1】:

    我认为你应该使用某种形式的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'))
    

    【讨论】:

    • 感谢您的快速回复。这确实给了我作为带有键“设备”和“家庭”的映射的数据,它们的值又是另一个以属性名称作为键的映射。有没有办法让我得到一张带有键 x、y、z、p、q、r 的地图?
    • 如果您需要展平地图,我还添加了一些其他选项。还有其他方法可以塑造您的结果集。比如,可以将两个地图合并在一起,但是当这些简单的方法可以满足时,不想进入太多高级的 Gremlin。
    猜你喜欢
    • 2021-12-07
    • 2015-07-06
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    • 2015-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多