- data/: 非遗地理编码数据(GIS shapefile + CSV) - dofile/kg_project/: 知识图谱构建代码(纳入主仓库) - dofile/visulization/: 可视化数据与路线图 - officefile/: 文献、草稿、bib 文档 - officefile/latex/: Overleaf 同步目录(独立管理,不纳入) - output/: 输出目录 - logs/: 日志目录
3.8 KiB
在 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),登录后在顶部的输入框分步执行以下代码:
- 导入节点 (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});
- 创建索引(加速后续匹配) 在导入关系前,建议先为 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;
- 彻底清库 在 Neo4j 浏览器中运行以下命令,清空刚才导入的乱码数据:
Cypher MATCH (n) DETACH DELETE n;
黑龙江非遗知识图谱导入
- 导入节点(修正版) 我们利用 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);
- 导入关系(修正版) 关系文件同理,我们也把 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);