第一列和第二列分别两个 Person 节点的 UUID,第三列是关系类型(type),第四列是关系的名称(name)。
我刚开始这样写的导入语句:
1 2 3 4 5
USING PERIODIC COMMIT 10000 LOAD CSV FROM 'file:////relation_all.csv' AS line FIELDTERMINATOR '|' MATCH (p1:Person {uuid: line[0]}) MATCH (p2:Person {uuid: line[1]}) MERGE (p1)-[:line[2] {name: line[3]}]->(p2)
apoc.create.relationship(person1,'KNOWS',{key:value,…}, person2) create relationship with dynamic rel-type
所以我的导入语句只需要改成:
1 2 3 4 5 6 7
USING PERIODIC COMMIT 10000 LOAD CSV FROM 'file:////relation_all.csv' AS line FIELDTERMINATOR '|' MATCH (p1:Person {uuid: line[0]}) MATCH (p2:Person {uuid: line[1]}) WITH p1, p2, line CALL apoc.create.relationship(p1, line[2], {name: line[3]}, p2) YIELD rel RETURN rel
就完事大吉了。
但是考虑到这个 CSV 文件中的关系可能存在重复,所以我通过文档找到了另一个函数:
apoc.merge.relationship(startNode, relType, {key:value, …}, {key:value, …}, endNode) - merge relationship with dynamic type
这个函数中需要传两组 key-value,第一组是用来判断关系是否重复的,第二组是一些其他属性。
最终的导入语句如下:
1 2 3 4 5 6 7
USING PERIODIC COMMIT 10000 LOAD CSV FROM 'file:////relation_all.csv' AS line FIELDTERMINATOR '|' MATCH (p1:Person {uuid: line[0]}) MATCH (p2:Person {uuid: line[1]}) WITH p1, p2, line CALL apoc.merge.relationship(p1, line[2], {name: line[3]}, {}, p2) YIELD rel RETURN rel