| .. | ||
| __pycache__ | ||
| config.py | ||
| data_import.log | ||
| data_import.py | ||
| data_validation.log | ||
| data_validation.py | ||
| database_schema.sql | ||
| knowledge-必修第一章-集合与常用逻辑用语.json | ||
| knowledge-必修第七章-复数.json | ||
| knowledge-必修第三章-函数的概念与性质.json | ||
| knowledge-必修第九章-统计.json | ||
| knowledge-必修第二章-一元二次函数、方程和不等式.json | ||
| knowledge-必修第五章-三角函数.json | ||
| knowledge-必修第八章-立体几何初步.json | ||
| knowledge-必修第六章-平面向量及其应用.json | ||
| knowledge-必修第十章-概率.json | ||
| knowledge-必修第四章-指数函数与对数函数.json | ||
| knowledge-选择性必修第一章-空间向量与立体几何.json | ||
| knowledge-选择性必修第七章-随机变量及其分布.json | ||
| knowledge-选择性必修第三章-圆锥曲线的方程.json | ||
| knowledge-选择性必修第二章-直线和圆的方程.json | ||
| knowledge-选择性必修第五章-一元函数的导数及其应用.json | ||
| knowledge-选择性必修第八章-成对数据的统计分析.json | ||
| knowledge-选择性必修第六章-计数原理.json | ||
| knowledge-选择性必修第四章-数列.json | ||
| method-必修第一章-集合与常用逻辑用语.json | ||
| method-必修第七章-复数.json | ||
| method-必修第三章-函数的概念与性质.json | ||
| method-必修第九章-统计.json | ||
| method-必修第二章-一元二次函数、方程和不等式.json | ||
| method-必修第五章-三角函数.json | ||
| method-必修第八章-立体几何初步.json | ||
| method-必修第六章-平面向量及其应用.json | ||
| method-必修第十章-概率.json | ||
| method-必修第四章-指数函数与对数函数.json | ||
| method-选择性必修第一章-空间向量与立体几何.json | ||
| method-选择性必修第七章-随机变量及其分布.json | ||
| method-选择性必修第三章-圆锥曲线的方程.json | ||
| method-选择性必修第二章-直线和圆的方程.json | ||
| method-选择性必修第五章-一元函数的导数及其应用.json | ||
| method-选择性必修第八章-成对数据的统计分析.json | ||
| method-选择性必修第六章-计数原理.json | ||
| method-选择性必修第四章-数列.json | ||
| problems-必修第一章-集合与常用逻辑用语.json | ||
| problems-必修第七章-复数.json | ||
| problems-必修第三章-函数的概念与性质.json | ||
| problems-必修第九章-统计.json | ||
| problems-必修第二章-一元二次函数、方程和不等式.json | ||
| problems-必修第五章-三角函数-部分.json | ||
| problems-必修第八章-立体几何初步.json | ||
| problems-必修第六章-平面向量及其应用.json | ||
| problems-必修第十章-概率.json | ||
| problems-必修第四章-指数函数与对数函数.json | ||
| problems-选择性必修第一章-空间向量与立体几何.json | ||
| problems-选择性必修第七章-随机变量及其分布.json | ||
| problems-选择性必修第三章-圆锥曲线的方程.json | ||
| problems-选择性必修第二章-直线和圆的方程.json | ||
| problems-选择性必修第五章-一元函数的导数及其应用.json | ||
| problems-选择性必修第八章-成对数据的统计分析.json | ||
| problems-选择性必修第六章-计数原理.json | ||
| problems-选择性必修第四章-数列.json | ||
| query_examples.sql | ||
| README.md | ||
| setup.py | ||
| 知识图谱提取方法.md | ||
高中数学知识图谱数据库方案
这是一个基于PostgreSQL的高中数学知识图谱数据库系统,支持知识的结构化存储、关系网络分析、全文搜索和个性化推荐。
📁 文件结构
all/
├── database_schema.sql # 数据库架构SQL文件
├── data_import.py # 数据导入脚本
├── config.py # 配置文件
├── query_examples.sql # 常用查询示例
├── analysis_queries.sql # 分析查询SQL
├── README.md # 说明文档(本文件)
├── knowledge-*.json # 知识点JSON文件
├── method-*.json # 方法JSON文件
└── problems-*.json # 题目JSON文件
🏗️ 数据库架构
三层架构设计
-
Knowledge(知识层)
- 知识点定义、原理说明、适用条件
- 支持前置关系、包含关系、关联内容
-
Method(方法层)
- 解题方法、步骤说明、常见错误
- 支撑知识点、数学思想、解题策略
-
Problem(题目层)
- 题目内容、题型分类、难度评估
- 知识点标注、方法标注、来源信息
主要数据表
knowledge_points- 知识点主表methods- 解题方法主表problems- 题目主表knowledge_relations- 知识点关系表problem_knowledge_tags- 题目知识点标注problem_method_tags- 题目方法标注
🚀 快速开始
1. 环境准备
# 安装依赖
pip install psycopg2-binary
# 确保PostgreSQL已启动
pg_ctl -D /usr/local/var/postgres start
2. 创建数据库
# 连接到PostgreSQL
psql -U postgres
# 创建数据库
CREATE DATABASE math_knowledge_graph;
\c math_knowledge_graph
# 执行架构脚本
\i database_schema.sql
3. 配置数据库连接
编辑 config.py 文件,修改数据库连接信息:
DATABASE_CONFIG = {
'host': 'localhost',
'port': 5432,
'database': 'math_knowledge_graph',
'user': 'postgres',
'password': 'your_actual_password', # 修改为实际密码
}
4. 导入数据
python data_import.py
📊 使用示例
基础查询
-- 查询所有核心知识点
SELECT code, name, level, importance
FROM knowledge_points
WHERE importance = '核心'
ORDER BY code;
-- 查询特定知识点的详细信息
SELECT * FROM knowledge_detail_view
WHERE code = 'K1-1-1-01';
-- 查询题目及其知识点标注
SELECT p.code, p.stem, kp.name, pkt.tag_type
FROM problems p
JOIN problem_knowledge_tags pkt ON p.id = pkt.problem_id
JOIN knowledge_points kp ON pkt.knowledge_id = kp.id
WHERE p.code = 'T1-1-1-E01';
关系网络查询
-- 查询知识点的前置关系
WITH RECURSIVE knowledge_chain AS (
SELECT k.id, k.code, k.name, 1 as level
FROM knowledge_points k
WHERE k.code = 'K1-1-3-01' -- 目标知识点
UNION ALL
SELECT k.id, k.code, k.name, kc.level + 1
FROM knowledge_points k
JOIN knowledge_relations kr ON k.id = kr.source_knowledge_id
JOIN knowledge_chain kc ON kr.target_knowledge_id = kc.id
WHERE kr.relation_type = '前置知识'
)
SELECT * FROM knowledge_chain ORDER BY level;
-- 查询题目的知识点覆盖度
SELECT
c.chapter_name,
COUNT(DISTINCT kp.id) as knowledge_count,
COUNT(DISTINCT p.id) as problem_count
FROM chapters c
JOIN sections s ON c.id = s.chapter_id
JOIN knowledge_points kp ON s.id = kp.section_id
LEFT JOIN problem_knowledge_tags pkt ON kp.id = pkt.knowledge_id
LEFT JOIN problems p ON pkt.problem_id = p.id
GROUP BY c.id, c.chapter_name;
全文搜索
-- 搜索知识点
SELECT code, name, importance
FROM knowledge_points
WHERE search_vector @@ to_tsquery('chinese', '函数 & 定义')
ORDER BY ts_rank(search_vector, to_tsquery('chinese', '函数 & 定义')) DESC;
-- 搜索题目
SELECT code, problem_type, stem
FROM problems
WHERE search_vector @@ to_tsquery('chinese', '定义域')
ORDER BY ts_rank(search_vector, to_tsquery('chinese', '定义域')) DESC;
数据分析
-- 难度分布统计
SELECT
type,
COUNT(*) as count,
AVG(difficulty_level) as avg_difficulty
FROM methods
GROUP BY type
ORDER BY avg_difficulty;
-- 知识点考查频次统计
SELECT
kp.name,
COUNT(pkt.id) as problem_count,
AVG(p.difficulty_info->>'整体难度')::float as avg_problem_difficulty
FROM knowledge_points kp
LEFT JOIN problem_knowledge_tags pkt ON kp.id = pkt.knowledge_id
LEFT JOIN problems p ON pkt.problem_id = p.id
WHERE pkt.tag_type = '主要考查'
GROUP BY kp.id, kp.name
HAVING COUNT(pkt.id) > 0
ORDER BY problem_count DESC
LIMIT 10;
🛠️ 数据维护
数据备份
# 备份数据库
pg_dump -U postgres math_knowledge_graph > backup.sql
# 恢复数据库
psql -U postgres math_knowledge_graph < backup.sql
索引重建
-- 重建搜索向量索引
UPDATE knowledge_points SET search_vector =
setweight(to_tsvector('chinese', COALESCE(name, '')), 'A') ||
setweight(to_tsvector('chinese', COALESCE(core_content::text, '')), 'B');
-- 重建所有索引
REINDEX DATABASE math_knowledge_graph;
性能优化
-- 分析查询性能
EXPLAIN ANALYZE SELECT * FROM knowledge_points WHERE importance = '核心';
-- 更新表统计信息
ANALYZE knowledge_points;
ANALYZE methods;
ANALYZE problems;
📈 扩展功能
个性化学习路径
-- 基于知识点关系的学习路径推荐
WITH RECURSIVE learning_path AS (
SELECT k.id, k.code, k.name, k.level, 0 as step, ARRAY[k.id] as path_ids
FROM knowledge_points k
WHERE k.importance = '核心' AND k.level = '二级'
UNION ALL
SELECT k.id, k.code, k.name, k.level, lp.step + 1, lp.path_ids || k.id
FROM knowledge_points k
JOIN knowledge_relations kr ON k.id = kr.source_knowledge_id
JOIN learning_path lp ON kr.target_knowledge_id = lp.id
WHERE kr.relation_type = '前置知识'
AND k.id != ALL(lp.path_ids)
AND lp.step < 5
)
SELECT code, name, level, step
FROM learning_path
WHERE step <= 3
ORDER BY step, name;
错误模式分析
-- 常见错误类型统计
SELECT
m.name as method_name,
COUNT(mce.id) as error_count,
ARRAY_AGG(DISTINCT mce.error_description) as error_types
FROM methods m
LEFT JOIN method_common_errors mce ON m.id = mce.method_id
GROUP BY m.id, m.name
HAVING COUNT(mce.id) > 0
ORDER BY error_count DESC;
🔍 故障排除
常见问题
-
连接失败
- 检查PostgreSQL服务是否启动
- 验证数据库配置信息
- 确认防火墙设置
-
导入失败
- 检查JSON文件格式是否正确
- 验证文件编码(应为UTF-8)
- 查看导入日志文件
-
查询缓慢
- 检查索引是否创建
- 分析查询执行计划
- 考虑优化SQL语句
日志文件
# 查看导入日志
tail -f data_import.log
# 查看PostgreSQL日志
tail -f /usr/local/var/postgres.log
📞 技术支持
如有问题,请检查:
- PostgreSQL版本要求:≥ 12
- Python版本要求:≥ 3.7
- 所需Python包:psycopg2-binary
📄 许可证
本项目采用MIT许可证,详见LICENSE文件。