假设我们有一个人物图,具有属性
-
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 控制台会话更新您的问题。