如何在一次遍历中从一个顶点添加多条边

How to add multiple edges from one vertex in a single traversal

我有三个 user 顶点。汤姆和迈克 follow 鲍勃

g.addV("user").property(single,"name", "bob")
g.addV("user").property(single,"name", "tom")
g.addV("user").property(single,"name", "mike")
g.V().hasLabel("user").has("name", "tom").as("tom").V().hasLabel("user").has("name", "bob").addE("follow").from("tom")
g.V().hasLabel("user").has("name", "mike").as("mike").V().hasLabel("user").has("name", "bob").addE("follow").from("mike")

我想给用户添加一个alert。从 Bob 到 alert 应该有一条边,alert 应该有一条边到 follow Bob.

的用户。
g.V()
.hasLabel("user")
.has("name", "bob")
.as("bob")
.in("follow")
.as("followers")
.addV("alert")
.as("alert")
.addE("alert")
.from("alert")
.to("followers")
.addE("alert")
.from("bob")
.to("alert")

我最终得到的是两个 alert 顶点。 Bob 对每个新 alert 顶点都有优势,而警报对 Tom 和 Mike(追随者)有优势。

我相信这是因为当我 select 追随者时,它分支 (?) 遍历并开始创建重复项,但这不是我想要的。我如何构造此遍历以生成适当的 select 离子但仅创建一个 alert 顶点?我想要得到的是:

       bob
        |
        v
      alert
     |     |
     v     v
   mike   tom

您是正确的,因为 in('follow') 产生了两个遍历器,因此 addV('alert') 被多次调用。有很多方法可以解决这个问题,但我立即想到了以下方法:

gremlin> g.V().
......1>   hasLabel("user").
......2>   has("name", "bob").as("b").
......3>   addV("alert").as('a').
......4>   addE("alerted").from("b").
......5>   select('b').
......6>   in("follow").
......7>   addE("alerted").from("a").iterate()
gremlin> g.V()
==>v[0]
==>v[2]
==>v[4]
==>v[8]
gremlin> g.V().elementMap()
==>[id:0,label:user,name:bob]
==>[id:2,label:user,name:tom]
==>[id:4,label:user,name:mike]
==>[id:8,label:alert]
gremlin> g.E().elementMap()
==>[id:6,label:follow,IN:[id:0,label:user],OUT:[id:2,label:user]]
==>[id:7,label:follow,IN:[id:0,label:user],OUT:[id:4,label:user]]
==>[id:9,label:alerted,IN:[id:8,label:alert],OUT:[id:0,label:user]]
==>[id:10,label:alerted,IN:[id:2,label:user],OUT:[id:8,label:alert]]
==>[id:11,label:alerted,IN:[id:4,label:user],OUT:[id:8,label:alert]]