Как воссоздать вершину с помощью 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

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