批量插入/合并节点和边的正确方法

Correct way to bulk insert / merge nodes and edges

我已经使用 neo4jpy2neo 几个星期了,到目前为止,只做单节点交易没问题,所以我会有不同的节点类型

class NodeA(GraphObject):
  ...

class NodeB(GraphObject):
  ...

# create some nodes from data and simply save them one by one
for data in dataset:
  node_a = NodeA(data)
  node_b = NodeB(data)

  if x:
    node_a.related_to_b.add(node_b)

  g.merge(node_b)
  g.merge(node_a)

没什么特别的。但是,我开始获得更多的节点和连接,而且单个事务不再像预期的那样有效。我一直在寻找进行批量插入的方法,但找不到任何好的资源。我设法完成的最好的是使用 unwind_merge_nodes_query,它有两个问题:

  1. 没那么快(我笔记本电脑上的 700 个非常基本的节点大约需要 5 秒)
  2. 边需要单独处理
  3. 它需要跟踪所有节点 ID 才能处理边缘连接

我一直在编写函数来处理上述几点,但我觉得我遗漏了一些东西,而且有一种更简单的方法来处理批量数据

unwind_merge_nodes_query 函数通常不打算直接使用,尽管您可以这样做。通常,您会希望使用 py2neo.bulk 模块中的函数来代替这些函数。

不管怎样,这种细微差别不太可能对您的具体问题有多大帮助。作为客户端库,py2neo 只能执行 Neo4j 服务器公开的操作,不幸的是,不存在从客户端导入重要批量数据的好(低级别)方法。 Py2neo 无法解决这个问题。

如果性能是您的目标,那么最好的选择可能是改用 LOAD CSV Cypher 语句。请注意,要执行此操作,您的输入数据文件需要直接对服务器可见。