在Cypher中更新属性前能否判断属性是否为列表类型
报错原因
- 你编写的Cypher直接对字符串类型的
serials属性执行列表索引操作,Cypher运行时检测到类型不匹配会直接抛出类型错误 - 匹配逻辑存在问题:若
serials为非空字符串,(a.serials)[0]实际是存在的,你的NOT EXISTS条件无法匹配到这部分需要修改的节点
可行解决方案
方案1:Neo4j 5.0及以上版本(使用内置类型判断)
直接用typeof函数判断属性类型,性能最优:
MATCH (a:part) WHERE typeof(a.serials) = 'STRING' SET a.serials = [] RETURN a
方案2:低版本Neo4j(已安装APOC插件)
用APOC提供的类型判断函数实现:
MATCH (a:part) WHERE apoc.meta.type(a.serials) = 'STRING' SET a.serials = [] RETURN a
方案3:无APOC的兼容写法
利用list()函数的特性实现类型判断,不需要额外插件:
规则说明:如果参数是字符串,
list()会将字符串拆分为单字符组成的新列表,与原属性值不等;如果参数是列表,list()会直接返回原列表,与原属性值相等
MATCH (a:part) WHERE list(a.serials) <> a.serials SET a.serials = [] RETURN a
大数据量更新注意事项
如果:part标签下节点数量超过10万,建议分批更新避免事务过大导致内存溢出,示例如下:
MATCH (a:part) WHERE typeof(a.serials) = 'STRING' WITH a LIMIT 10000 SET a.serials = [] RETURN count(*) AS updated_count
重复执行上述语句直到返回的updated_count为0即可。
内容的提问来源于stack exchange,提问作者Yoann Maingon
相关产品推荐
相关产品推荐

