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

时间:2014-08-11 21:30:32

标签: python linux neo4j httplib py2neo

我正在使用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并在图中可见。但是,当我从Linux服务器(不同于neo4j服务器)运行它时,我在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)

这篇文章(IncompleteRead using httplib)表明这是一个httplib错误。我不知道如何处理,因为我没有直接调用httplib。

有关使此加载在Linux上运行的建议或IncompleteRead错误消息的含义吗?

更新: IncompleteRead错误是由返回的Neo4j错误引起的。 _read_chunked中返回的导致错误的行是:

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

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

1 个答案:

答案 0 :(得分:1)

虽然我无法肯定地说,这意味着客户端和服务器之间存在某种局部网络问题,而不是库中的错误。 Py2neo包装了httplib(它本身非常可靠),并且从堆栈跟踪中看起来好像客户端期望从分块响应中获得更多块。

要进一步诊断,您可以从Linux应用程序服务器到数据库服务器进行一些卷曲调用,看看哪些成功,哪些不成功。如果可行,请尝试编写一个快速且脏的python脚本,直接使用httplib进行相同的调用。

更新1:鉴于上述更新以及服务器对其响应进行流式传输的事实,我认为块大小可能代表预期的有效负载,但错误会将响应缩短。使用curl重新创建问题看起来似乎是帮助确定它是否是驱动程序,服务器或其他内容的错误的最佳下一步。

更新2:今天上午再次发现,我注意到您正在使用Python替换MERGE语句中的属性。作为良好实践,您应该在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)