【问题标题】:gremlin / tinkerpop - efficient tree-like traversal result to limit redundanciesgremlin / tinkerpop - 有效的树状遍历结果以限制冗余
【发布时间】:2018-01-05 16:17:43
【问题描述】:

我有以下场景:

我正在尝试生成类似于以下结果集的内容:

[
  {
    node: A,
    tags: [T1.title, T2.title]
  },
  {
    node: B,
    tags: [T2.title]
  }
]

但我能做的最好的事情就是产生大量冗余数据:

[ 
  { node:A, tag: T1.title }, 
  { node:A, tag: T2.title }, 
  { node:B, tag: T2.title } 
]

类似这样的:

g.V()
  .has('label','stuff').as('n')
  .outE('tagged').inV().values('title').as('x')
  .select('n', 'x')

我在repeatcapfold 是否可以帮助我之间不知所措

【问题讨论】:

    标签: azure-cosmosdb gremlin tinkerpop


    【解决方案1】:

    在向 Gremlin 提问时,将示例数据作为 Gremlin 语句提供总是有帮助的,该语句可以复制/粘贴到控制台会话中:

    g.addV('stuff').property('name','a').as('a').
      addV('stuff').property('name','b').as('b').
      addV('tag').property('title','t1').as('t1').
      addV('tag').property('title','t2').as('t2').
      addE('tagged').from('a').to('t1').
      addE('tagged').from('a').to('t2').
      addE('tagged').from('b').to('t2').iterate()
    

    您可以使用group() 获得基于Map 的格式:

    gremlin> g.V().hasLabel('stuff').
    ......1>   group().
    ......2>     by('name').
    ......3>     by(out('tagged').values('title').fold())
    ==>[a:[t1,t2],b:[t2]]
    

    【讨论】:

    • 不错!不过有两个问题 - 如果我想要整个顶点标记为“东西”而不仅仅是名称,我有机会吗? - 我想,要访问顶点道具,我需要像 outE().inV() 一样 - 但你似乎可以跳过那个
    • 如果你想要顶点本身,然后传递一个空的by() 而不是by('name'),它获取顶点的特定属性。如果您需要更复杂的东西,您还可以将匿名遍历传递给 by()。第一个by() 的重点是对Gremlin 说,“这就是我想要Map 的键(即分组的内容)。注意outE().inV() 只是out()。你只需要如果您出于某种原因关心边缘的属性(例如边缘上的过滤器),请执行outE().inV()
    • 这可能是特定于 Cosmos 的实现,但是留空是把 Vertex 的 key 作为 grouping-Key。我的意思是,这有点道理,因为一个完整的 Vertex 可能不能作为一个键 - 那么,你是在查询中获得完整的 Vertex 作为键还是仅仅作为 id?
    • 完整的Vertex 只能作为 GraphSON 3.0 中键的一部分返回。如果他们只支持 2.0 那么这可能是有道理的。也就是说,TinkerPop 倾向于建议您不要在生产代码中返回完整的顶点 - 仅返回您需要的数据(就像您不会在 SQL 中指定 SELECT * FROM table 一样 - 您只需输入您想要的字段)。跨度>
    猜你喜欢
    • 2023-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多