将CSV数据中的关系加载到neo4j db中

时间:2015-02-19 05:30:55

标签: neo4j cypher

Neo4j 2.1.7

尝试通过CSV中收到的信息批量连接一堆节点,如下所示:

person_id,book_id,relationship
111,AAA,OWNS
222,BBB,BORROWS
333,AAA,BORROWS

此CSV中使用的节点:Person:Book已通过LOAD CSVCREATE语句成功加载,并且已存在于数据库中。现在,我想在:Person:Book之间加载以上关系的CSV。关系在CSV本身中定义。

LOAD CSV WITH HEADERS FROM "file:data.csv" AS row
MATCH (person:Person { personID: row.person_id })
MATCH (book:Book { bookID: row.book_id })

当然,如果我提供了一个特定的名称(MERGE[:OWNS]等,则下一个[:BORROWS]命令有效。但正如您所看到的,我的关系由传入的数据提供

但是,我希望MERGE中定义的关系不是“硬编码”字符串,而是来自我的CSV第3列的数据。有点像:

MERGE (person)-[row.relationship]->(book)

这可能吗?

PS:我已经尝试了上面的语法,还有-[:row.relationship]->,两者都无济于事(语法错误)

1 个答案:

答案 0 :(得分:1)

我认为LOAD CSV无法实现。您需要对输入数据和集合进行一些小技巧。如果输入csv中的关系包含OWNS,则创建一个包含其中一个的集合,否则创建一个空集合。对BORROWS关系值执行相同操作。这将是这样的......

...
case when row.relationship = "OWNS" then [1] else [] end as owns
case when row.relationship = "BORROWS" then [1] else [] end as borrows
foreach(x in owns | MERGE (person)-[:OWNS]->(book))
foreach(x in borrows | MERGE (person)-[:BORROWS]->(book))
...