技术架构
OpenMTSciEd 使用 PostgreSQL 闭包表(Closure Table)存储和管理 STEM 知识点之间的复杂关系,实现跨学科、跨学段的知识关联。通过递归 CTE 查询,可在毫秒级完成任意深度的依赖路径计算。
┌─────────────┐ ┌──────────────┐ ┌─────────────┐
│ 教程库单元 │─────▶│ 过渡项目 │─────▶│ 课件库章节 │
│ OpenSciEd │ │ Blockly编程 │ │ OpenStax │
└─────────────┘ └──────────────┘ └─────────────┘
│ │ │
▼ ▼ ▼
┌─────────────┐ ┌──────────────┐ ┌─────────────┐
│ 硬件项目 │◀─────│ 理论映射 │─────▶│ AI虚拟导师 │
│ Arduino │ │ MiniCPM │ │ 解释逻辑 │
└─────────────┘ └──────────────┘ └─────────────┘
核心数据
5
节点类型
7
关系类型
90%
跨学科准确率
500+
知识节点目标
图谱设计
节点类型
- CourseUnit - 教程库单元(如 OpenSciEd 生态系统能量流动)
- TextbookChapter - 课件库章节(如 OpenStax 大学物理力学)
- HardwareProject - 硬件实践项目(如 Arduino 气象站)
- KnowledgePoint - 知识点(如光合作用、欧姆定律)
- TransitionProject - 过渡项目(如 Blockly 编程模拟)
关系类型
- LEADS_TO - 递进关系(教程库→课件库)
- APPLIES_THEORY - 硬件项目应用理论
- CROSS_DISCIPLINARY - 跨学科关联
- REQUIRES - 先修知识依赖
- EXPLAINED_BY - AI 导师解释
代码示例
SQL 递归 CTE - 查找前置依赖路径
-- 查询"生态系统能量流动"的所有前置依赖知识点
SELECT c.id, c.name, cp.depth
FROM concept_path cp
JOIN concept c ON cp.ancestor_id = c.id
WHERE cp.descendant_id = $target_concept_id
AND cp.path_type = 'required'
AND cp.depth > 0
ORDER BY cp.depth DESC
TypeScript API 调用 (Prisma ORM)
import { getPrerequisites, findRoute } from '@/lib/concept-path';
// 获取目标知识点的所有前置依赖
const prereqs = await getPrerequisites(conceptId, 'required');
// 查找从起点到终点的完整学习路径
const route = await findRoute(fromId, toId, 'required');
// route.concepts → [{ id: 3, name: '基础代数' }, ...]
技术栈
- PostgreSQL 16 - Neon 云数据库 + 闭包表存储
- 递归 CTE - SQL 图遍历查询语言
- Prisma ORM - 后端 TypeScript 集成
- ECharts - 前端可视化
- 闭包表算法 - O(1) 可达性查询,O(d) 路径重建