从csv导入时使用关系变量

从csv导入时使用关系变量,csv,neo4j,cypher,import-from-csv,Csv,Neo4j,Cypher,Import From Csv,我想将一个项目从SQL图形数据库“仿真”迁移到neo4j,现在我被卡住了。我有一个表,表中有100000多行,格式为source\u id、relationship\u type、target\u id。 这是进口声明: LOAD CSV WITH HEADERS FROM 'file:///usr/local/n4jinput/special_semrelations.csv' AS line WITH line MATCH (s:SemObject {sem_id: TOINT(line.o

我想将一个项目从SQL图形数据库“仿真”迁移到neo4j,现在我被卡住了。我有一个表,表中有100000多行,格式为source\u id、relationship\u type、target\u 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语句中。什么是正确的语法来检索[:在\u CSV中的\u是什么]?因为我有几十种关系类型,所以我需要在这里使用某种变量。。。如果这在CYPHER中是不可能的,那么还有其他有效的方法吗?

关系类型不能在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))

感谢您的回复和解决方法。我试试看。顺便说一句,是因为技术原因,不能在Cypher中动态指定关系类型,还是为了强制执行某种工作流或建模习惯?我相信原因与生成查询计划的过程有关。每个Cypher查询都被编译成一个执行计划,然后缓存该执行计划,以便下次看到查询时可以重用该计划。但是,如果关系类型或节点标签已参数化,则无法缓存查询计划(因为执行计划可能会随关系类型/节点标签而更改)。非常有用,谢谢!谢谢你的提示,赛博山姆,虽然这个问题乍一看听起来不一样,但原则上答案是一样的。。。