2

Python用の新しいneo4jドライバーを使い始めたばかりで、トランザクションに完全に行き詰まりました。トランザクションが正常に完了したかどうかを確認するにはどうすればよいですか? commit関数が自動的にエラーを発生させないと言うことができる限り、たとえば、間違った Cypher クエリを指定した場合、これに関する情報は得られません。

last_resultオブジェクトから引数を読み取ろうとしSessionたところ、次のような sth が思いつきました。

import neo4j.v1 as neo

def db_confirm_transaction_success(session):
    try:
        w = list(session.last_result)
        return True
    except neo.CypherError as e:
        session.last_result._consumed = True
        return False
    except neo.ResultError as e:
        session.last_result._consumed = True
        return False

それはうまくいきます...それでも、プライベート属性を変更する必要があり、単に正しい/正しくないようです。よりシンプルでエレガントなソリューションが必要です。

よろしくお願いします。

編集: 属性を明確にするためにTransaction.success、トランザクションをコミットまたはロールバックする必要があるかどうかを示します。それでも、たとえば Cypher エラーは、クエリの実行時間までに特定できます。

4

1 に答える 1

6

開発者マニュアルを読むまで、同じことに頭を悩ませていました。

それまでは、 でいくつかの不適切なステートメントを実行してsession.run(statement)も例外が発生しないのに、例外が発生する理由がわかりませんでしたsession.close()

次に、次のようなものを使用してみました:

with session.begin_transaction() as tx:
    tx.run(statement)
    tx.success = True

コンテキストマネージャーが必要ない場合は、次を使用できます。

tx = session.begin_transaction()
tx.run(statement)
tx.commit()

python docsを読むtx.commit()と、実行中tx.success=Truetx.close().

これに関する問題は、呼び出しが暗号メッセージを接続のストリームにcommit()追加するだけであることです。COMMIT私の知る限り、トランザクションの成功を確認するものではありません。


マニュアルのセクション 18 を読んだ後、結果を明示的に使用していないため、ライブラリが遅延読み込み (オンデマンドでのみ結果を取得する) を使用しているため、ステートメントが処理されたという保証がないことがわかりました。以下の 18.1 のメモを参照してください。

「結果レコードは、カーソルがストリーム内を移動するときに遅延してロードされます。これは、この結果を消費する前に、カーソルを最初の結果に移動する必要があることを意味します。また、要約情報とメタデータの前に、ストリーム全体を明示的に消費する必要があることも意味します。利用可能です. 一般に, 特に update ステートメントを実行するときは, 明示的に結果を消費してセッションを閉じることがベストプラクティスです. これは, 要約情報が必要ない場合でも当てはまります.サーバーが Cypher ステートメントを確認して処理したことを示します。」


したがって、基本的に、cypher ステートメントを実行した後、結果を明示的に使用する必要があります。これは次のように行うことができます。

res = session.run(statement) # or the equivalent iusing transaction style
res.consume()

.consume()すべての結果を反復する関数呼び出しに気付きましたlist(self)(StatementResult クラスは__iter__メソッドを定義します)。したがって、私はそれをテストしていませんが、単に結果をループするだけで消費が行われる場合があります。

res = session.run(statement)
for r in res:
    continue

うまくいけば、これが役に立ちます!

于 2016-08-25T19:12:16.620 に答える