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

时间:2021-04-30 11:44:46

标签: gremlin janusgraph gremlinpython

假设我有一个社交图谱,其中一部分代表参加派对的人以及一个用于跟踪邀请的应用。我有一个约翰的顶点,一个大卫的顶点,他们都参加了同一个派对。

在应用中,约翰说他邀请了莎拉,大卫说他是被莎拉邀请的,但我没有莎拉的顶点。

在单个查询中,我可以创建莎拉并将约翰连接到莎拉,将莎拉连接到大卫吗?

到目前为止,我能做的最好的事情就是使用合并模式获取或创建以下内容的人中缺少莎拉:

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()

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

1 个答案:

答案 0 :(得分:0)

首先检查 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]