Neo4j无休止的慢节点创建

时间:2015-03-11 08:46:01

标签: performance neo4j spring-data-neo4j

将.csv文件中的数据集格式为

"title"|year|"word"
"Into the Wild"|2007|"abandoned-bus"
"Into the Wild"|2007|"adolescence"
"Into the Wild"|2007|"adoption"

此文件有超过4M行。

我在远程超级计算机上运行数据库,我使用ssh隧道连接。我创建了2个索引:

CREATE INDEX ON :MOVIE(title)
CREATE INDEX ON :KEYWORD(word)

然后我执行查询:

USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:c:/Users/.../Data/rels.csv" AS csv
FIELDTERMINATOR '|'
MERGE (m:MOVIE {title:csv.title })
ON CREATE SET m.year = toInt(csv.year)
MERGE (k:KEYWORD {word:csv.word})

过了一段时间,我不知道一小时,有关查询执行的信息消失或出现未知错误。但是当我转到localhost:7474 / webadmin的统计数据时,节点的数量增长非常缓慢 - 大约10秒内有5-8个节点。

当我执行查询时:(我可以因为没有显示正在运行的查询)

match (m)
return count(m)

大约有79K个节点。但是计数增加超过21小时。我需要创建大约1.2M节点,而不是在它们之间建立大约4M的关系。当我进行基本计算时,创建1.2M节点将持续大约13天。并且真的不想知道将持续多长时间创建4M关系。

发生了什么事?怎么紧固呢?我该怎么办? 请帮忙。

注意:

我以前已经创建了MOVIE和KEYWORD的节点,并且是从仅包含MOVIE或KEYWORD的单独的csv文件中完成的,并且没有使用PERICODIC COMMIT但是手动选择了约60K的行并对其执行了查询。但是我将它们全部删除,以便在2个查询中也使用关系,并且不需要分割csv文件。无法想象手动将4M行文件划分为60K行文件。

1 个答案:

答案 0 :(得分:1)

我稍微改变了一个程序。

  1. 从关键字csv加载所有160K关键字,仅包含关键字(几毫秒)

    USING PERIODIC COMMIT 1000 LOAD CSV WITH HEADERS FROM 'file:c:/.../kw.csv' as csv CREATE (:KEYWORD {word:csv.word})

  2. 从电影csv加载所有2M电影,仅包含电影标题和年份(几秒钟)

    USING PERIODIC COMMIT 1000 LOAD CSV WITH HEADERS FROM 'file:c:/.../mov.csv' as csv CREATE (:MOVIE {title:csv.title, year: toInt(csv.year)})

  3. 在MOVIE和KEYWORD上创建索引

    CREATE INDEX ON :MOVIE(title) CREATE INDEX ON :MOVIE(year) CREATE INDEX ON :KEYWORD(word)

  4. 从包含电影标题,年份和关键字的csv加载关系(这需要几个小时,但速度很快,可以看到webadmin界面的进展)

    USING PERIODIC COMMIT 1000 LOAD CSV WITH HEADERS FROM 'file:c:/.../rels.csv' as csv MATCH (m:MOVIE {title:csv.title, year: toInt(csv.year)}) MATCH (k:KEYWORD {word:csv.word}) MERGE (m)-[:HAS {weight:1}]->(k)

  5. 希望将来帮助某人。