2

我想加载一个 csv,其中包含 Wikipedia 类别 rels.csv (类别之间的 400 万个关系)之间的关系。我尝试通过更改以下参数值来修改设置文件:

dbms.memory.heap.initial_size=8G 
dbms.memory.heap.max_size=8G
dbms.memory.pagecache.size=9G

我的查询如下:

USING PERIODIC COMMIT 10000
LOAD CSV FROM 
"https://github.com/jbarrasa/datasets/blob/master/wikipedia/data/rels.csv?raw=true" AS row
    MATCH (from:Category { catId: row[0]})
    MATCH (to:Category { catId: row[1]})
    CREATE (from)-[:SUBCAT_OF]->(to)

此外,我在 catId 和 catName 上创建了索引。尽管进行了所有这些优化,查询仍在运行(从昨天开始)。

你能告诉我是否应该做更多的优化来加载这个 CSV 文件?

4

1 回答 1

4

这太花时间了。400 万条关系需要几分钟甚至几秒钟。

我刚刚在 321 秒内从您共享的链接(Cats-90 和 Rels-231)中加载了所有数据,而我的个人笔记本电脑上的内存设置不到您的一半。

dbms.memory.heap.initial_size=1G  
dbms.memory.heap.max_size=4G 
dbms.memory.pagecache.size=1512m

而且这不是极限,可以进一步改进。 在此处输入图像描述

稍微修改查询:增加 LIMIT 10 倍

USING PERIODIC COMMIT 100000
LOAD CSV FROM 
"https://github.com/jbarrasa/datasets/blob/master/wikipedia/data/rels.csv?raw=true" AS row
    MATCH (from:Category { catId: row[0]})
    MATCH (to:Category { catId: row[1]})
    CREATE (from)-[:SUBCAT_OF]->(to)

一些建议:

  1. 在用于搜索节点的字段上创建索引。(加载数据时不需要在其他字段上建立索引,可以稍后完成,它会消耗不必要的内存)

  2. 不要将最大堆大小设置为充满系统 RAM。将其设置为 RAM 的 50%。

  3. 增加LIMIT:如果你增加堆(RAM)它不会提高性能,除非它被使用。当您设置LIMIT为 10,000 时,堆的大部分将是空闲的。我能够使用 4G 堆加载限制为 100,000 的数据。您可以设置 200,000 或更多。如果它导致任何问题,请尝试减少它。
  4. 重要确保在更改/设置配置后重新启动 Neo4j。(如果尚未完成)。

下次运行加载 CSV 查询时不要忘记删除以前的数据,因为它会创建重复项。

注意:我将文件下载到笔记本电脑并使用相同的文件,因此没有下载时间。

于 2019-06-11T17:21:57.847 回答