如何在 gremlin(小精灵)本地对子查询中的元素进行排序



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

  • name(字符串)
  • age(整数)

。并在其中一些之间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(...)步骤。

你会如何在小精灵中做到这一点?我读过有各种各样的"本地"范围,但我无法让它工作。

我希望

您的遍历能够按照您希望的方式工作。请参阅我使用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()进行调试,并在列表展平之前查看返回的内容?如果所有其他方法都失败了,请使用提供一些示例数据的脚本和演示该数据失败的 Gremlin 控制台会话更新您的问题。

最新更新