0

背景:我尝试使用这个问题作为基线,但因为我使用的是 Cosmos 并且有一个稍微不同的场景,所以我无法让它工作。

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

这个想法是,如果用户想要更改他们的用户名,从 User123 到 User123db,

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

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

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

以下是可用于 CosmosDB 的可用 Gremlin 步骤

在此处输入图像描述

4

1 回答 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为每个边缘标签(每个方向)添加一步。

于 2019-03-12T15:16:12.717 回答