init: KG_ICH 项目初始化
- data/: 非遗地理编码数据(GIS shapefile + CSV) - dofile/kg_project/: 知识图谱构建代码(纳入主仓库) - dofile/visulization/: 可视化数据与路线图 - officefile/: 文献、草稿、bib 文档 - officefile/latex/: Overleaf 同步目录(独立管理,不纳入) - output/: 输出目录 - logs/: 日志目录
This commit is contained in:
@@ -0,0 +1,94 @@
|
||||
在 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);
|
||||
Reference in New Issue
Block a user