Neo4j Cypher如何用LOAD CSV等语句迭代处理CSV的14个quantity列
问题核心原因
- 第一个错误是
WITH子句仅传递了row变量,UNWIND生成的迭代变量i被丢弃,后续语句自然无法访问i - 第二个错误是动态获取CSV行字段的写法错误:
row.quantity+toString(i)会被解析为「取row的quantity属性值再和toString(i)拼接」,而非先拼接字段名再取对应属性
正确实现代码
提供两种可直接运行的实现方案:
UNWIND实现(推荐,兼容性好,逻辑清晰)
LOAD CSV WITH HEADERS FROM '<path>' AS row UNWIND range(1,14) as i // 同时传递row、i两个变量,同步过滤空值、空字符串 WITH row, i WHERE row['quantity' + toString(i)] IS NOT NULL AND trim(row['quantity' + toString(i)]) <> '' MATCH (m:main {main_id: row.main}) MERGE (q:quantity {quantity : row['quantity' + toString(i)]}) MERGE (m)-[:main_has_quantity]->(q);
FOREACH实现(适合不需要提前过滤MATCH的场景)
之前FOREACH执行失败是因为WITH子句不能放在FOREACH内部,将过滤逻辑移到FOREACH的条件判断中即可:
LOAD CSV WITH HEADERS FROM '<path>' AS row MATCH (m:main {main_id: row.main}) FOREACH(i IN range(1,14) | // 用CASE做条件判断,满足条件才执行后续逻辑 FOREACH(ignoreMe IN CASE WHEN row['quantity' + toString(i)] IS NOT NULL AND trim(row['quantity' + toString(i)]) <> '' THEN [1] ELSE [] END | MERGE (q:quantity {quantity : row['quantity' + toString(i)]}) MERGE (m)-[:main_has_quantity]->(q) ) )
优化建议
- 提前给
:main(main_id)、:quantity(quantity)建立唯一约束/索引,大数据量导入时速度提升非常明显 - 代码中额外增加的
trim()判断,可以避免字段值为空字符串的无效节点创建
内容的提问来源于stack exchange,提问作者kumarais
相关产品推荐
相关产品推荐

