gpt4 book ai didi

java - Neo4j 批量数据 - 创建关系 [OutOfMemory 异常]

转载 作者:行者123 更新时间:2023-12-01 08:57:59 25 4
gpt4 key购买 nike

我正在使用 Neo4j 过程在批量数据上创建关系。

最初使用加载 csv 插入所有数据。

USING PERIODIC COMMIT 500
LOAD CSV WITH HEADERS FROM "file:///XXXX.csv" AS row
....

数据量太大[10M]但执行成功

我的问题是我想在所有节点之间创建多对多关系

但我在执行查询时遇到异常 [OutMemoryException]

MATCH(n1:x{REMARKS :"LATEST"}) MATCH(n2:x{REMARKS :"LATEST"}) WHERE n1.DIST_ID=n2.ENROLLER_ID CREATE (n1)-[:ENROLLER]->(n2) ;

我也已经创建了索引和约束

有什么想法请帮助我吗?

最佳答案

问题在于您的查询是在一个事务中执行的,这会导致异常[OutMemoryException]。这是一个问题,因为此时周期性交易的可能性只需要加载 CSV。因此,您可以在首次加载后重新读取 CSV:

USING PERIODIC COMMIT 500
LOAD CSV WITH HEADERS FROM "file:///XXXX.csv" AS row
MATCH (n1:x{REMARKS :"LATEST", DIST_ID: row.DIST_ID})
WITH n1
MATCH(n2:x{REMARKS :"LATEST"}) WHERE n1.DIST_ID=n2.ENROLLER_ID
CREATE (n1)-[:ENROLLER]->(n2) ;

或者尝试一下 periodic committing 的技巧来自APOC库:

call apoc.periodic.commit("
MATCH (n2:x {REMARKS:'Latest'}) WHERE exists(n2.ENROLLER_ID)
WITH n2 LIMIT {perCommit}
OPTIONAL MATCH (n1:x {REMARKS:'Latest'}) WHERE n1.DIST_ID = n2.ENROLLER_ID
WITH n2, collect(n1) as n1s
FOREACH(n1 in n1s|
CREATE (n1)-[:ENROLLER]->(n2)
)
REMOVE n2.ENROLLER_ID
RETURN count(n2)",
{perCommit: 1000}
)

附注ENROLLER_ID 属性用作选择要处理的节点的标志。当然,您可以使用另一个标志,该标志是在处理过程中设置的。

或者使用apoc.periodic.iterate更准确:

CALL apoc.periodic.iterate("
MATCH (n1:x {REMARKS:'Latest'})
MATCH (n2:x {REMARKS:'Latest'}) WHERE n1.DIST_ID = n2.ENROLLER_ID
RETURN n1,n2
","
WITH {n1} as n1, {n2} as n2
MERGE (n1)-[:ENROLLER]->(n2)
", {batchSize:10000, parallel:true}
)

关于java - Neo4j 批量数据 - 创建关系 [OutOfMemory 异常],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41906783/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com