Neo4j 永无休止的缓慢节点创建
Neo4j neverending slow node creating
在 .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 小时内增加。我需要创建大约 120 万个节点,而不是在它们之间建立大约 400 万个关系。当我进行基本计算时,创建 1.2M 节点将持续大约 13 天。并且真的不想知道建立 400 万关系会持续多久。
这是怎么回事?怎么固定?我能做什么?
请帮忙。
注意:
我过去已经创建了 MOVIE 和 KEYWORD 的节点,并且是从仅包含 MOVIE 或 KEYWORD 的单独 csv 文件中创建的,并且没有使用 PERIODIC COMMIT 而是手动选择了大约 60K 行并对其执行了查询。但我将它们全部删除,以便在 2 个查询中也使用关系并且不使用分割 csv 文件。无法想象手动将 4M 行文件分成 60K 行文件。
我稍微改了一下程序。
从仅包含关键字的关键字 csv 加载所有 160K 个关键字(几毫秒)
USING PERIODIC COMMIT 1000
LOAD CSV WITH HEADERS FROM 'file:c:/.../kw.csv' as csv
CREATE (:KEYWORD {word:csv.word})
从仅包含电影标题和年份(几秒钟)的电影 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)})
在 MOVIE 和 KEYWORD 上创建索引
CREATE INDEX ON :MOVIE(title)
CREATE INDEX ON :MOVIE(year)
CREATE INDEX ON :KEYWORD(word)
从包含电影标题、年份和关键字的 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)
希望这对以后的人有所帮助。
在 .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 小时内增加。我需要创建大约 120 万个节点,而不是在它们之间建立大约 400 万个关系。当我进行基本计算时,创建 1.2M 节点将持续大约 13 天。并且真的不想知道建立 400 万关系会持续多久。
这是怎么回事?怎么固定?我能做什么? 请帮忙。
注意:
我过去已经创建了 MOVIE 和 KEYWORD 的节点,并且是从仅包含 MOVIE 或 KEYWORD 的单独 csv 文件中创建的,并且没有使用 PERIODIC COMMIT 而是手动选择了大约 60K 行并对其执行了查询。但我将它们全部删除,以便在 2 个查询中也使用关系并且不使用分割 csv 文件。无法想象手动将 4M 行文件分成 60K 行文件。
我稍微改了一下程序。
从仅包含关键字的关键字 csv 加载所有 160K 个关键字(几毫秒)
USING PERIODIC COMMIT 1000 LOAD CSV WITH HEADERS FROM 'file:c:/.../kw.csv' as csv CREATE (:KEYWORD {word:csv.word})
从仅包含电影标题和年份(几秒钟)的电影 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)})
在 MOVIE 和 KEYWORD 上创建索引
CREATE INDEX ON :MOVIE(title) CREATE INDEX ON :MOVIE(year) CREATE INDEX ON :KEYWORD(word)
从包含电影标题、年份和关键字的 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)
希望这对以后的人有所帮助。