使用apoc.do.case时row变量未定义的问题求助
问题:apoc.do.case无法访问LOAD CSV的row变量
尝试通过apoc.do.case结合LOAD CSV读取文件,根据行中Funds_Used字段是否为空创建不同关系,但执行时报错提示row变量未定义。
尝试代码
LOAD CSV WITH HEADERS FROM 'url' AS row MERGE (i:Investor {Name: row.Investor_Name}) MERGE (ir:Investment_Round {id: row.Deal_ID}) WITH row, i, ir CALL apoc.do.case([ row.Funds_Used IS NULL, 'MERGE (i)-[r:INVESTED_IN]->(ir) SET r.Investment_Size_million_GBP=toFloat(row.Investment_Size_million_GBP), r.Investment_Size_million_EUR=toFloat(row.Investment_Size_million_EUR)', row.Funds_Used IS NOT NULL, 'MERGE (f:Fund {Name: row.Funds_Used}) WITH row, f, i, ir MERGE (i)-[r:HAS_FUND]->(f) MERGE (f)-[r2:INVESTED_IN]->(ir) SET r2.Investment_Size_million_GBP = row.Investment_Size_million_GBP, r2.Investment_Size_million_EUR = row.Investment_Size_million_EUR;']) YIELD value RETURN value;
报错信息
Failed to invoke procedure `apoc.do.case`: Caused by: org.neo4j.exceptions.SyntaxException: Variable `row` not defined (line 1, column 75 (offset: 74)) "MERGE (i)-[r:INVESTED_IN]->(ir) SET r.Investment_Size_million_GBP=toFloat(row.Investment_Size_million_GBP), r.Investment_Size_million_EUR=toFloat(row.Investment_Size_million_EUR)"
解决方案
问题核心是apoc.do.case的字符串语句无法直接访问外部变量,必须通过参数传递将变量传入语句作用域。
修正后的代码如下:
LOAD CSV WITH HEADERS FROM 'url' AS row MERGE (i:Investor {Name: row.Investor_Name}) MERGE (ir:Investment_Round {id: row.Deal_ID}) WITH row, i, ir CALL apoc.do.case( [ row.Funds_Used IS NULL, 'MERGE ($i)-[r:INVESTED_IN]->($ir) SET r.Investment_Size_million_GBP=toFloat($row.Investment_Size_million_GBP), r.Investment_Size_million_EUR=toFloat($row.Investment_Size_million_EUR)', row.Funds_Used IS NOT NULL, 'MERGE (f:Fund {Name: $row.Funds_Used}) MERGE ($i)-[r:HAS_FUND]->(f) MERGE (f)-[r2:INVESTED_IN]->($ir) SET r2.Investment_Size_million_GBP = toFloat($row.Investment_Size_million_GBP), r2.Investment_Size_million_EUR = toFloat($row.Investment_Size_million_EUR)' ], NULL, // 无匹配分支时的默认操作,设为NULL表示不执行任何操作 {row: row, i: i, ir: ir} // 传递外部变量作为参数 ) YIELD value RETURN value;
关键修改点:
- 在
apoc.do.case第三个参数位置,通过{row: row, i: i, ir: ir}将外部变量包装为参数传入。 - 字符串语句中的变量全部改为
$row、$i、$ir形式,引用传入的参数。 - 移除第二个分支中多余的
WITH row, f, i, ir,参数已在语句作用域内,无需额外传递。 - 为数值字段统一添加
toFloat()转换,避免字符串类型存储数值。
内容的提问来源于stack exchange,提问作者le Minh Nguyen
相关产品推荐
相关产品推荐

