如何按id分组从CSV导入数据并在Neo4j中创建对应属性节点
实现方案
首先将你的CSV文件保存为node_attrs.csv,放到Neo4j实例对应的import目录下。如果使用Neo4j Desktop,可在对应数据库的管理页点击「Open folder」→「Import」快速打开目标存储目录。
方案1:已安装APOC插件(推荐)
APOC的工具函数可以自动识别属性值类型,实现更简单:
LOAD CSV WITH HEADERS FROM 'file:///node_attrs.csv' AS row FIELDTERMINATOR '\t' WITH toInteger(row.id) AS nodeId, row.attr AS attrKey, // 自动识别数值/字符串类型 CASE WHEN apoc.meta.cypher.isType(row.value, 'FLOAT') THEN toFloat(row.value) WHEN apoc.meta.cypher.isType(row.value, 'INTEGER') THEN toInteger(row.value) ELSE row.value END AS attrValue // 按id分组,将属性键值对拼接为map WITH nodeId, apoc.map.fromPairs(collect([attrKey, attrValue])) AS attrMap // 按id合并节点,避免重复创建 MERGE (n:Node {id: nodeId}) // 批量写入所有属性 SET n += attrMap
方案2:无APOC插件的原生Cypher实现
如果没有安装APOC,可以用正则匹配手动处理属性类型:
LOAD CSV WITH HEADERS FROM 'file:///node_attrs.csv' AS row FIELDTERMINATOR '\t' WITH toInteger(row.id) AS nodeId, row.attr AS attrKey, row.value AS rawValue WITH nodeId, attrKey, CASE WHEN rawValue CONTAINS '.' THEN toFloat(rawValue) WHEN rawValue =~ '-?[0-9]+' THEN toInteger(rawValue) ELSE rawValue END AS attrValue // 按id分组收集所有属性键值对 WITH nodeId, collect([attrKey, attrValue]) AS kvList MERGE (n:Node {id: nodeId}) // 遍历键值对写入属性 FOREACH (kv IN kvList | SET n[kv[0]] = kv[1])
补充说明:
- 你的CSV是制表符分隔的,所以指定了
FIELDTERMINATOR '\t',如果保存的是逗号分隔的标准CSV,把\t改成,即可。- 语句中的节点标签
Node可以按需替换为业务对应的自定义标签,比如DataRecord等。- 使用
MERGE替代CREATE可以避免重复执行语句时生成重复节点,多次执行只会更新对应id节点的属性值。
内容的提问来源于stack exchange,提问作者SteveS
相关产品推荐
相关产品推荐

