Как воссоздать вершину с помощью apache tinkerpop gremlin?
Мне нужно заменить
vertex
T.id
к сожалению, это запрещено в
Apache Tinkerpop Gremlin
. Поэтому мне нужно удалить вершину и создать новую с таким же
properties
а также
incoming & outgoing edges
.
Есть ли простой способ / ярлык для воссоздания?
2 ответа
Один из подходов - создать клон вершины, которую вы собираетесь удалить первой. Это можно сделать в Гремлине.
Вот один из способов клонировать вершину DFW в наборе данных воздушных маршрутов. Вы можете изменить этот код, чтобы добавить новое значение идентификатора.
g.V().has('code','DFW').as('dfw').
addV().property(label, select('dfw').label()).as('new').
select('dfw').properties().as('dfwprops').
select('new').property(select('dfwprops').key(),
select('dfwprops').value())
Здесь есть пример и обсуждение http://www.kelvinlawrence.net/book/PracticalGremlin.html#dfwcopy
В AWS Neptune нет поддержки транзакций, поэтому пришлось использовать скрипт. Вот функция Python для создания скрипта для клонирования вершин и перемещения ребер.
#Clone Vertex -> Drop Edges -> Move Edges -> Drop old Vertex
def generate_recreate_vertex(old_id, new_id):
clone_vertex_with_new_id = 'g.V(\'{}\').as(\'old_vertex\').addV().property(label, select(\'old_vertex\').label()).property(T.id, \'{}\').as(\'new_vertex\').select(\'old_vertex\').properties().as(\'old_vertex_properties\').select(\'new_vertex\').property(select(\'old_vertex_properties\').key(), select(\'old_vertex_properties\').value()).iterate();'.format(old_id, new_id)
edges = g.V(old_id).bothE().elementMap().toList()
edge_script = ""
for edge in edges:
edge_id = edge['id']
outE = '.from(g.V(\'{}\'))'.format(new_id if edge['OUT']['id'] == old_id else edge['OUT']['id'])
inE = '.to(g.V(\'{}\'))'.format(new_id if edge['IN']['id'] == old_id else edge['IN']['id'])
edge_script += 'g.E(\'{}\').drop().iterate();'.format(edge_id)
edge_script += 'g.addE(\'{}\'){}{}.property(T.id, \'{}\')'.format(edge['label'], inE, outE, edge_id)
for k, v in edge.items():
if k not in ['label', 'id', 'IN', 'OUT']:
edge_script += '.property(\'{}\', \'{}\')'.format(k, v)
edge_script += ".iterate();"
#
vertex_drop = 'g.V(\'{}\').drop()'.format(old_id)
script = clone_vertex_with_new_id + edge_script + vertex_drop
return script
https://github.com/M-Thirumal/gremlin-functions/blob/main/generate-recreate-vertex-script.py