【问题标题】:Merge results from multiple queries in Gremlin在 Gremlin 中合并多个查询的结果
【发布时间】:2020-01-28 09:25:41
【问题描述】:

假设我想从我的数据库中获取一些顶点:

g.V(1, 2, 3)

然后我有另一组顶点:

g.V(4, 5, 6)

想象一下,它不仅仅是g.V(),而是一些更复杂的遍历来获取我的顶点。但遍历必须以V() 开头,因为我想从我所有的节点中挑选。

我们也假设我想多次这样做。所以我可能想合并 7 个不同的结果集。 每个人都可以有完全不同的方式来获得结果。


现在我想将这两个结果合并到一个结果集中。我的第一个想法是:

g.V(1, 2, 3).fold().as('x').V(4, 5, 6).fold().as('x').select(all, 'x').unfold()

但这不起作用。第二次调用fold 将清除我的“局部变量”,因为这是一个障碍步骤。

我目前的尝试是这样的:

g.V(1, 2, 3).fold().union(identity(), V(4, 5, 6).fold()).unfold()

这可行,但看起来有点太复杂了。如果我想重复 7 次,那将是一个非常复杂的查询。

有没有更好的方法来完成两个不同查询的结果的简单合并?

【问题讨论】:

    标签: gremlin tinkerpop tinkerpop3 amazon-neptune gremlinpython


    【解决方案1】:

    aggregate()怎么样:

    gremlin> g.V(1,2,3).aggregate('x').fold().V(4,5,6).aggregate('x').cap('x')
    ==>[v[1],v[2],v[3],v[4],v[5],v[6]]
    gremlin> g.inject(1).union(V(1,2,3).aggregate('x'),V(4,5,6).aggregate('x')).cap('x')
    ==>[v[1],v[2],v[3],v[4],v[5],v[6]]
    

    您的问题中没有特定的遍历,所以我不得不想出一些人为的例子,但这里的重点是您可以使用 aggregate() 将特定步骤的输出影响到 @987654324 @ 可以在遍历结束时将 cap() 输出。

    【讨论】:

    • 这对我有用,但如果某些分支不存在(我用 coalesce(__.id(), __.常量(NONE))。是否可以按提交的顺序获取响应?
    • 没关系,我通过给每个子查询一个索引并将其投影为常量来解决它: .project("result", "orderNumber").by(__.id(), __constant(orderNumber )) 其中 orderNumber 是将结果链接到原始查询的客户端上的引用。我看到你用“使用项目”回答了很多问题,它也解决了我的问题:)
    【解决方案2】:

    我的建议是您当前的方法,实际上,我不认为这会比任何其他解决方案更复杂。事实上,我认为无论添加多少分支,它都非常简单。

    g.V(1, 2, 3).fold().
      union(identity(),
            V(4, 5, 6).fold(),
            V(7, 8, 9).fold(),
            ...).unfold()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多