简体   繁体   中英

how to insert a vertex in between 2 vertices with edge. Azure Cosmos DB [GREMLIN API]

图表

so from the diagram i would like to save previous versions of formula vertex that is modified by user vertex .

So here are the things that i want to do if a formula is modified

  • clone the previous value of formula vertex and add a previos_value edge from the latest formula vertex to the previous formula vertex
  • add a modified edge from the user vertex to the previous formula vertex
  • transfer all outgoing and ingoing edges from the previous formula vertex to the latest formula vertex

This would be a simple helper method to do the job:

modify = { user, product, version ->

  g.V().has("software","name",product).as("s"). /* this would be your formula vertex     */
    valueMap().
      by(unfold()).as("sm").

    addV("software").as("ns").                 /* create a new vertex                    */

    sideEffect(select("sm").unfold().as("kv"). /* copy properties from the old vertex    */
               select("ns").
               property(select("kv").by(keys),
                        select("kv").by(values))).

    property("version",version).               /* set version on the new vertex          */

    select("s").
    sideEffect(                                /* transfer out-edges                     */
      outE().as("e").
      sideEffect(
        select("ns").
        addE(select("e").by(label)).
          to(select("e").inV()).as("ne").
        select("e").properties().as("p").
        select("ne").
          property(select("p").key(),
                   select("p").value())).
      drop()).
    sideEffect(                                /* transfer in-edges                     */
      inE().as("e").
      not(outV().where(eq("s"))).              /* exclude self-referencing edges        */
      sideEffect(
        select("ns").
        addE(select("e").by(label)).
          from(select("e").outV()).as("ne").
        select("e").properties().as("p").
        select("ne").
        property(select("p").key(),
                 select("p").value())).
      drop()).

    select("ns").
    addE("previous_value").to("s").inV().      /* add edges to previous version and user */
    addE("modified").
      from(V().has("person","name",user)).

    iterate()

}

In practice it would look like this:

gremlin> g = TinkerFactory.createModern().traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
gremlin> 
gremlin> modify = { user, product, version ->
         ...
.....39> }
==>groovysh_evaluate$_run_closure1@7523d5a1
gremlin> 
gremlin> modify("marko","lop","v2")
gremlin> 
gremlin> g.V().has("name","lop").
......1>   inE().outV().
......2>   path().
......3>     by(values("name","version").fold()).
......4>     by(label).
......5>     by(elementMap())
==>[[lop],previous_value,[id:13,label:software,name:lop,lang:java,version:v2]]
==>[[lop],modified,[id:1,label:person,name:marko,age:29]]
==>[[lop,v2],created,[id:1,label:person,name:marko,age:29]]
==>[[lop,v2],created,[id:4,label:person,name:josh,age:32]]
==>[[lop,v2],created,[id:6,label:person,name:peter,age:35]]

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM