如何用 apache tinkerpop gremlin 重新创建一个顶点?
How to recreate a vertex with apache tinkerpop gremlin?
我需要替换 vertex
T.id
,不幸的是,Apache Tinkerpop Gremlin
不允许这样做。所以我需要删除顶点并创建一个具有相同 properties
和 incoming & 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
我需要替换 vertex
T.id
,不幸的是,Apache Tinkerpop Gremlin
不允许这样做。所以我需要删除顶点并创建一个具有相同 properties
和 incoming & 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