py2neo
パッケージを使用してBoltプロトコルで接続するスクリプトが予期せず失敗しました。なぜか分かりません。このスクリプトは、プロトコルとしてHTTPを使用する場合に機能します。py2neo Boltを使用したときに "ProtocolError:Server closed connection"が発生しました。
スクリプトはNeo4jグラフを取得し、Pythonで補完し、関連する変更をデータベースにプッシュしようとします。プロセス全体には約1時間かかり、かなりの時間信頼性を確保していましたが、最近プッシュステージが失敗し始めました。
私がおもちゃの例を作成して、プルとオグメンテーションをバイパスすると、プッシュが機能し、タイムアウトのためにサーバーが接続を閉じたと思っていますが、Boltのタイムアウト関連のパラメータは見つかりませんpy2neo。この私の理解は私)それはボルトには無関係ださおよびii)タイムアウトが大幅に超えた接続レベルでですが、私は9999秒(〜2.75時間)、
from py2neo.packages.httpstream import http
http.socket_timeout = 9999
するHTTPソケットのタイムアウトを設定している注意してくださいスクリプトが実行された時刻。
参考までにNeo4j v3.0.3とpy2neo v3.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)
への接続を引き起こし、私はデバッグこのまたは何を促進することができます方法についての誰もが何か提案を持っています閉じる?私は_recv
の機能を見てきましたが、ソケットでデータが受信されなかった理由はわかりません。
のみ可能関連するエラーが
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)
たのNeo4j debug.log
ファイルを介して見ると、私はまた、サービスの稼働時間を確認し、そしてそれは、スクリプト(HHの全期間を通じて実行したことが確認されました: MM:SS)、
> ps -p "14765" -o etime=
16:55:31
私たちは、同じ[署名](http://py2neo.org/v3/database.html#py2neo.database.Graph.run)がpy2neoのV3を使用しています。 'parameters'引数はオプションですが、' rows'は '' kwargs''と解釈されます。 Boltとは対照的に、HTTPを使用するときはコードが正常に動作することに注意してください。 – John