Neo4j py2neo“;协议错误:服务器关闭连接“;使用螺栓时

Neo4j py2neo“;协议错误:服务器关闭连接“;使用螺栓时,neo4j,py2neo,Neo4j,Py2neo,最近,一个使用py2neo包并通过Bolt协议连接的脚本开始意外失败,出现了协议错误:Server closed connection,我很难理解原因。注意:当使用HTTP作为协议时,脚本可以工作 该脚本提取Neo4j图,在Python中对其进行扩充,然后尝试将相关更改推回到数据库。整个过程大约需要一个小时,并且可靠地工作了相当长的一段时间,但是推送阶段最近开始失败 如果我创建了一个玩具示例,绕过了拉和增强,那么推工作,因此我认为服务器由于超时而关闭了连接,但是我在py2neo中找不到任何与超时

最近,一个使用
py2neo
包并通过Bolt协议连接的脚本开始意外失败,出现了
协议错误:Server closed connection
,我很难理解原因。注意:当使用HTTP作为协议时,脚本可以工作

该脚本提取Neo4j图,在Python中对其进行扩充,然后尝试将相关更改推回到数据库。整个过程大约需要一个小时,并且可靠地工作了相当长的一段时间,但是推送阶段最近开始失败

如果我创建了一个玩具示例,绕过了拉和增强,那么推工作,因此我认为服务器由于超时而关闭了连接,但是我在py2neo中找不到任何与超时相关的参数。注意,我已将HTTP套接字超时设置为9999秒(~2.75小时)

虽然我对这一点的理解是i)它与Bolt无关,ii)超时处于连接级别,大大超过了脚本运行的时间

作为参考,我使用的是Neo4jv3.0.3和Py2neov3.1.2。堆栈跟踪为:

File "/usr/local/lib/python2.7/dist-packages/py2neo/database/__init__.py", line 1017, in __exit__
self.commit()
File "/usr/local/lib/python2.7/dist-packages/py2neo/database/__init__.py", line 1059, in commit
self._post(commit=True)
File "/usr/local/lib/python2.7/dist-packages/py2neo/database/__init__.py", line 1291, in _post
self.finish()
File "/usr/local/lib/python2.7/dist-packages/py2neo/database/__init__.py", line 1296, in finish
self._sync()
File "/usr/local/lib/python2.7/dist-packages/py2neo/database/__init__.py", line 1286, in _sync
connection.fetch()
File "/usr/local/lib/python2.7/dist-packages/py2neo/packages/neo4j/v1/bolt.py", line 323, in fetch
raw.writelines(self.channel.chunk_reader())
File "/usr/local/lib/python2.7/dist-packages/py2neo/packages/neo4j/v1/bolt.py", line 174, in chunk_reader
chunk_header = self._recv(2)
File "/usr/local/lib/python2.7/dist-packages/py2neo/packages/neo4j/v1/bolt.py", line 157, in _recv
raise ProtocolError("Server closed connection")
ProtocolError: Server closed connection
精简的Python代码的形式如下:

import py2neo
from py2neo.packages.httpstream import http
http.socket_timeout = 3600

graph = py2neo.Graph(
    host='localhost',
    bolt=True,
    bolt_port=4096,
    http_port=4095,
)

# Pull the graph from the Neo4j database via graph.run(...) statements,
# augments the graph etc.
# ...

# Exception is thrown when the following push transaction is executed.
with graph.begin() as tx:
    statement = """
        UNWIND {rows} AS row
        WITH row.source AS source, row.target AS target
        MATCH (s:Entity)
        USING INDEX s:Entity(uuid)
        WHERE s.uuid = source
        MATCH (t:Entity)
        USING INDEX t:Entity(uuid)
        WHERE t.uuid = target
        MATCH (s)-[r:FAVORITED]->(t)
        DELETE r
    """

    rows = [{
        'source': '8267d7d0-a837-11e6-b841-22000bcec6a9',
        'target': 'c6296c97-a837-11e6-b841-22000bcec6a9',
    }]

    tx.run(statement, rows=rows)
是否有人对我如何进一步调试这个或是什么导致连接关闭有任何建议?我已经查看了
\u recv
函数,但是不清楚为什么套接字没有收到数据

查看Neo4j
debug.log
文件,唯一可能的相关错误是

java.io.IOException: Connection reset by peer
at sun.nio.ch.FileDispatcherImpl.read0(Native Method)
at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:39)
at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:223)
at sun.nio.ch.IOUtil.read(IOUtil.java:192)
at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:380)
at io.netty.buffer.PooledUnsafeDirectByteBuf.setBytes(PooledUnsafeDirectByteBuf.java:311)
at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:881)
at io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:242)
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:119)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:511)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:468)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:382)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:354)
at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:111)
at java.lang.Thread.run(Thread.java:745)
我还检查了服务的正常运行时间,并确认它在整个脚本期间都在运行(HH:MM:SS)


我认为问题在于:

tx.run(statement, rows=rows)
cypherresource.run()
的第二个参数是参数字典。您将它们作为附加python参数传入。看

尝试:


我们正在使用py2neo的v3,它具有相同的功能。
参数
参数是可选的,而
被解释为“kwargs”。注意:当使用HTTP而不是Bolt时,代码工作正常。
 > ps -p "14765" -o etime=
 16:55:31
tx.run(statement, rows=rows)
tx.run(statement, {"rows": rows});