2017-01-12 9 views
2

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 

答えて

0

は、私は問題があると考えていると:

tx.run(statement, rows=rows) 

CypherResoure.run()の2番目の引数は、パラメータの辞書です。追加のpython paramsとしてそれらを渡しています。 py2neo codeを参照してください。

試してみてください。

tx.run(statement, {"rows": rows}); 
+0

私たちは、同じ[署名](http://py2neo.org/v3/database.html#py2neo.database.Graph.run)がpy2neoのV3を使用しています。 'parameters'引数はオプションですが、' rows'は '' kwargs''と解釈されます。 Boltとは対照的に、HTTPを使用するときはコードが正常に動作することに注意してください。 – John

関連する問題