如何在两个带边的顶点之间插入一个顶点。 Azure Cosmos DB [GREMLIN API]

如何在两个带边的顶点之间插入一个顶点。 Azure Cosmos DB [GREMLIN API]

因此从图中我想保存formula vertex修改过的user vertex的早期版本。

这是修改公式后我想做的事情

  • 克隆先前的formula vertex的值,并将最近的previos_value的{​​{1}}边添加到先前的formula vertex
  • formula vertex的{​​{1}}边添加到上一个modified
  • 将上一个user vertex的所有传出和传入边缘转移到最新的formula vertex
bbytdcj7c 回答:如何在两个带边的顶点之间插入一个顶点。 Azure Cosmos DB [GREMLIN API]

这是完成工作的简单辅助方法:

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",user)).

    iterate()

}

在实践中,它看起来像这样:

gremlin> g = TinkerFactory.createModern().traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6],standard]
gremlin> 
gremlin> modify = { user,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:4,name:josh,age:32]]
==>[[lop,[id:6,name:peter,age:35]]
本文链接:https://www.f2er.com/2980700.html

大家都在问