【问题标题】:In gremlin how to get specific properties based on another property在 gremlin 中如何根据另一个属性获取特定属性
【发布时间】:2021-12-30 18:11:01
【问题描述】:

在 gremlin 中,我想根据父顶点的相邻属性的属性(一个列出哪些属性的数组)从顶点集合中检索特定属性。 我不确定是否可以在一个查询中完成。下面我有一个示例图。实际上会有很多项目,每个项目都有一个模板(其中包含允许的属性列表)和一个文档集合。在下面的示例中,由于连接到 ProjectA 的 Template 在列表中只有 property1 和 property2 我只想从 Documents 中取回 property1 和 property2。

g.addV('Project').property('name', 'ProjectA').as('p').
......1>    addV('Template').property('name','TemplateA').property(list,'allowed', 'property1').property(list,'allowed', 'property2').as('t').
......2>    addV('Document').property('name', 'DocumentA').property('property1', '1').property('property2', '2').property('property3', '3').as('d1').
......3>    addV('Document').property('name', 'DocumentB').property('property1', '1').property('property2', '2').property('property3', '3').as('d2').
......4>    addE('hasDocuments').from('p').to('d1').
......5>    addE('hasDocuments').from('p').to('d2').
......6>    addE('hasTemplate').from('p').to('t') 

【问题讨论】:

    标签: gremlin azure-cosmosdb-gremlinapi


    【解决方案1】:

    您可以通过使用别名和 where 过滤在一个查询中完成。

    gremlin> g.V().
    ......1>   hasLabel('Project').as('project').
    ......2>   out('hasTemplate').
    ......3>   values('allowed').as('allowed_properties').
    ......4>   select('project').
    ......5>   out('hasDocuments').as('docs').
    ......6>   properties().as('selected_properties').
    ......7>   label().
    ......8>   where(eq('allowed_properties')).
    ......9>   select('selected_properties')
    ==>vp[property1->1]
    ==>vp[property1->1]
    ==>vp[property2->2]
    ==>vp[property2->2]
    

    【讨论】:

    • 我总是忘记label()properties() 之后起作用。可能值得一提的是,key() 也可以使用。
    【解决方案2】:

    有趣的问题。这需要一些 Gremlin 体操:

    gremlin> g.V().has('name','ProjectA').
    ......1>   aggregate('p').by(out('hasTemplate').values('allowed').fold()).
    ......2>   out('hasDocuments').
    ......3>   elementMap().
    ......4>   map(unfold().as('kv').
    ......5>       filter(select('p').
    ......6>              unfold().unfold().as('p1').
    ......7>              where('p1',eq('kv')).
    ......8>                by().by(keys)).
    ......9>       group().by(keys).by(select(values)))
    ==>[property2:2,property1:1]
    ==>[property2:2,property1:1]
    

    在第 1 行,我们aggregate() 模板键为“p”。然后我们elementMap()所有将获取所有键/值的文档。然后,我们开始在第 4 行通过unfold() 过滤每个映射,将每个映射与其键/值对匹配,然后将这些键与“p”中的键匹配。然后,我们使用第 9 行的常见 group() 模式将键/值对合并回 Map

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-21
      • 2021-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多