【问题标题】:Read data modified in same transaction which is not yet commited读取在同一事务中修改但尚未提交的数据
【发布时间】:2016-02-16 07:55:14
【问题描述】:

我正在尝试使用 py2neo 引入交易。在事务代码的开头,我使用以下命令打开新事务:

tx = graph.cypher.begin()

之后采取了几项行动:

  1. 在事务开始之前读取一些已经存储在数据库中的数据
  2. 在此基础上创建新节点
  3. 创建另一个节点
  4. 创建这两个节点之间的关系
  5. 使用 node.match_outgoing(relation_type) 读取该关系

虽然动作 1-4 正确完成,但最后一个在“节点未绑定”上失败。这并不奇怪,因为尚未提交事务并且该节点没有远程对应。不过,我需要这样做。另一种方法需要大量重构和意大利面条式代码。

为了在事务中创建节点,我正在使用来自 cypher 的 CreateStatement。它是这样完成的:

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

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

有没有办法读取刚刚在尚未提交的事务中创建的节点的关系(但所有关系都是在同一个事务中创建的)。 py2neo中有嵌套事务吗?

【问题讨论】:

    标签: python transactions neo4j py2neo


    【解决方案1】:

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

    例如:

    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()
    

    【讨论】:

    • 是的,但是使用 node = graph.create(node) 我能够获得绑定节点并且使用事务我无法做到这一点。我留下了一个未绑定到任何远程对应方的节点。我是否需要单独的查询来再次检索此类实体...?
    猜你喜欢
    • 1970-01-01
    • 2019-03-12
    • 2018-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多