如何用 apache tinkerpop gremlin 重新创建一个顶点?

How to recreate a vertex with apache tinkerpop gremlin?

我需要替换 vertex T.id,不幸的是,Apache Tinkerpop Gremlin 不允许这样做。所以我需要删除顶点并创建一个具有相同 propertiesincoming & outgoing edges.

的新顶点

有没有简单的way/shortcut重新创建?

一种方法是先克隆要删除的顶点。这可以在 Gremlin 中完成。

这是在航线数据集中克隆 DFW 顶点的一种方法。您可以修改此代码以添加新的 ID 值。

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

已更新

在移动边的配方中添加 link。

https://tinkerpop.apache.org/docs/current/recipes/#edge-move

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