从csv导入时使用变量用于关系

时间:2016-03-25 19:58:25

标签: csv neo4j cypher import-from-csv

我想从SQL图形数据库迁移项目'仿真'到了neo4j,现在我被卡住了。我有一个包含100000多行source_id,relationship_type,target_id形式的表。 这是进口声明:

LOAD CSV WITH HEADERS FROM
'file:///usr/local/n4jinput/special_semrelations.csv' AS line
WITH line
MATCH (s:SemObject {sem_id: TOINT(line.ool_source_id)})
MATCH (t:SemObject {sem_id: TOINT(line.ool_target_id)})
CREATE (s)-[line.rlt_relation]->(t)

问题出在create语句中。检索[:WHATEVER_IS_IN_THE_CSV]的正确语法是什么?由于我有几十种关系类型,我需要在这里使用某种变量......如果在CYPHER中这是不可能的,有没有其他方法可以有效地执行此操作?

1 个答案:

答案 0 :(得分:1)

无法在Cypher中动态参数化或指定关系类型。如果您有一组已定义的关系类型,则有一种解决方法。您可以使用CASE语句来比较关系类型,如果关系类型匹配则填充数组,然后遍历创建正确关系类型的数组:

LOAD CSV WITH HEADERS FROM 'file:///myfile.csv' AS line
MATCH (s:SemObject {sem_id: TOINT(line.ool_source_id)})
MATCH (t:SemObject {sem_id: TOINT(line.ool_target_id)})
WITH s,t, 
  CASE WHEN line.rlt_relation = "MEMBER_OF" THEN [1] ELSE [] END AS member_of,
  CASE WHEN line.rlt_relation = "BELONGS_TO" THEN [1] ELSE [] END AS belongs_to
FOREACH (x IN member_of | CREATE (s)-[:MEMBER_OF]->(t))
FOREACH (x IN belongs_to | CREATE (s)-[:BELONGS_TO]->(t))