读取尚未提交的同一事务中修改的数据

时间:2016-02-16 07:55:15

标签: python transactions neo4j py2neo

我试图使用py2neo引入事务。在要成为事务的代码的开头,我使用:

打开新事务
tx = graph.cypher.begin()

之后,采取了几项行动:

  1. 在交易开始之前阅读已存储在数据库中的一些数据
  2. 根据
  3. 创建新节点
  4. 创建另一个节点
  5. 创建这两个节点之间的关系
  6. 使用 node.match_outgoing(relation_type)
  7. 阅读该关系

    虽然操作1-4正确完成,但最后一个操作失败"节点未绑定"。这并不令人惊讶,因为交易尚未提交,并且该节点没有远程对应物。不过,我需要这样做。另一种方法需要大量的重构和意大利面条代码。

    使用cypher中的 CreateStatement 在事务I中创建节点。这样做:

    graph = db_connection.get_graph()
    statement = CreateStatement(graph)
    statement.create(relation)
    append_to_current_tx(statement)
    

    因此无法获得处于绑定状态的节点(瞬态节点)。

    是否有办法读取刚刚未完成的事务中创建的节点的关系(但在同一事务之前创建了所有关系)。 py2neo中是否有嵌套事务?

1 个答案:

答案 0 :(得分:1)

您可以使用tx.process()来完成此操作,gkeyring.py会将所有待处理语句发送到要执行的服务器,但会使事务处于打开状态且未提交。

例如:

tx = graph.cypher.begin()
tx.append('CREATE (:Person{name: 'Bob'})-[r:EATS]->(:Food {name: 'Pizza'}) SET r.count=1')
tx.append('''
    MATCH (:Person{name: 'Bob'})-[r:EATS]->(:Food {name: 'Pizza'})
    SET r.count = r.count + 1
    RETURN r.count AS count
''')
result = tx.process()
for record in result:
    print(record.one) # count will be 2 even though the transaction has not been committed
tx.commit()