如何在Linux上使用Py2Neo修复IncompleteRead错误

1 投票
1 回答
675 浏览
提问于 2025-04-18 16:54

我正在使用Python(2.7.6)和Py2Neo(1.6.4)在Neo4j服务器上更新数据。我的加载函数是:

from py2neo import neo4j,node, rel, cypher

session = cypher.Session('http://my_neo4j_server.com.mine:7474')

def load_data():  
    tx = session.create_transaction()
    for row in dataframe.iterrows():  #dataframe is a pandas dataframe 
        name = row[1].name
        id = row[1].id

        merge_query = "MERGE (a:label {name:'%s', name_var:'%s'}) " % (id, name)        
        tx.append(merge_query)
    tx.commit()     

当我在Windows的Spyder中运行这个函数时,一切都很顺利。数据框中的所有数据都成功提交到neo4j,并且在图形中可以看到。然而,当我在一台与neo4j服务器不同的Linux服务器上运行时,在tx.commit()这一行出现了错误。请注意,我在两个环境中使用的Python和py2neo版本是一样的。

INFO:py2neo.packages.httpstream.http:>>> POST http://neo4j1.qs:7474/db/data/transaction/commit [1360120]
INFO:py2neo.packages.httpstream.http:<<< 200 OK [chunked]
ERROR:__main__:some part of process failed
Traceback (most recent call last):
  File "my_file.py", line 132, in load_data
    tx.commit()
  File "/usr/local/lib/python2.7/site-packages/py2neo/cypher.py", line 242, in commit
    return self._post(self._commit or self._begin_commit)
  File "/usr/local/lib/python2.7/site-packages/py2neo/cypher.py", line 208, in _post
    j = rs.json
  File "/usr/local/lib/python2.7/site-packages/py2neo/packages/httpstream/http.py", line 563, in json
    return json.loads(self.read().decode(self.encoding))
  File "/usr/local/lib/python2.7/site-packages/py2neo/packages/httpstream/http.py", line 634, in read
    data = self._response.read()
  File "/usr/local/lib/python2.7/httplib.py", line 543, in read
    return self._read_chunked(amt)
  File "/usr/local/lib/python2.7/httplib.py", line 597, in _read_chunked
    raise IncompleteRead(''.join(value))
IncompleteRead: IncompleteRead(128135 bytes read)

这篇帖子(使用httplib时的IncompleteRead)提到这是一个httplib的错误。我不太确定该如何处理,因为我并没有直接调用httplib。

有没有什么建议可以让我在Linux上成功加载数据,或者说说这个IncompleteRead错误信息是什么意思?

更新: 这个IncompleteRead错误是由于Neo4j返回的一个错误引起的。在_read_chunked中导致错误的那一行是:

pe}"}]}],"errors":[{"code":"Neo.TransientError.Network.UnknownFailure"

Neo4j的文档说这是一个未知的网络错误。

1 个回答

1

虽然我不能确定,但这看起来像是客户端和服务器之间的某种本地网络问题,而不是库本身的错误。Py2neo 是一个封装了 httplib 的库(而 httplib 本身是相当可靠的),从错误信息来看,客户端似乎在等待更多的分块响应。

为了进一步诊断,你可以从你的 Linux 应用服务器向数据库服务器发起一些 curl 请求,看看哪些请求成功,哪些失败。如果这样可以正常工作,试着写一个简单的 Python 脚本,直接使用 httplib 发起相同的请求。

更新 1:根据上面的更新,以及服务器是流式响应的事实,我在想分块大小可能代表了预期的负载,但错误导致响应被截断。用 curl 重新创建这个问题似乎是确定是驱动程序、服务器还是其他问题的最佳下一步。

更新 2:今天早上再看时,我注意到你在 MERGE 语句中使用了 Python 的替换方式。作为一个好的实践,你应该在 Cypher 级别使用参数替换:

merge_query = "MERGE (a:label {name:{name}, name_var:{name_var}})"
merge_params = {"name": id, "name_var": name}
tx.append(merge_query, merge_params)

撰写回答