将.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行文件。
答案 0 :(得分:1)
我稍微改变了一个程序。
从关键字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)
希望将来帮助某人。