批量插入/合并节点和边的正确方法
Correct way to bulk insert / merge nodes and edges
我已经使用 neo4j
和 py2neo
几个星期了,到目前为止,只做单节点交易没问题,所以我会有不同的节点类型
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
,它有两个问题:
- 没那么快(我笔记本电脑上的 700 个非常基本的节点大约需要 5 秒)
- 边需要单独处理
- 它需要跟踪所有节点 ID 才能处理边缘连接
我一直在编写函数来处理上述几点,但我觉得我遗漏了一些东西,而且有一种更简单的方法来处理批量数据
unwind_merge_nodes_query
函数通常不打算直接使用,尽管您可以这样做。通常,您会希望使用 py2neo.bulk
模块中的函数来代替这些函数。
不管怎样,这种细微差别不太可能对您的具体问题有多大帮助。作为客户端库,py2neo 只能执行 Neo4j 服务器公开的操作,不幸的是,不存在从客户端导入重要批量数据的好(低级别)方法。 Py2neo 无法解决这个问题。
如果性能是您的目标,那么最好的选择可能是改用 LOAD CSV Cypher 语句。请注意,要执行此操作,您的输入数据文件需要直接对服务器可见。
我已经使用 neo4j
和 py2neo
几个星期了,到目前为止,只做单节点交易没问题,所以我会有不同的节点类型
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
,它有两个问题:
- 没那么快(我笔记本电脑上的 700 个非常基本的节点大约需要 5 秒)
- 边需要单独处理
- 它需要跟踪所有节点 ID 才能处理边缘连接
我一直在编写函数来处理上述几点,但我觉得我遗漏了一些东西,而且有一种更简单的方法来处理批量数据
unwind_merge_nodes_query
函数通常不打算直接使用,尽管您可以这样做。通常,您会希望使用 py2neo.bulk
模块中的函数来代替这些函数。
不管怎样,这种细微差别不太可能对您的具体问题有多大帮助。作为客户端库,py2neo 只能执行 Neo4j 服务器公开的操作,不幸的是,不存在从客户端导入重要批量数据的好(低级别)方法。 Py2neo 无法解决这个问题。
如果性能是您的目标,那么最好的选择可能是改用 LOAD CSV Cypher 语句。请注意,要执行此操作,您的输入数据文件需要直接对服务器可见。