如何使用apache修补程序gremlin重新创建顶点



我需要替换vertexT.id,不幸的是,它在Apache Tinkerpop Gremlin中是不允许的。所以我需要删除顶点并创建一个具有相同propertiesincoming & outgoing edges的新顶点。

有什么简单的方法/快捷方式可以重新创建吗?

一种方法是克隆要首先删除的顶点。这可以在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

更新的

为移动边的配方添加链接。

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

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

最新更新