Cypher查询使用apoc.do.when()报Invalid input 'p'错误求助
问题原因及解决办法
错误根源
核心问题是Cypher语法不符合规范:WITH子句后不能直接用逗号连接CALL子句,CALL是独立的查询子句,必须单独成行;同时调用APOC过程函数时,需要用YIELD接收返回结果,你之前的写法缺少这个关键步骤,并非apoc.do.when()只能在查询开头调用。
修正后的查询
OPTIONAL MATCH (m:MeasurementSite)-[*2]-(v:Val) WHERE ID(m) = $meter AND v.d < $end AND v.d > $start WITH v CALL apoc.do.when( v IS NOT NULL, 'RETURN abs(toInteger(apoc.temporal.format(duration.inDays($date, $d), ''dd''))) AS dist', 'RETURN NULL AS dist', {d: v.d, date: $date} ) YIELD value RETURN v, value.dist AS dist;
关键修正点
- 拆分
WITH v, CALL为WITH v后单独执行CALL子句,符合Cypher语法要求。 - 添加
YIELD value接收apoc.do.when()的返回结果,APOC过程函数必须通过YIELD获取输出值。 - 明确
apoc.do.when()内部返回语句的别名AS dist,方便后续通过value.dist提取结果。 - 内部字符串中的单引号用两个单引号
''转义(Cypher中用单引号包裹字符串时,内部单引号需以此方式转义)。
额外注意事项
- 确认Neo4j 4.x已安装并启用对应版本的APOC插件,版本不匹配可能导致函数调用失败。
- 验证
$date与v.d的类型一致性,确保duration.inDays()计算有效。
内容的提问来源于stack exchange,提问作者BairDev
相关产品推荐
相关产品推荐

