2

我想对已经保存到 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 对象,尽管我打算让它成为一个节点。有什么方法可以将它转换为节点,或者至少使用它来创建和之间的关系sndn类似于 sn.Follows(dn))?

谢谢。

4

1 回答 1

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
  }
}

以下是您在 Bulbs 中执行它的方式——您需要为 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)
于 2012-07-13T17:43:23.003 回答