0

我在 python 3.7.2 上使用 Neo4j 版本 4.0.1,python 驱动程序版本 4.0

我的问题是,在事务中,来自数据库的结果包含记录,而如果返回到事务外部则不包含记录。在我看来,对于普通的 MATCH() 查询,如果不介意发生丢失更新的可能性,那么发出查询并在事务外使用它应该不是问题。

以下代码生成了一个最小示例。

driver = GraphDatabase.driver(uri, auth=(user, password), encrypted=False)

def get_all_foo_tx(tx):
    result = tx.run("MATCH(n:Foo) RETURN n.id")
    # result can be iterated over here
    # for record in result: 
    #     print(record)  
    return result

def get_all_foo():
    session = driver.session()
    db_result = session.write_transaction(get_all_foo_tx)
    # result is empty here
    # for record in result: 
    #     print(record)  
    

我现在的问题是:这是预期的行为吗?

使用之前的 Neo4j 驱动程序版本,上面概述的代码可以正常工作,而最新的驱动程序版本则不能。我查看了文档的“重大更改”部分,对我来说没有什么可以解释行为的变化。

在事务之外消费结果是“坏习惯”吗?

注意:我实际执行的代码比这复杂得多,这是一个最小的例子。该行为在一系列查询中是一致的,其中结果包含多条记录。我有一个名为 id 的属性,它与内部 Neo4j id 是分开的;乍一看,这令人困惑。

4

1 回答 1

-1

也许您的问题是您正在使用session.write_transaction,但您只想从 Neo4j 读取数据。write_transaction方法专为在密码中包含CREATEMERGESET的写入查询而设计。尝试使用:

session = driver.session()
db_result = session.run(get_all_foo_tx)
// Just dont forget to close the session
session.close()

希望这会有所帮助。

于 2020-07-02T10:21:03.680 回答