Python neo4j 结果对象永远挂起
Python neo4j Result object hangs forever
我正在使用 neo4j
Python 驱动程序在本地 Neo4j 数据库上 运行 批量加载数据。我有以下包裹:
neo4j==4.4.1
neo4j-driver==4.4.1
我正在使用 apoc.periodic.iterate
方法。调用 return 是一个 Result
对象,它包含一个小字典,其中包含一些关于负载的数据。看起来像这样:
{'batches': 1,
'total': 9,
'timeTaken': 0,
'committedOperations': 9,
...}
当负载很小的时候,我可以从Result
中提取这个对象并保存。但是,当它更大时,我无法使用 Result
对象。我能够 print
对象的地址。但是,如果我尝试 运行 它的任何方法,或以任何方式从中提取数据,或从函数中 return 它,我的代码将永远挂起。但是,return 数据应始终具有相同的大小,因为它只是有关负载的一些元数据。
from neo4j import GraphDatabase
driver = GraphDatabase.driver(URI, auth=(user_name, password))
address = "test.csv"
cql = '''
CALL apoc.periodic.iterate(
"LOAD CSV WITH HEADERS FROM '%s' AS row
WITH
row.field1 AS field1,
toFloat(row.field2) AS field2
RETURN *",
"MERGE (tx: Object {field1: field1})
SET
tx.field1 = field1,
tx.field2 = field2;
",
{batchSize: 10000, parallel: true, retries: 3})
''' % address
with driver.session() as session:
result = session.run(cql)
print(result)
log_data = result.data()[0] # this line hangs forever with large loads
好吧,当从auto-commit交易功能切换到交易功能时,问题就消失了。因此,我没有采用上述方法,而是:
def transaction(tx):
return dict(tx.run(cql).single())
with driver.session() as session:
log_data = session.write_transaction(transaction)
https://neo4j.com/docs/driver-manual/1.7/sessions-transactions/
我正在使用 neo4j
Python 驱动程序在本地 Neo4j 数据库上 运行 批量加载数据。我有以下包裹:
neo4j==4.4.1
neo4j-driver==4.4.1
我正在使用 apoc.periodic.iterate
方法。调用 return 是一个 Result
对象,它包含一个小字典,其中包含一些关于负载的数据。看起来像这样:
{'batches': 1,
'total': 9,
'timeTaken': 0,
'committedOperations': 9,
...}
当负载很小的时候,我可以从Result
中提取这个对象并保存。但是,当它更大时,我无法使用 Result
对象。我能够 print
对象的地址。但是,如果我尝试 运行 它的任何方法,或以任何方式从中提取数据,或从函数中 return 它,我的代码将永远挂起。但是,return 数据应始终具有相同的大小,因为它只是有关负载的一些元数据。
from neo4j import GraphDatabase
driver = GraphDatabase.driver(URI, auth=(user_name, password))
address = "test.csv"
cql = '''
CALL apoc.periodic.iterate(
"LOAD CSV WITH HEADERS FROM '%s' AS row
WITH
row.field1 AS field1,
toFloat(row.field2) AS field2
RETURN *",
"MERGE (tx: Object {field1: field1})
SET
tx.field1 = field1,
tx.field2 = field2;
",
{batchSize: 10000, parallel: true, retries: 3})
''' % address
with driver.session() as session:
result = session.run(cql)
print(result)
log_data = result.data()[0] # this line hangs forever with large loads
好吧,当从auto-commit交易功能切换到交易功能时,问题就消失了。因此,我没有采用上述方法,而是:
def transaction(tx):
return dict(tx.run(cql).single())
with driver.session() as session:
log_data = session.write_transaction(transaction)
https://neo4j.com/docs/driver-manual/1.7/sessions-transactions/