如何避免创建含空值的Device节点?Cypher查询异常解决
问题:Cypher导入CSV时过滤空值行无效,无法仅创建有效设备节点
原始CSV数据
device_id,device_type,connected_from,connected_to 200,Thermostat,, 201,Smoke Detector,, 202,Light Sensor,, 203,Security Camera,, 204,Smart Lock,, ,,200,201 ,,200,202 ,,200,203 ,,201,203 ,,202,204
当前使用的Cypher查询
LOAD CSV FROM "/path-to/iot_devices_and_connections.csv" WITH HEADER AS row WITH row WHERE row.device_id IS NOT NULL AND row.device_type IS NOT NULL CREATE (d:Device {id: row.device_id, type: row.device_type});
问题描述
执行上述查询后,不含device_id和device_type的空值行也被创建成了节点,设置的row.device_id IS NOT NULL AND row.device_type IS NOT NULL过滤条件未生效,需要实现仅创建包含有效device_id和device_type的节点。
解决方案
CSV中的空值在Cypher中会被解析为空字符串而非NULL,因此需要修改过滤条件为判断字符串非空:
LOAD CSV FROM "/path-to/iot_devices_and_connections.csv" WITH HEADER AS row WITH row WHERE row.device_id <> "" AND row.device_type <> "" CREATE (d:Device {id: row.device_id, type: row.device_type});
如果需要同时兼容可能存在的NULL和空字符串场景,可使用更严谨的判断:
LOAD CSV FROM "/path-to/iot_devices_and_connections.csv" WITH HEADER AS row WITH row WHERE row.device_id IS NOT NULL AND row.device_id <> "" AND row.device_type IS NOT NULL AND row.device_type <> "" CREATE (d:Device {id: row.device_id, type: row.device_type});
原因说明
LOAD CSV工具会将CSV中无值的列解析为空字符串(""),而非Cypher中的NULL类型,因此原查询中用IS NOT NULL的判断无法过滤这类空值行,必须通过字符串非空的条件实现过滤。
内容的提问来源于stack exchange,提问作者TenTonBonton
相关产品推荐
相关产品推荐

