neo4j:删除事务中的节点会导致异常

时间:2014-07-22 13:00:54

标签: python database neo4j cypher py2neo

我已经整理了一个简单的测试用例:

account = EmailAccount()
account.email = "some@mail"
assert db.account_by_mail("some@mail") == []
db.add_node(account)
assert db.account_by_mail(account.email) == [account]
db.delete_node(account))
assert db.account_by_mail("some@mail") == []

一直顺利到最后一行,抛出异常:

Neo.DatabaseError.Statement.ExecutionFailure: Node 226 has been deleted

最后一行执行的语句如下:

MATCH (account:Account) WHERE account.email = {mail} RETURN account, id(account), head(labels(account))

带参数

{
  'mail': "some@mail"
}

所有语句都在同一个事务中执行(我们使用py2neo Transaction类,包含在会话包装器中 - db)。该行为与删除语义(link here)完全一致,因为事务尚未被提交,语句是读取而不是写入。还有其他隐藏的约束吗?这是默认行为,如果是,可以更改(因为我假设大多数其他dbms不会这样做)?

1 个答案:

答案 0 :(得分:0)

最新版本的py2neo使用惰性方法进行节点提交,以避免不必要的网络流量(请参阅http://py2neo.org/2.0/intro.html#nodes-relationships)。因此,您必须直接将更改提交到图表,以便保留它们。如果我没有更明确地看到你的db代码,如果我理解正确,你就不会将你的事务提交给图形,因此,你只是修改了尚未持久存在的对象的状态。

此行为与其他orm实现(如SQL Alchemy(python)或Hibernate(Java))一致,并且密切反映了在dbms级别发生的实际事务划分。