假设我们有一个具有属性的人物图
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中做到这一点?我读过有各种各样的“本地”作用域,但是我无法使其工作。
答案 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会话来更新您的问题,以证明该数据失败。