【问题标题】:how to insert a vertex in between 2 vertices with edge. Azure Cosmos DB [GREMLIN API]如何在有边的 2 个顶点之间插入一个顶点。 Azure Cosmos DB [GREMLIN API]
【发布时间】:2019-12-04 05:18:14
【问题描述】:

所以从图中我想保存由user vertex修改的formula vertex的早期版本。

如果公式被修改,这是我想做的事情

  • 克隆formula vertex的前一个值,并从最新的formula vertex到前一个formula vertex添加一个previos_value
  • modified 边缘从user vertex 添加到前一个formula vertex
  • 将所有传出和传入边缘从以前的formula vertex 转移到最新的formula vertex

【问题讨论】:

    标签: azure-cosmosdb graph-databases gremlin


    【解决方案1】:

    这将是一个简单的辅助方法来完成这项工作:

    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()
    
    }
    

    实际上它看起来像这样:

    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]]
    

    【讨论】:

    • 谢谢!!但是我如何使用 azure cosmos db[gremlin api] 进行这项工作?
    • 如果不能按原样运行,请告诉我 Azure 不支持哪些步骤(我没有 Azure 的测试环境)。
    • 上面写着Unsupported groovy language rule: 'closure' text: '{user,product,version-
    • 好吧,您不需要通过网络发送整个 lambda。我在 Groovy 中编写的代码可以在您的客户端(例如用 Java 编写),它只是用于构建整个遍历,然后最终可以发送到 Azure。
    猜你喜欢
    • 2023-03-26
    • 2017-11-04
    • 1970-01-01
    • 2022-12-17
    • 2017-02-20
    • 2019-07-27
    • 1970-01-01
    • 1970-01-01
    • 2021-11-07
    相关资源
    最近更新 更多