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