如何在一次遍历中从一个顶点添加多条边
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]]
我有三个 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]]