Neo4j 驱动程序 - 确认交易成功

Szp*_*ona 2 python neo4j neo4j-python-driver

我刚刚开始使用新的用于 python 的 neo4j 驱动程序并完全陷入事务中。如何检查交易是否成功完成?据我所知,commit函数不会自动引发任何错误,例如,如果我向它提供了不正确的 Cypher 查询,我将无法获得有关此的信息。

我尝试last_resultSession对象中读取参数并想出了类似的东西:

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
Run Code Online (Sandbox Code Playgroud)

它有点工作......但是,它确实需要修改私有属性,而且似乎不正确/不正确。必须有一个更简单、更优雅的解决方案。

预先感谢您的帮助。

编辑:只是为了清楚说明Transaction.success属性指示事务是否应该提交或回滚。然而,例如 Cypher 错误可以在查询的执行时间被识别。

spa*_*gum 6

在我提供开发人员手册之前,我一直在同一件事上撞头阅读。

在那之前,我无法弄清楚为什么运行几个错误的语句session.run(statement)不会引发异常,而是session.close()会。

然后我尝试使用类似的东西:

with session.begin_transaction() as tx:
    tx.run(statement)
    tx.success = True
Run Code Online (Sandbox Code Playgroud)

如果你不想要上下文管理器,你可以使用:

tx = session.begin_transaction()
tx.run(statement)
tx.commit()
Run Code Online (Sandbox Code Playgroud)

如果您阅读了python 文档,您可能会注意到tx.commit()运行tx.success=Truetx.close().

这样做的问题是,调用commit()只会将COMMIT密码消息附加到连接的流中。据我所知,它不会验证交易是否成功。


看了手册的第18节,发现因为我没有显式消费结果,所以不能保证语句被处理是因为库使用了延迟加载(仅按需检索结果)。请参阅下面 18.1 中的注释:

“当光标在流中移动时,结果记录被延迟加载。这意味着必须将光标移动到第一个结果才能消费这个结果。这也意味着必须在摘要信息和元数据之前显式消费整个流可用。通常最佳做法是显式使用结果并关闭会话,尤其是在运行更新语句时。即使不需要摘要信息,这也适用。未能使用结果可能导致不可预测的行为,因为将无法保证服务器已经看到并处理了 Cypher 语句。”


因此,本质上,您需要在运行 cypher 语句后显式使用您的结果。这可以像这样完成:

res = session.run(statement) # or the equivalent iusing transaction style
res.consume()
Run Code Online (Sandbox Code Playgroud)

我注意到迭代所有结果的.consume()函数调用list(self)(StatementResult 类定义了一个__iter__方法)。所以,虽然我没有测试过它,但可能只是简单地循环结果为你消耗:

res = session.run(statement)
for r in res:
    continue
Run Code Online (Sandbox Code Playgroud)

希望这会有所帮助!