如何在Linux上使用Py2Neo修复IncompleteRead错误
我正在使用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 个回答
虽然我不能确定,但这看起来像是客户端和服务器之间的某种本地网络问题,而不是库本身的错误。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)