0

我是neo4j的新手。在在这里发布这个问题之前,我已经做了一些研究,但找不到适合我的解决方案。我有一个 32GB RAM 的 ubuntu 虚拟机。我目前正在使用 neo4j-community 版本 4.0.2 并在我的 neo4j.conf 文件中获得以下配置。

dbms.memory.heap.initial_size=5120m
dbms.memory.heap.max_size=5120m
dbms.memory.pagecache.size=10g

我正在尝试使用 cypher-shell 将 CSV 文件导入默认的 neo4j 数据库。它适用于小文件,但我对大小 > 1GB 的 csv 文件有疑问。它失败并出现以下错误

由于超出内存限制,无法分配 524288 字节;使用=2147266560,最大值=2147483648

我尝试设置 JAVA_OPTS=-Xmx4G 来增加java堆空间,但它仍然失败并出现同样的错误。有人可以帮忙吗?cypher-shell 实用程序是在寻找更多的堆空间,还是 neo4j 数据库在寻找额外的堆空间?如果无法使用 cypher-shell 导入大文件,我还有哪些其他选项可以导入大文件?

编辑:我每 200 行使用一次定期提交,我在 .cypher 文件中有以下密码脚本,并使用 cypher-shell 运行 .cypher 文件

CREATE INDEX ON:Review (nr);

USING PERIODIC COMMIT 200 LOAD CSV WITH HEADERS FROM "file:///12Review.csv" AS row 
MERGE (R:Review {nr: toInteger(row.nr)}) 
WITH row, R
FOREACH(ignoreMe in CASE WHEN row.reviewDate IS NULL THEN [] ELSE [1] END| SET R.reviewDate =row.reviewDate)
FOREACH(ignoreMe in CASE WHEN row.title IS NULL THEN [] ELSE [1] END| SET R.title = row.title)
FOREACH(ignoreMe in CASE WHEN row.rating1 IS NULL THEN [] ELSE [1] END| SET R.rating1 =row.rating1) 
FOREACH(ignoreMe in CASE WHEN row.rating2 IS NULL THEN [] ELSE [1] END| SET R.rating2 =row.rating2) 
FOREACH(ignoreMe in CASE WHEN row.rating3 IS NULL THEN [] ELSE [1] END| SET R.rating3 =row.rating3) 
FOREACH(ignoreMe in CASE WHEN row.rating4 IS NULL THEN [] ELSE [1] END| SET R.rating4 =row.rating4)
4

1 回答 1

0

我正在对此运行 EXPLAIN 并在查询计划中看到一个 Eager 运算符,它基本上取消了定期提交并导致所有结果显示在内存中,这导致了堆外操作。这里的 FOREACHes 导致了这种情况,在使用定期提交时您将无法使用这种方法。

而是尝试使用coalesce()第一个非空值,首先尝试获取行值,然后使用节点值:

USING PERIODIC COMMIT 10000 LOAD CSV WITH HEADERS FROM "file:///12Review.csv" AS row 
MERGE (R:Review {nr: toInteger(row.nr)}) 
SET R.reviewDate = coalesce(row.reviewDate, R.reviewDate),
R.reviewDate = coalesce(row.title, R.title),
R.reviewDate = coalesce(row.rating1, R.rating1),
R.reviewDate = coalesce(row.rating2, R.rating2),
R.reviewDate = coalesce(row.rating3, R.rating3),
R.reviewDate = coalesce(row.rating4, R.rating4)
于 2020-03-24T00:52:47.503 回答