知识图谱模块
约 1373 字大约 5 分钟
2025-08-11
概述
知识图谱模块构建了教育平台的知识图谱系统,包含知识点管理、知识点关系映射以及课程与知识点的关联。该系统支持构建完整的知识体系,为个性化学习路径和智能推荐提供基础。
表设计
knowledge_points 表 - 知识点表
DDL 定义
CREATE TABLE IF NOT EXISTS public.knowledge_points (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
name VARCHAR(200) NOT NULL,
description TEXT,
content JSONB, -- 存储知识点详细内容
difficulty_level INTEGER CHECK (difficulty_level BETWEEN 1 AND 5),
is_active BOOLEAN NOT NULL DEFAULT true,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);字段说明
| 字段名 | 数据类型 | 约束 | 默认值 | 描述 |
|---|---|---|---|---|
id | UUID | PRIMARY KEY | gen_random_uuid() | 知识点唯一标识 |
name | VARCHAR(200) | NOT NULL | - | 知识点名称 |
description | TEXT | NULLABLE | NULL | 知识点描述 |
content | JSONB | NULLABLE | NULL | 知识点详细内容(结构化数据) |
difficulty_level | INTEGER | CHECK (1-5) | NULL | 难度等级:1(简单)-5(困难) |
is_active | BOOLEAN | NOT NULL | true | 知识点激活状态 |
created_at | TIMESTAMPTZ | NOT NULL | NOW() | 记录创建时间 |
updated_at | TIMESTAMPTZ | NOT NULL | NOW() | 记录最后更新时间 |
content 字段结构示例
{
"definition": "函数的定义",
"examples": ["示例1", "示例2"],
"formulas": ["公式1", "公式2"],
"key_points": ["要点1", "要点2"],
"references": ["参考资料1", "参考资料2"],
"media": {
"videos": ["video_url1", "video_url2"],
"images": ["image_url1", "image_url2"],
"documents": ["doc_url1", "doc_url2"]
}
}knowledge_relations 表 - 知识点关系表
DDL 定义
-- 创建知识点关系类型枚举
CREATE TYPE relation_type AS ENUM ('prerequisite', 'follow_up', 'related', 'contains');
CREATE TABLE IF NOT EXISTS public.knowledge_relations (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
source_point_id UUID NOT NULL REFERENCES public.knowledge_points(id) ON DELETE CASCADE,
target_point_id UUID NOT NULL REFERENCES public.knowledge_points(id) ON DELETE CASCADE,
relation_type relation_type NOT NULL,
weight DECIMAL(3,2) DEFAULT 1.0 CHECK (weight BETWEEN 0 AND 1),
description TEXT,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
UNIQUE(source_point_id, target_point_id, relation_type)
);字段说明
| 字段名 | 数据类型 | 约束 | 默认值 | 描述 |
|---|---|---|---|---|
id | UUID | PRIMARY KEY | gen_random_uuid() | 关系唯一标识 |
source_point_id | UUID | NOT NULL, FOREIGN KEY | - | 源知识点ID |
target_point_id | UUID | NOT NULL, FOREIGN KEY | - | 目标知识点ID |
relation_type | relation_type | NOT NULL | - | 关系类型 |
weight | DECIMAL(3,2) | CHECK (0-1) | 1.0 | 关系权重 |
description | TEXT | NULLABLE | NULL | 关系描述 |
created_at | TIMESTAMPTZ | NOT NULL | NOW() | 记录创建时间 |
关系类型枚举
| 枚举值 | 中文名称 | 描述 | 使用场景 |
|---|---|---|---|
prerequisite | 前置条件 | A是B的前置知识点 | 学习路径规划 |
follow_up | 后续内容 | A是B的后续知识点 | 学习建议推荐 |
related | 相关知识 | A与B相关但无前后依赖 | 知识点推荐 |
contains | 包含关系 | A包含B(父子关系) | 知识体系构建 |
course_knowledge_points 表 - 课程知识点关联表
DDL 定义
CREATE TABLE IF NOT EXISTS public.course_knowledge_points (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
course_id UUID NOT NULL REFERENCES public.courses(id) ON DELETE CASCADE,
knowledge_point_id UUID NOT NULL REFERENCES public.knowledge_points(id) ON DELETE CASCADE,
sequence_order INTEGER,
is_required BOOLEAN NOT NULL DEFAULT true,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
UNIQUE(course_id, knowledge_point_id)
);字段说明
| 字段名 | 数据类型 | 约束 | 默认值 | 描述 |
|---|---|---|---|---|
id | UUID | PRIMARY KEY | gen_random_uuid() | 关联关系唯一标识 |
course_id | UUID | NOT NULL, FOREIGN KEY | - | 课程ID,关联courses表 |
knowledge_point_id | UUID | NOT NULL, FOREIGN KEY | - | 知识点ID |
sequence_order | INTEGER | NULLABLE | NULL | 在课程中的学习顺序 |
is_required | BOOLEAN | NOT NULL | true | 是否为必学知识点 |
created_at | TIMESTAMPTZ | NOT NULL | NOW() | 记录创建时间 |
外键关系
1. knowledge_relations 表的外键关系
-- 源知识点关联
REFERENCES public.knowledge_points(id) ON DELETE CASCADE
-- 目标知识点关联
REFERENCES public.knowledge_points(id) ON DELETE CASCADE- 删除策略: CASCADE(级联删除)
- 说明: 当知识点被删除时,相关的关系记录也会被删除
2. course_knowledge_points 表的外键关系
-- 课程关联
REFERENCES public.courses(id) ON DELETE CASCADE
-- 知识点关联
REFERENCES public.knowledge_points(id) ON DELETE CASCADE- 删除策略: CASCADE(级联删除)
- 说明: 当课程或知识点被删除时,关联记录也会被删除
索引
基础索引
-- knowledge_points 表索引
CREATE INDEX IF NOT EXISTS idx_knowledge_points_active ON public.knowledge_points(is_active);
CREATE INDEX IF NOT EXISTS idx_knowledge_points_difficulty ON public.knowledge_points(difficulty_level);
-- knowledge_relations 表索引
CREATE INDEX IF NOT EXISTS idx_knowledge_relations_source ON public.knowledge_relations(source_point_id);
CREATE INDEX IF NOT EXISTS idx_knowledge_relations_target ON public.knowledge_relations(target_point_id);
CREATE INDEX IF NOT EXISTS idx_knowledge_relations_type ON public.knowledge_relations(relation_type);
-- course_knowledge_points 表索引
CREATE INDEX IF NOT EXISTS idx_course_knowledge_course ON public.course_knowledge_points(course_id);
CREATE INDEX IF NOT EXISTS idx_course_knowledge_point ON public.course_knowledge_points(knowledge_point_id);特殊索引
-- JSONB 索引用于知识点内容搜索
CREATE INDEX IF NOT EXISTS idx_knowledge_points_content_gin ON public.knowledge_points USING GIN (content);约束条件
唯一约束
- knowledge_relations(source_point_id, target_point_id, relation_type): 同一对知识点间同种关系类型唯一
- course_knowledge_points(course_id, knowledge_point_id): 课程与知识点关联唯一
检查约束
- knowledge_points.difficulty_level: 值必须在1-5之间
- knowledge_relations.weight: 权重值必须在0-1之间
RLS策略
-- 知识点访问策略
CREATE POLICY "已认证用户可以查看知识点" ON public.knowledge_points
FOR SELECT USING (auth.role() = 'authenticated');
CREATE POLICY "管理员教师管理知识点" ON public.knowledge_points
FOR ALL USING (get_user_role(auth.uid()) IN ('admin', 'teacher'));
-- 知识点关系访问策略
CREATE POLICY "查看知识点关系" ON public.knowledge_relations
FOR SELECT USING (auth.role() = 'authenticated');
CREATE POLICY "管理知识点关系" ON public.knowledge_relations
FOR ALL USING (get_user_role(auth.uid()) IN ('admin', 'teacher'));
-- 课程知识点关联访问策略
CREATE POLICY "查看课程知识点关联" ON public.course_knowledge_points
FOR SELECT USING (auth.role() = 'authenticated');
CREATE POLICY "管理课程知识点关联" ON public.course_knowledge_points
FOR ALL USING (get_user_role(auth.uid()) IN ('admin', 'teacher'));触发器
-- 自动更新时间戳触发器
CREATE TRIGGER update_knowledge_points_updated_at
BEFORE UPDATE ON public.knowledge_points
FOR EACH ROW
EXECUTE PROCEDURE update_updated_at_column();
-- 知识点关系约束检查触发器
CREATE TRIGGER check_knowledge_relation_constraint_trigger
BEFORE INSERT OR UPDATE ON public.knowledge_relations
FOR EACH ROW
EXECUTE FUNCTION check_knowledge_relation_constraint();数据库函数
update_updated_at_column()
- 用途: 自动更新记录的
updated_at字段 - 触发时机: BEFORE UPDATE
- 返回类型: TRIGGER
- 应用表: knowledge_points
check_knowledge_relation_constraint()
- 用途: 检查知识点关系约束,防止自关联
- 触发时机: BEFORE INSERT OR UPDATE
- 返回类型: TRIGGER
- 约束规则: 知识点不能与自己建立关系
- 应用表: knowledge_relations
版权所有
版权归属:Evoliant
许可证:MIT