首页 文章

Neo4j使用csv创建关系

提问于
浏览
5

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

我的csv文件看起来像:

“title”|年份|“word”// Headers “进入狂野”| 2007 |“1990年代”// Headers ,年份和关键词“走进野外”| 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分钟而没有停止 .

Where is the problem? How to write a query for creating relationships between 2 already created nodes?

I can also delete all nodes and build my database other way but it will be better to not delete all that created nodes.

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

1 回答

  • 3

    确保使用模式索引来加速查找起始节点 . 在运行导入之前做一个:

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

相关问题