gremlin 在两个顶点之间添加顶点 - 在单个查询中?

gremlin add vertex between two vertex - in a single query?

假设我有一个社交图,其中一部分代表参加聚会的人,还有一个用于跟踪邀请的应用程序。我有一个 John 的顶点和 David 的一个顶点,他们都参加了同一个聚会。

在应用程序中,John 说他邀请了 Sarah,David 说他是 Sarah 邀请的,但我没有 Sarah 的顶点。

在单个查询中,我可以创建 Sarah 并将 John 连接到 Sarah 并将 Sarah 连接到 David 吗?

到目前为止,我能做的最好的事情就是使用 get 或 create 的合并模式确定 Sarah 从具有以下特征的人中消失:

g.V().has('name', 'John').out().has('name', 'Sarah').as_('x').out().has('name', 'David').select('x').fold().coalesce(unfold(), constant('how to I put Sarah between John and David here?')).next()

能否在一个查询中全部完成 - 用多步变异遍历替换我的常量?

编辑:

我进一步了解了它。如果我已经有了 Sarah 的顶点,我认为以下方法有效: g.V().has('name', 'John').addE('invited').to(g.V().has('name', 'Sarah').as_('x').addE('invited').to(g.V().has('name', 'David')).select('x')).next()

这是推荐的方法吗?有没有办法在同一查询中创建 Sarah 顶点?我会在里面嵌套另一个 .fold().coalesce(unfold(), ...) 吗?

首先检查 Sarah,如果找不到则创建,可以简化您的查询。这是来自 Gremlin 控制台。

gremlin> g.addV('person').property('name','John')
==>v[62869]
gremlin> g.addV('person').property('name','David')
==>v[62871]    

gremlin> g.V().has('name','Sarah').
......1>   fold().
......2>   coalesce(unfold(),
......3>             addV('person').property('name','Sarah')).as('s').
......4>   addE('invited').to(V().has('name','David')).
......5>   addE('invited').from(V().has('name','John')).to('s')    
==>e[62876][62869-invited->62873] 

gremlin> g.V().has('name','Sarah').outE().inV().path().by('name').by(label)
==>[Sarah,invited,David]
gremlin> g.V().has('name','Sarah').inE().outV().path().by('name').by(label)
==>[Sarah,invited,John]