在 Docker 环境中使用 Neo4j 创建知识图谱，最关键的步骤是将你的 CSV 文件放入 Docker 容器能够访问的 import 目录下。

以下是详细的操作指南，分为准备、导入和验证三个阶段：

第一步：准备工作（文件存放）
在 Docker 中，Neo4j 默认只能读取容器内 /var/lib/neo4j/import 目录下的文件。你需要将 nodes.csv 和 rels.csv 拷贝到这个位置。

确定容器名称：打开终端运行 docker ps，假设你的容器名为 neo4j。

拷贝文件：在宿主机（你的电脑）存放这两个文件的目录下运行：

Bash
docker cp nodes.csv neo4j:/var/lib/neo4j/import/nodes.csv
docker cp rels.csv neo4j:/var/lib/neo4j/import/rels.csv
(注意：如果你在启动容器时挂载了 import 卷，直接把文件丢进对应的宿主机文件夹即可。)

第二步：执行 Cypher 语句导入数据
访问 Neo4j 浏览器（通常是 http://localhost:7474），登录后在顶部的输入框分步执行以下代码：

1. 导入节点 (Nodes)
这段代码会读取 nodes.csv，并根据 type 字段动态创建节点。

Cypher
LOAD CSV WITH HEADERS FROM "file:///nodes.csv" AS row
// 使用 MERGE 避免重复创建，根据 id 匹配
MERGE (n:Entity {id: row.id})
ON CREATE SET n.name = row.name, n.type = row.type
// 为方便查询，根据 type 字段动态添加标签（可选）
WITH n, row
CALL apoc.create.addLabels(n, [row.type]) YIELD node
RETURN count(node);
提示：如果你的 Neo4j 没有安装 APOC 插件，可以直接简单处理：
LOAD CSV WITH HEADERS FROM "file:///nodes.csv" AS row MERGE (:Entity {id: row.id, name: row.name, type: row.type});

2. 创建索引（加速后续匹配）
在导入关系前，建议先为 id 建立索引：

Cypher
CREATE INDEX FOR (n:Entity) ON (n.id);
3. 导入关系 (Relationships)
这段代码会根据 start_id 和 end_id 将节点连接起来。

Cypher
LOAD CSV WITH HEADERS FROM "file:///rels.csv" AS row
MATCH (from:Entity {id: row.start_id})
MATCH (to:Entity {id: row.end_id})
// 使用 APOC 创建动态关系类型，或者手动写死关系
CALL apoc.create.relationship(from, row.relation, {}, to) YIELD rel
RETURN count(rel);
提示：如果没有 APOC，由于 CSV 中关系类型是中文或动态的，建议分类型导入，或先统一用一个关系名：
LOAD CSV WITH HEADERS FROM "file:///rels.csv" AS row MATCH (from:Entity {id: row.start_id}), (to:Entity {id: row.end_id}) MERGE (from)-[:RELATED {type: row.relation}]->(to);

第三步：验证结果
执行以下查询来查看你刚刚创建的图谱：

Cypher
MATCH (n)-[r]->(m) RETURN n, r, m LIMIT 20;

1. 彻底清库
在 Neo4j 浏览器中运行以下命令，清空刚才导入的乱码数据：

Cypher
MATCH (n) DETACH DELETE n;

# 黑龙江非遗知识图谱导入
1. 导入节点（修正版）
我们利用 apoc.convert.fromJsonMap 解析 JSON，然后直接用 Neo4j 原生的 += 操作符合并属性，这样比调用存储过程更快、更稳定。

Cypher
LOAD CSV WITH HEADERS FROM "file:///kg_merged_nodes.csv" AS row
// 1. 根据 ID 创建或匹配基础节点
MERGE (n:Entity {id: row.id})
SET n.name = row.label

// 2. 解析 JSON 属性并批量赋值
WITH n, row, apoc.convert.fromJsonMap(row.properties) AS props
SET n += props

// 3. 动态添加业务标签 (ICH_Project, Performance_Form 等)
WITH n, row
CALL apoc.create.addLabels(n, [row.type]) YIELD node
RETURN count(node);

2. 导入关系（修正版）
关系文件同理，我们也把 properties 里的描述和上下文解析出来。

Cypher
LOAD CSV WITH HEADERS FROM "file:///kg_merged_rels.csv" AS row
MATCH (s:Entity {id: row.source})
MATCH (t:Entity {id: row.target})

// 动态创建关系并赋予 JSON 中的属性
CALL apoc.create.relationship(s, row.type, apoc.convert.fromJsonMap(row.properties), t) YIELD rel
RETURN count(rel);
