如何在Gremlin中将边从一个顶点复制到新顶点

问题描述 投票:0回答:1

背景:我尝试使用this question作为基线,但因为我使用的是Cosmos并且情况略有不同,所以我无法使其工作。

我想知道是否可以将所有边(入和出)从一个顶点复制到CosmosDb Gremlin中的新顶点。原因是我使用用户名作为分区键,例如User-User123和Cosmos DB,一旦设置就无法更改。

想法是,如果用户想要更改其用户名,从User123更改为User123db,

  • 将使用User-User123db的新分区键创建新顶点。
  • User-User123的所有边缘都指向User-User123db
  • 然后将删除Vertex User-User123。

使用下面的tinkerpop图,如何创建一个名为marko2的新顶点,并将marko的所有入边和出边指向新的marko2顶点,然后删除旧的marko。

感谢任何可以帮助的人=)

Here are the available Gremlin steps that can be used with CosmosDB

enter image description here

azure-cosmosdb gremlin tinkerpop3 azure-cosmosdb-gremlinapi
1个回答
0
投票

我想问题是使用addE(<traversal>) ..?至少那是在纯TinkerPop 3.2环境中失败的原因。由于无法在TP 3.2中动态设置边缘标签,因此您必须知道所有可能的边缘标签,从用户顶点进出,并分别处理每个标签。

基于链接答案的原始遍历:

g.V(4).as('source').
  addV().
    property(label, select('source').label()).as('clone').
  sideEffect(                                                // copy vertex properties
    select('source').properties().as('p').
    select('clone').
      property(select('p').key(), select('p').value())).
  sideEffect(                                                // copy knows out-edges
    select('source').outE('knows').as('e').
    select('clone').
    addE('knows').as('eclone').
      to(select('e').inV()).
    select('e').properties().as('p').                        // copy knows out-edge properties
    select('eclone').
      property(select('p').key(), select('p').value())).
  sideEffect(                                                // copy knows out-edges
    select('source').outE('knows').as('e').
    select('clone').
    addE('knows').as('eclone').
      to(select('e').inV()).
    select('e').properties().as('p').                        // copy knows out-edge properties
    select('eclone').
      property(select('p').key(), select('p').value())).
  sideEffect(                                                // copy created out-edges
    select('source').outE('created').as('e').
    select('clone').
    addE('created').as('eclone').
      to(select('e').inV()).
    select('e').properties().as('p').                        // copy created out-edge properties
    select('eclone').
      property(select('p').key(), select('p').value())).
  sideEffect(                                                // copy knows in-edges
    select('source').inE('knows').as('e').
    select('clone').
    addE('knows').as('eclone').
      from(select('e').outV()).
    select('e').properties().as('p').                        // copy knows in-edge properties
    select('eclone').
      property(select('p').key(), select('p').value()))

因此,您基本上只需为每个边缘标签添加一个sideEffect步骤(每个方向)。

© www.soinside.com 2019 - 2024. All rights reserved.