Neo4j CALL{WITH...}结构使用UNWIND传入变量报错解决求助
报错原因&修复方案
Cypher的WITH子句会显式指定后续可使用的变量,你在CALL块内执行match (n:person) with n时只传递了n变量,之前导入的sel_meal就被丢弃了,所以会触发变量未定义的报错。
你可以直接修改WITH语句,把sel_meal一同传递即可修复原有写法:
UNWIND ["lunch", "dinner"] AS sel_meal CALL { WITH sel_meal MATCH (n:person) WITH n, sel_meal MATCH (l:meal) WHERE l.name = sel_meal AND n[sel_meal] IS NOT NULL CREATE p=(n)-[r:ATE {food:n[sel_meal]}]->(l) REMOVE n[sel_meal] RETURN p AS result } RETURN result;
更优的批量迁移方案
这个场景完全不需要嵌套CALL子句,直接在UNWIND后执行匹配即可,逻辑更简洁、执行效率更高:
// 只需要修改这个列表即可批量处理任意多个属性 UNWIND ["lunch", "dinner"] AS sel_meal // 同时匹配person和meal节点,避免嵌套子查询 MATCH (n:person), (l:meal) WHERE l.name = sel_meal AND n[sel_meal] IS NOT NULL // 创建关系并迁移属性 CREATE (n)-[r:ATE {food: n[sel_meal]}]->(l) // 移除原节点上的冗余属性 REMOVE n[sel_meal] // 按需返回结果 RETURN n.name AS person_name, sel_meal, r.food AS food
如果需要处理的节点量级很大(百万级以上),可以搭配APOC库的apoc.periodic.iterate做分批提交,避免内存溢出:
CALL apoc.periodic.iterate( 'UNWIND ["lunch", "dinner"] AS sel_meal MATCH (n:person) WHERE n[sel_meal] IS NOT NULL RETURN n, sel_meal', 'MATCH (l:meal {name: sel_meal}) CREATE (n)-[r:ATE {food: n[sel_meal]}]->(l) REMOVE n[sel_meal]', {batchSize: 1000, parallel: false} ) YIELD batches, total RETURN batches, total
内容的提问来源于stack exchange,提问作者Taylor F
相关产品推荐
相关产品推荐

