如何在gremlin中本地对子查询中的元素进行排序?

时间:2019-01-13 22:35:07

标签: gremlin

假设我们有一个具有属性的人物图

  • name(字符串)
  • age(int)

...和friend位于其中一些之间。进一步假设我们有一个复杂的gremlin查询,该查询最终会生成人顶点。

现在,对于每个结果人员,我们想在子查询中找到三个最老的朋友

这是粗略的查询结构:

g.traversal.V()
    // complex filtering and navigation here, produces person vertices
    .flatMap(
        __.out(friend)
        .order().by("age", desc)
        .limit(3)
    )
    // complex query continues with the three oldest friends per input vertex here

此查询的问题是order().by(...)步骤是全局。输入flatMap(...)的所有人的顶点总共得到三个人

我想要接收的是(最多)三个人(每个顶点最多 )进入flatMap(...)步骤。

您将如何在gremlin中做到这一点?我读过有各种各样的“本地”作用域,但是我无法使其工作。

1 个答案:

答案 0 :(得分:0)

我希望您的遍历能够如您所愿。请参阅我的TinkerGraph示例和“现代”玩具图:

gremlin> g.V().hasLabel('person').flatMap(out().order().by(id))
==>v[2]
==>v[3]
==>v[4]
==>v[3]
==>v[5]
==>v[3]
gremlin> g.V().hasLabel('person').flatMap(out().order().by(id).limit(1))
==>v[2]
==>v[3]
==>v[3]
gremlin> g.V().hasLabel('person').flatMap(out().order().by(id).limit(2))
==>v[2]
==>v[3]
==>v[3]
==>v[5]
==>v[3]

或者也许只用map()就更容易看到实际效果:

gremlin> g.V().hasLabel('person').map(out().order().by(id).fold())
==>[v[2],v[3],v[4]]
==>[]
==>[v[3],v[5]]
==>[v[3]]
gremlin> g.V().hasLabel('person').map(out().order().by(id).limit(1).fold())
==>[v[2]]
==>[]
==>[v[3]]
==>[v[3]]
gremlin> g.V().hasLabel('person').map(out().order().by(id).limit(2).fold())
==>[v[2],v[3]]
==>[]
==>[v[3],v[5]]
==>[v[3]]

也许您的数据中有某些您不期望的东西?如果问题仍然存在,也许您可​​以使用如上所示的map()进行调试,看看在展平列表之前返回了什么?如果其他所有方法均失败,请使用script(提供一些示例数据)和Gremlin Console会话来更新您的问题,以证明该数据失败。