代码之家  ›  专栏  ›  技术社区  ›  analyticsPierce

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

  •  1
  • analyticsPierce  · 技术社区  · 11 年前

    我正在使用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文档称这是一个未知的网络错误。

    1 回复  |  直到 11 年前
        1
  •  1
  •   Nigel Small    11 年前

    虽然我不能肯定,但这意味着客户端和服务器之间存在某种本地网络问题,而不是库中的bug。Py2neo包装了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)