Neo4j 2.1.7
尝试通过CSV中收到的信息批量连接一堆节点,如下所示:
person_id,book_id,relationship
111,AAA,OWNS
222,BBB,BORROWS
333,AAA,BORROWS
此CSV中使用的节点:Person
和:Book
已通过LOAD CSV
和CREATE
语句成功加载,并且已存在于数据库中。现在,我想在: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]->
,两者都无济于事(语法错误)
答案 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))
...