Как скопировать ребра из одной вершины в новую в Gremlin - PullRequest
0 голосов
/ 12 марта 2019

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

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

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

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

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

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

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

enter image description here

1 Ответ

0 голосов
/ 12 марта 2019

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

...