You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 22:57:03