Cypher语句引号转义错误致CSV导出字段异常求助
问题修复与优化方案
原查询问题原因
你使用apoc.when时,直接写RETURN "--"会返回一个键值对{"--": "--"},这就是Since字段显示该结果的核心原因——apoc.when返回的value是包含这个键的映射对象,而非单纯的字符串值。
修复后的apoc.when版本
把两个分支的RETURN语句都改成返回命名字段,比如AS val,之后取value.val作为Since的值即可:
CALL apoc.export.csv.query("MATCH (:State)--(sV:StateVal) WHERE sV.d < datetime($untilDate) AND sV.v = 'Error' " + "WITH sV " + "CALL apoc.when(sV.notOnDate IS NULL, 'RETURN \"--\" AS val', " + "'RETURN apoc.date.format(sV.notOnDate.epochSeconds, \"s\", \"dd.MM.yyyy HH:mm\") AS val', {sV: sV}) YIELD value " + "RETURN apoc.date.format(sV.d.epochSeconds, 's', 'dd.MM.yyyy HH:mm') as Datum, " + "sV.v AS Status, value.val as `Since` LIMIT 10; ", "states_backup_test.csv", {params: {untilDate: $untilDate}}) YIELD format, time, rows, batchSize, batches, done RETURN format, time, rows, batchSize, batches, done;
用COALESCE替代apoc.when的更优方案
完全可以用COALESCE处理ZonedDateTime类型字段,逻辑更简洁直观:当sV.notOnDate为null时返回"--",否则格式化日期:
CALL apoc.export.csv.query("MATCH (:State)--(sV:StateVal) WHERE sV.d < datetime($untilDate) AND sV.v = 'Error' " + "RETURN apoc.date.format(sV.d.epochSeconds, 's', 'dd.MM.yyyy HH:mm') as Datum, " + "sV.v AS Status, " + "COALESCE(apoc.date.format(sV.notOnDate.epochSeconds, 's', 'dd.MM.yyyy HH:mm'), '--') AS `Since` LIMIT 10; ", "states_backup_test.csv", {params: {untilDate: $untilDate}}) YIELD format, time, rows, batchSize, batches, done RETURN format, time, rows, batchSize, batches, done;
COALESCE会依次检查参数,返回第一个非null的值,刚好适配你需要的可选字段处理逻辑,无需嵌套调用存储过程,代码可读性更强。
内容的提问来源于stack exchange,提问作者BairDev
相关产品推荐
相关产品推荐

