Как скопировать ребра из одной вершины в новую в Gremlin

Предыстория: я пытался использовать этот вопрос в качестве основы, но, поскольку я использую Космос и у меня был немного другой сценарий, я не смог заставить его работать.

Я хочу знать, возможно ли скопировать все ребра (входящие и исходящие) из одной вершины в новую вершину в CosmosDb Gremlin. Причина в том, что я использую имя пользователя в качестве ключа раздела, например, User-User123, и в Cosmos DB это нельзя изменить после установки.

Идея заключается в том, что если пользователь хочет изменить свое имя пользователя, с User123 на User123db,

  • новая вершина будет создана с новым ключом раздела User-User123db.
  • все ребра из User-User123 будут указывать на User-User123db
  • Vertex User-User123 будет удален.

Используя приведенный ниже график tinkerpop, как можно было бы создать новую вершину с именем marko2 и указать все входные и выходные ребра от marko до новой вершины marko2, а затем удалить старый marko.

Спасибо всем, кто может помочь =)

Вот доступные шаги Gremlin, которые можно использовать с CosmosDB

1 ответ

Я думаю, что проблема заключается в использовании 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 шаг за метку края (за направление).

Другие вопросы по тегам