我有三个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
,应该有一个优势,而对Bobalert
的用户来说,应该有优势follow
。
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)(追随者)则具有优势。
我相信这是因为当我选择关注者时,它会分支(?)遍历并开始创建重复项,但这不是我想要的。如何构造此遍历以进行适当的选择,但仅创建一个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]]