Neo4j使用csv创建关系

Gon*_*dil 6 csv neo4j relationships cypher

我正在尝试使用加载的csv文件在两种类型的节点之间创建关系.我已经创建了所有电影和关键字节点.我还创建了索引:电影(标题)和:关键字(单词).

我的csv文件看起来像:

"title"|年|"word"//标题

"进入狂野"| 2007 |"1990"//与标题,年份和关键字一致

"走进野外"| 2007 |"废弃的公共汽车"

我的查询:

LOAD CSV WITH HEADERS FROM "file:/home/gondil/temp.csv" AS csv
FIELDTERMINATOR '|'
MATCH (m:Movie {title:csv.title,year: toInt(csv.year)}), (k:Keyword {word:csv.word})
MERGE (m)-[:Has {weight:1}]->(k);
Run Code Online (Sandbox Code Playgroud)

查询运行大约一个小时,而不是显示错误"未知错误".多余的错误描述.

我认为这是由于160K关键词和超过1M电影以及csv中超过4M行.所以我将csv简化为一行,它仍然运行大约15分钟,没有停止.

问题出在哪儿?如何编写查询以创建2个已创建的节点之间的关系?

我也可以删除所有节点并以其他方式构建我的数据库,但最好不要删除所有创建的节点.

注意:我不应该遇到硬件问题,因为我使用的是我们教员的Super PC.

Ste*_*ter 6

确保有模式索引以加快查找起始节点的速度。在运行导入之前,请执行以下操作:

CREATE INDEX ON :Movie(title)
CREATE INDEX ON :Keyword(word)
Run Code Online (Sandbox Code Playgroud)

确保索引已填充且在线(使用:schema命令检查)。

将您的 Cypher 命令重构为两个查询,以使用索引 - 现在一个索引仅包含一个标签和一个属性:

USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:/home/gondil/temp.csv" AS csv
FIELDTERMINATOR '|'
MERGE (m:Movie {title:csv.title })
ON CREATE SET m.year = toInt(csv.year)
MERGE (k:Keyword {word:csv.word})
Run Code Online (Sandbox Code Playgroud)

第二遍文件

USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:/home/gondil/temp.csv" AS csv
FIELDTERMINATOR '|'
MATCH (m:Movie {title:csv.title })
MATCH (k:Keyword {word:csv.word})
MERGE (m)-[:Has {weight:1}]->(k);
Run Code Online (Sandbox Code Playgroud)