You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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;

关键修改点:

  1. 在apoc.do.case第三个参数位置,通过{row: row, i: i, ir: ir}将外部变量包装为参数传入。
  2. 字符串语句中的变量全部改为$row、$i、$ir形式,引用传入的参数。
  3. 移除第二个分支中多余的WITH row, f, i, ir,参数已在语句作用域内,无需额外传递。
  4. 为数值字段统一添加toFloat()转换,避免字符串类型存储数值。

内容的提问来源于stack exchange,提问作者le Minh Nguyen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 09:05:29