【问题标题】:Py2neo Neo4j Batch submit errorPy2neo Neo4j 批量提交错误
【发布时间】:2014-07-09 15:02:44
【问题描述】:

我有一个包含大约 140 万个节点数据的 json 文件,我想为此构建一个 Neo4j 图形数据库。我尝试使用 py2neo 的批量提交功能。我的代码如下:

# the variable words is a list containing node names
from py2neo import neo4j
batch = neo4j.WriteBatch(graph_db)
nodedict = {}
# I decided to use a dictionary because I would be creating relationships
# by referring to the dictionary entries later
for i in words:
    nodedict[i] = batch.create({"name":i})
results = batch.submit()

显示的错误如下:

Traceback (most recent call last):
  File "test.py", line 36, in <module>
    results = batch.submit()
  File "/usr/lib/python2.6/site-packages/py2neo/neo4j.py", line 2116, in submit
    for response in self._submit()
  File "/usr/lib/python2.6/site-packages/py2neo/neo4j.py", line 2085, in _submit
    for id_, request in enumerate(self.requests)
  File "/usr/lib/python2.6/site-packages/py2neo/rest.py", line 427, in _send
    return self._client().send(request)
  File "/usr/lib/python2.6/site-packages/py2neo/rest.py", line 364, in send
    return Response(request.graph_db, rs.status, request.uri, rs.getheader("Loc$
  File "/usr/lib/python2.6/site-packages/py2neo/rest.py", line 278, in __init__
    raise SystemError(body)
SystemError: None

谁能告诉我这里到底发生了什么?这与批处理查询非常大的事实有关吗?如果是这样,可以做什么?提前致谢! :)

【问题讨论】:

  • 好吧,我想我在这里找到了答案:stackoverflow.com/questions/17902741/… 我想我会尝试将庞大的批处理查询分解为 5k 个查询的较小块,然后运行多个批处理提交过程。希望它有效:)

标签: python batch-file neo4j py2neo


【解决方案1】:

这就是我的发现(感谢这个问题:py2neo - Neo4j - System Error - Create Batch Nodes/Relationships):

py2neo 批量提交功能在可以进行的查询方面有其自身的限制。虽然我无法获得上限的确切数量,但我尝试将每批的查询数限制为 5000。所以我决定运行以下代码:

# the variable words is a list containing node names
from py2neo import neo4j
batch = neo4j.WriteBatch(graph_db)
nodedict = {}
# I decided to use a dictionary because I would be creating relationships
# by referring to the dictionary entries later

for index, i in enumerate(words):
    nodedict[i] = batch.create({"name":i})
    if index%5000 == 0:
        batch.submit()
        batch = neo4j.WriteBatch(graph_db) # As stated by Nigel below, I'm creating a new batch
batch.submit() #for the final batch

通过这种方式,我发送了批量请求(查询大小为 5k)并成功创建了我的整个图表!

【讨论】:

    【解决方案2】:

    没有真正的方法来描述一个批次可以包含的作业数量的限制 - 它可能会因许多因素而有很大差异。一般来说,最好的选择是尝试为您的用例找到最佳尺寸并继续使用。看起来这就是你已经在做的事情:-)

    就您的解决方案而言,我建议您进行一项调整。批处理对象并非设计为可重复使用,因此无需在每次提交后清除批处理,只需创建一个新对象即可。无论如何,在 py2neo 的下一个版本中将删除多次提交批处理的能力。

    【讨论】:

    • 感谢您的洞察!不过,我还有一个疑问。在下一步中,我想使用存储在字典中的节点创建关系。但是,因为我正在提交批次,所以它显示一个值错误:找不到请求。你能推荐点什么吗?
    • 哦,我想我明白了。感谢这个问题:stackoverflow.com/questions/23812614/batching-in-py2neo
    • 主要是因为你提到的问题中提出的问题,批次将在下一版本的py2neo中变为一次性使用。提交后有必要丢弃一批,并在需要时创建另一个。
    【解决方案3】:

    在我开始通过 graph.create(*alist) 使用批量创建后,我遇到了同样的问题。上面的答案为我指明了正确的方向,我最终使用了这个受https://gist.github.com/anonymous/6293739启发的sn-p,来自这个问题py2neo - Neo4j - System Error - Create Batch Nodes/Relationships

    chunk_size=500
    chunks=(alist[pos:pos + chunk_size] for pos in xrange(0, len(alist), chunk_size))
    for c in chunks:
        graph.create(*c)
    

    PS py2neo==2.0.7

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-29
      相关资源
      最近更新 更多