Neo4j使用csv创建关系

时间:2014-10-28 09:43:22

标签: csv neo4j cypher relationships

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

我的csv文件如下:

  

"标题" |一年|"字" //头

     

"进入野外" | 2007 |" 20世纪90年代" //与标题,年份和关键字一致的行

     

"进入野外" | 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);

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

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

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

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

注意:我不应该遇到硬件问题因为我使用的是我们教员的超级PC。

1 个答案:

答案 0 :(得分:4)

确保使用架构索引来加快查找起始节点的速度。在运行导入之前,请执行以下操作:

CREATE INDEX ON :Movie(title)
CREATE INDEX ON :Keyword(word)

确保填充索引并联机(使用: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})

第二次传递文件

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);