我想对已经保存到neo4j的一堆节点进行批量操作,最终创建它们之间的关系。我有类似
的东西with gdb.transaction():
for s_id, d_id in nodelist:
sn = nidx['nid'][s_id].single
dn = nidx['nid'][d_id].single
其中nidx
是我所做的索引(和'nid',s_id是键/值对)。但是,看起来nidx['nid'][s_id]
是一个TransactionOperationProxy对象,尽管我打算将它作为一个节点。有什么方法可以将它转换为节点,或者至少用它来创建sn
和dn
之间的关系(类似于sn.Follows(dn))?
感谢。
答案 0 :(得分:2)
您可以使用批处理加载器执行此操作,但使用Gremlin脚本会更容易。
如果您的nodelist
是节点ID对的列表,那么这里是批量加载边缘的Gremlin脚本(未经测试)......
// gremlin.groovy
def batch_load(nodelist, label) {
g.setMaxBufferSize(0)
g.startTransaction()
try {
for (entry in nodelist) {
s_id = entry[0]
d_id = entry[1]
// if s_id and d_id are actual node IDs, you don't need to use an index...
sn = g.idx('someindex').get('nid',s_id)[0]
dn = g.idx('someindex').get('nid',d_id)[0]
g.addEdge(sn,dn,label)
}
g.stopTransaction(TransactionalGraph.Conclusion.SUCCESS)
return true
} catch (e) {
g.stopTransaction(TransactionalGraph.Conclusion.FAILURE)
return e
}
}
以下是你在灯泡中执行它的方法 - 你需要为neo4jrestclient修改它......
>>> from bulbs.neoj4server import Graph
>>> g = Graph()
>>> g.scripts.update('/path/to/gremlin.groovy')
>>> script = g.scripts.get('batch_load')
>>> params = dict(nodelist=your_node_list, label="follows")
>>> g.gremlin.execute(script, params)