Warm tip: This article is reproduced from serverfault.com, please click

gremlin-如何在单个遍历中从一个顶点添加多个边

(gremlin - How to add multiple edges from one vertex in a single traversal)

发布于 2020-12-01 05:01:19

我有三个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
Questioner
Fook
Viewed
0
stephen mallette 2020-12-01 19:48:51

你是正确的,重复项来自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]]