Appearance
OpenSPG 数据库 Schema 文档
目录
1. 存储架构概述
1.1 双层存储设计
┌─────────────────────────────────────────────────────────────────┐
│ OpenSPG 存储架构 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌───────────────────────┐ ┌──────────────────────┐ │
│ │ MySQL关系型数据库 │ │ 图数据库 │ │
│ │ (元数据层) │ │ (数据层) │ │
│ ├───────────────────────┤ ├──────────────────────┤ │
│ │ • Schema定义 │ │ • 实体节点 │ │
│ │ • 项目信息 │ 同步 │ • 关系边 │ │
│ │ • 构建任务 │ ────▶ │ • 属性值 │ │
│ │ • 推理任务 │ │ • 索引 │ │
│ │ • 用户权限 │ │ │ │
│ │ • 调度配置 │ │ Neo4j / TuGraph │ │
│ └───────────────────────┘ └──────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘1.2 存储职责划分
| 存储层 | 职责 | 技术选型 |
|---|---|---|
| MySQL | Schema元数据管理、任务调度、权限控制 | MySQL 5.7+ |
| Neo4j/TuGraph | 知识图谱数据存储、图查询、图遍历 | Neo4j 4.4.7 / TuGraph 1.4.1 |
2. MySQL 关系型数据库 Schema
2.1 数据库创建
sql
CREATE DATABASE openspg CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE openspg;2.2 核心表结构
2.2.1 项目管理表
kg_project_info - 图谱项目信息表
存储OpenSPG的项目定义。
sql
CREATE TABLE `kg_project_info` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` varchar(255) NOT NULL COMMENT '项目名称',
`description` varchar(1024) DEFAULT NULL COMMENT '项目描述信息',
`status` varchar(20) NOT NULL DEFAULT 'INVALID' COMMENT 'DELETE:删除 VALID:有效 INVALID:无效',
`gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`gmt_modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
`namespace` varchar(64) NOT NULL DEFAULT '' COMMENT '命名空间',
`biz_domain_id` bigint(20) DEFAULT NULL COMMENT '业务域主键',
`config` text DEFAULT NULL COMMENT '项目配置信息(JSON格式)',
`visibility` varchar(64) DEFAULT 'PRIVATE' COMMENT '可见性:PRIVATE、PUBLIC_READ',
`tag` varchar(64) NOT NULL DEFAULT 'LOCAL' COMMENT '知识库标签:LOCAL、PUBLIC-NET',
PRIMARY KEY(`id`),
UNIQUE KEY `uk_name`(`name`),
KEY `idx_biz_domain_id`(`biz_domain_id`)
) DEFAULT CHARSET = utf8mb4 COMMENT = '图谱项目信息表';字段说明:
namespace: 项目命名空间,用于隔离不同项目的Schemaconfig: JSON格式的项目配置,包括LLM配置、图存储URL等visibility: 项目可见性,控制访问权限
示例数据:
sql
INSERT INTO kg_project_info (name, namespace, description, status)
VALUES ('医疗知识图谱', 'medical', '医疗领域知识图谱项目', 'VALID');kg_biz_domain - 业务域表
sql
CREATE TABLE `kg_biz_domain` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`gmt_modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`name` varchar(100) DEFAULT NULL COMMENT '名称',
`status` varchar(20) DEFAULT NULL COMMENT '状态。VALID - 有效 DELETE - 逻辑删除',
`description` varchar(1024) DEFAULT NULL COMMENT '描述',
`global_config` varchar(10240) DEFAULT NULL COMMENT '全局配置',
PRIMARY KEY(`id`),
KEY `idx_status`(`status`)
) DEFAULT CHARSET = utf8mb4 COMMENT = '业务域表';2.2.2 Schema元数据表
kg_ontology_entity - 本体类型表
最核心的表,存储所有SPG类型定义(EntityType、ConceptType、EventType、StandardType等)。
sql
CREATE TABLE `kg_ontology_entity` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`original_id` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '类型的原始ID(用于版本管理)',
`name` varchar(255) NOT NULL COMMENT '类型英文名称(如Person、Company)',
`name_zh` varchar(255) NOT NULL COMMENT '类型中文名称(如人物、公司)',
`entity_category` varchar(20) NOT NULL COMMENT 'BASIC:基本类型, ADVANCED:高级类型',
`layer` varchar(20) DEFAULT NULL COMMENT '类型所属层次:CORE(核心层), EXTENSION(扩展层)',
`description` varchar(1024) DEFAULT NULL COMMENT '英文描述',
`description_zh` varchar(1024) DEFAULT NULL COMMENT '中文描述',
`status` char(1) NOT NULL DEFAULT '0' COMMENT '9:删除 1:有效 0:无效',
`with_index` varchar(20) NOT NULL DEFAULT 'TRUE' COMMENT '是否建立索引',
`scope` varchar(20) DEFAULT NULL COMMENT '公有私有标识: PUBLIC, PRIVATE',
`version` int(11) NOT NULL DEFAULT '0' COMMENT '版本号',
`version_status` varchar(50) NOT NULL DEFAULT 'ONLINE' COMMENT '版本状态',
`gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`gmt_modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`transformer_id` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '算子ID',
`operator_config` text DEFAULT NULL COMMENT '算子配置(JSON格式)',
`config` mediumtext DEFAULT NULL COMMENT '实体类型配置(JSON格式)',
`unique_name` varchar(255) DEFAULT NULL COMMENT '唯一名称(命名空间.类型名)',
PRIMARY KEY(`id`),
UNIQUE KEY `uk_name`(`name`),
UNIQUE KEY `uk_origianl_id_version`(`original_id`, `version`),
KEY `idx_version_status`(`version_status`)
) DEFAULT CHARSET = utf8mb4 COMMENT = '本体类型';内置类型示例:
sql
-- Thing根类型
INSERT INTO kg_ontology_entity
(id, original_id, name, name_zh, entity_category, status, version, version_status)
VALUES
(1, 1, 'Thing', '事物', 'ADVANCED', '1', 44, 'ONLINE');
-- 基础类型
INSERT INTO kg_ontology_entity
(id, original_id, name, name_zh, entity_category, status)
VALUES
(2, 2, 'Text', '文本', 'BASIC', '1'),
(4, 4, 'Integer', '整型', 'BASIC', '1'),
(5, 5, 'Float', '浮点数', 'BASIC', '1');
-- 标准类型
INSERT INTO kg_ontology_entity
(id, original_id, name, name_zh, entity_category, status)
VALUES
(10, 10, 'STD.ChinaMobile', '国内手机号', 'STANDARD', '1'),
(11, 11, 'STD.Email', '电子邮箱', 'STANDARD', '1');kg_ontology_entity_parent - 本体继承关系表
sql
CREATE TABLE `kg_ontology_entity_parent` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`entity_id` bigint(20) NOT NULL COMMENT '类型唯一标识',
`parent_id` bigint(20) NOT NULL COMMENT '父类型唯一标识,根节点为-1',
`status` char(1) NOT NULL DEFAULT '0' COMMENT '9:删除 1:有效 0:无效',
`gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`gmt_modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`path` varchar(4096) DEFAULT NULL COMMENT '继承路径(如:1,2,5 表示Thing->Person->Employee)',
`deep_inherit` char(1) DEFAULT NULL COMMENT '是否深度继承:Y、N',
`history_path` varchar(4096) DEFAULT NULL COMMENT '历史继承关系',
PRIMARY KEY(`id`),
UNIQUE KEY `uk_type_parent_id`(`entity_id`, `parent_id`),
KEY `idx_parent_id`(`parent_id`)
) DEFAULT CHARSET = utf8mb4 COMMENT = '本体继承关系表';继承关系示例:
sql
-- 标准类型继承自Thing
INSERT INTO kg_ontology_entity_parent
(entity_id, parent_id, status, path)
VALUES
(10, 1, '1', '1,10'), -- STD.ChinaMobile -> Thing
(11, 1, '1', '1,11'); -- STD.Email -> Thingkg_ontology_entity_property_range - 本体三元组表(SPO)
最重要的表之一,存储所有的属性和关系定义(Subject-Predicate-Object三元组)。
sql
CREATE TABLE `kg_ontology_entity_property_range` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`domain_id` bigint(20) unsigned NOT NULL COMMENT '主体类型ID(如Person的ID)',
`property_name` varchar(255) NOT NULL COMMENT '属性/关系英文名(如age、worksAt)',
`range_id` bigint(20) unsigned NOT NULL COMMENT '值域类型ID(如Integer的ID、Company的ID)',
`property_name_zh` varchar(255) NOT NULL COMMENT '属性/关系中文名',
`constraint_id` bigint(20) unsigned NOT NULL COMMENT '约束ID',
`property_category` varchar(20) NOT NULL COMMENT 'BASIC:基本属性, ADVANCED:高级属性(关系)',
`map_type` varchar(20) NOT NULL DEFAULT 'TYPE' COMMENT 'TYPE:类型属性映射, EDGE:边属性映射',
`version` int(11) NOT NULL DEFAULT '0' COMMENT '版本',
`status` char(1) NOT NULL COMMENT '9:删除 1:有效 0:无效',
`gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`gmt_modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`original_id` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT 'SPO多版本原始ID',
`store_property_name` varchar(255) DEFAULT NULL COMMENT '存储属性名',
`transformer_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '算子ID',
`property_desc` varchar(1024) DEFAULT NULL COMMENT '属性描述',
`property_desc_zh` varchar(1024) DEFAULT NULL COMMENT '属性中文描述',
`project_id` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '项目ID',
`original_domain_id` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '类型原始ID',
`original_range_id` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '值域类型原始ID',
`version_status` varchar(50) DEFAULT NULL COMMENT '版本状态',
`relation_source` varchar(2550) DEFAULT NULL COMMENT '关系对应的属性',
`direction` varchar(10) DEFAULT NULL COMMENT 'BOTH:双向边',
`mask_type` varchar(20) DEFAULT NULL COMMENT '数据加密规则',
`index_type` varchar(1024) DEFAULT NULL COMMENT '索引规则(TEXT、VECTOR等)',
`multiver_config` varchar(1024) DEFAULT NULL COMMENT '多版本配置',
`property_source` bigint(20) DEFAULT NULL COMMENT '属性来源',
`property_config` text DEFAULT NULL COMMENT '属性配置信息',
PRIMARY KEY(`id`),
UNIQUE KEY `uk_spo`(`domain_id`, `property_name`, `range_id`, `map_type`, `version`),
KEY `idx_original_id`(`original_id`),
KEY `idx_property_name`(`property_name`)
) DEFAULT CHARSET = utf8mb4 COMMENT = '本体三元组表';SPO关系示例:
sql
-- Thing的内置属性
INSERT INTO kg_ontology_entity_property_range
(domain_id, property_name, range_id, property_name_zh, constraint_id,
property_category, map_type, version, status)
VALUES
(1, 'id', 2, '实体主键', 0, 'BASIC', 'TYPE', 44, '1'),
(1, 'name', 2, '名称', 0, 'BASIC', 'TYPE', 44, '1'),
(1, 'description', 2, '描述', 0, 'BASIC', 'TYPE', 44, '1');
-- Person类型的age属性: Person -[age]-> Integer
-- domain_id=Person的ID, range_id=Integer的ID
INSERT INTO kg_ontology_entity_property_range
(domain_id, property_name, range_id, property_name_zh, constraint_id,
property_category, map_type, version, status, index_type)
VALUES
(100, 'age', 4, '年龄', 1, 'BASIC', 'TYPE', 1, '1', 'RANGE');
-- Person类型的worksAt关系: Person -[worksAt]-> Company
INSERT INTO kg_ontology_entity_property_range
(domain_id, property_name, range_id, property_name_zh, constraint_id,
property_category, map_type, version, status)
VALUES
(100, 'worksAt', 101, '工作于', 0, 'ADVANCED', 'TYPE', 1, '1');kg_ontology_property_constraint - 本体属性约束表
sql
CREATE TABLE `kg_ontology_property_constraint` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` varchar(255) NOT NULL COMMENT '约束名称(英文)',
`name_zh` varchar(255) NOT NULL COMMENT '约束中文名称',
`is_require` char(1) NOT NULL DEFAULT 'N' COMMENT '非空约束:N-可为空, Y-不可为空',
`up_down_boundary` char(1) NOT NULL DEFAULT '0' COMMENT '边界约束:1->、2->=、3-<、4-<=',
`max_value` varchar(255) DEFAULT NULL COMMENT '最大值(数值类型)',
`min_value` varchar(255) DEFAULT NULL COMMENT '最小值(数值类型)',
`value_pattern` varchar(1024) DEFAULT NULL COMMENT '正则表达式',
`description` varchar(1024) NOT NULL COMMENT '约束描述',
`description_zh` varchar(1024) NOT NULL COMMENT '约束中文描述',
`is_unique` char(1) DEFAULT 'N' COMMENT 'Y:唯一约束, N:无唯一约束',
`is_enum` char(1) DEFAULT 'N' COMMENT 'Y:枚举类型, N:非枚举',
`gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`gmt_modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`enum_value` text COMMENT '枚举值(JSON数组)',
`is_multi_value` char(1) DEFAULT NULL COMMENT 'Y:多值属性',
PRIMARY KEY(`id`)
) DEFAULT CHARSET = utf8mb4 COMMENT = '本体属性约束表';约束示例:
sql
-- 年龄范围约束:0-150
INSERT INTO kg_ontology_property_constraint
(name, name_zh, up_down_boundary, min_value, max_value, description)
VALUES
('AgeRange', '年龄范围', '8', '0', '150', '年龄必须在0到150之间');
-- 手机号正则约束
INSERT INTO kg_ontology_property_constraint
(name, name_zh, value_pattern, description)
VALUES
('ChinaMobilePattern', '手机号格式',
'^1[3-9]\\d{9}$', '11位中国手机号码');kg_project_entity - 项目和本体类型关联表
sql
CREATE TABLE `kg_project_entity` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`gmt_modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`project_id` bigint(20) unsigned NOT NULL COMMENT '项目ID',
`entity_id` bigint(20) unsigned NOT NULL COMMENT '本体类型ID',
`version` int(11) NOT NULL DEFAULT '0' COMMENT '版本',
`version_status` varchar(50) NOT NULL DEFAULT 'ONLINE' COMMENT '版本状态',
`referenced` char(1) NOT NULL COMMENT '是否引用:Y-是, N-否',
`type` varchar(64) DEFAULT 'ENTITY_TYPE' COMMENT '资源类型:ENTITY_TYPE、RELATION_TYPE',
`ref_source` varchar(64) DEFAULT NULL COMMENT '引用来源:corekg、PROJECT',
PRIMARY KEY(`id`),
UNIQUE KEY `uk_project_id_entity_id`(`project_id`, `entity_id`, `version`),
KEY `idx_version_status`(`version_status`)
) DEFAULT CHARSET = utf8mb4 COMMENT = '项目和本体类型关联表';kg_ontology_semantic - 语义关联维护表
sql
CREATE TABLE `kg_ontology_semantic` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`gmt_modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`resource_id` varchar(128) NOT NULL COMMENT '关联资源ID',
`semantic_type` varchar(64) NOT NULL COMMENT '语义谓词(如inverseOf、subClassOf)',
`original_resource_id` varchar(64) NOT NULL COMMENT '被关联资源ID',
`resource_type` varchar(64) DEFAULT NULL COMMENT '资源类型',
`status` int(11) NOT NULL COMMENT '状态:0-删除 1-有效',
`config` text DEFAULT NULL COMMENT '谓词额外信息',
`rule_id` varchar(128) DEFAULT NULL COMMENT '关联规则ID',
`subject_meta_type` varchar(128) DEFAULT NULL COMMENT '主体元概念名',
`object_meta_type` varchar(128) DEFAULT NULL COMMENT '客体元概念名',
PRIMARY KEY(`id`),
UNIQUE KEY `uk_spo`(`resource_id`, `semantic_type`, `original_resource_id`)
) DEFAULT CHARSET = utf8mb4 COMMENT = '语义关联维护表';语义示例:
sql
-- parent关系和children关系互逆
INSERT INTO kg_ontology_semantic
(resource_id, semantic_type, original_resource_id, status)
VALUES
('parent_relation_id', 'inverseOf', 'children_relation_id', 1);kg_semantic_rule - 语义规则表
sql
CREATE TABLE `kg_semantic_rule` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`gmt_modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`name` varchar(255) DEFAULT NULL COMMENT '规则名称',
`expression` mediumtext NOT NULL COMMENT 'KGDSL规则内容',
`version_id` int(11) NOT NULL COMMENT '版本号',
`status` varchar(60) NOT NULL COMMENT '状态',
`user_no` varchar(255) NOT NULL COMMENT '用户ID',
`is_master` tinyint(4) DEFAULT NULL COMMENT '是否主版本',
`rule_id` varchar(512) DEFAULT NULL COMMENT '规则ID',
`effect_scope` varchar(60) DEFAULT NULL COMMENT '生效范围',
PRIMARY KEY(`id`),
UNIQUE KEY `uk_id_version`(`rule_id`, `version_id`)
) DEFAULT CHARSET = utf8mb4 COMMENT = '语义规则表';kg_ontology_release - 本体建模发布版本表
sql
CREATE TABLE `kg_ontology_release` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`gmt_modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`project_id` bigint(20) NOT NULL COMMENT '项目ID',
`version` int(11) NOT NULL COMMENT '发布版本',
`schema_view` longtext DEFAULT NULL COMMENT '当前版本Schema视图(JSON)',
`user_id` varchar(20) NOT NULL COMMENT '发布人',
`user_no` varchar(255) NOT NULL COMMENT '发布人工号',
`description` text NOT NULL COMMENT '发布描述',
`status` varchar(20) NOT NULL COMMENT '状态',
`change_procedure_id` text DEFAULT NULL COMMENT '变更流程ID',
`operation_detail` text DEFAULT NULL COMMENT '(废弃)操作详情',
`error_detail` text DEFAULT NULL COMMENT '失败详情',
`operation_info` mediumtext DEFAULT NULL COMMENT '本次发布操作详情',
PRIMARY KEY(`id`),
UNIQUE KEY `uk_project_version`(`project_id`, `version`)
) DEFAULT CHARSET = utf8mb4 COMMENT = '本体建模发布版本';2.2.3 知识构建任务表
kg_builder_job - 图谱构建任务表
sql
CREATE TABLE `kg_builder_job` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`project_id` bigint(20) unsigned NOT NULL COMMENT '项目ID',
`gmt_create` timestamp NOT NULL DEFAULT current_timestamp(),
`gmt_modified` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
`create_user` varchar(32) DEFAULT 'NULL' COMMENT '创建人',
`modify_user` varchar(32) DEFAULT 'NULL' COMMENT '修改人',
`task_id` bigint(20) unsigned DEFAULT NULL COMMENT '实例任务ID',
`job_name` varchar(64) NOT NULL COMMENT '任务名称',
`chunk_num` bigint(20) unsigned DEFAULT 0 COMMENT '分段数',
`file_url` varchar(2560) NOT NULL COMMENT '文件地址',
`status` varchar(32) DEFAULT NULL COMMENT '状态:PENDING、RUNNING、SUCCESS、FAILED',
`type` varchar(32) DEFAULT NULL COMMENT '类型:EXTRACT、MAPPING、LOAD',
`data_source_type` varchar(32) DEFAULT NULL COMMENT '数据源类型:CSV、JSON、TEXT',
`extension` longtext DEFAULT NULL COMMENT '扩展信息(JSON)',
`version` varchar(64) DEFAULT NULL COMMENT '版本号',
`life_cycle` varchar(64) DEFAULT NULL COMMENT '执行周期类型:ONCE、DAILY、WEEKLY',
`action` varchar(64) DEFAULT NULL COMMENT '数据操作类型:INSERT、UPDATE、UPSERT',
`computing_conf` longtext DEFAULT NULL COMMENT '计算引擎配置',
`retrievals` varchar(512) DEFAULT NULL COMMENT '索引列表',
PRIMARY KEY (`id`),
KEY `idx_project_id` (`project_id`),
KEY `idx_task_id` (`task_id`)
) DEFAULT CHARSET=utf8mb4 COMMENT='图谱构建任务表';任务示例:
sql
INSERT INTO kg_builder_job
(project_id, job_name, file_url, status, type, data_source_type, action)
VALUES
(1, '导入员工数据', '/data/employees.csv', 'PENDING', 'MAPPING', 'CSV', 'UPSERT');kg_scheduler_job - 调度任务表
sql
CREATE TABLE `kg_scheduler_job` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`project_id` bigint(20) unsigned NOT NULL,
`gmt_create` timestamp NOT NULL DEFAULT current_timestamp(),
`gmt_modified` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
`create_user` varchar(32) DEFAULT NULL,
`modify_user` varchar(32) DEFAULT NULL,
`name` varchar(64) NOT NULL COMMENT '任务名称',
`life_cycle` varchar(64) NOT NULL COMMENT '调度周期:ONCE、DAILY、WEEKLY、MONTHLY',
`translate_type` varchar(64) NOT NULL COMMENT '任务转换类型',
`status` varchar(64) NOT NULL COMMENT '状态:ENABLE、DISABLE',
`dependence` varchar(64) NOT NULL COMMENT '前置依赖',
`scheduler_cron` varchar(128) DEFAULT NULL COMMENT 'Cron表达式(如:0 0 2 * * ?)',
`last_execute_time` timestamp NULL COMMENT '最后执行时间',
`invoker_id` bigint(20) unsigned DEFAULT NULL COMMENT '调用者ID',
`extension` longtext DEFAULT NULL COMMENT '扩展信息',
`version` varchar(64) DEFAULT NULL COMMENT '版本号',
PRIMARY KEY (`id`),
KEY `idx_project_id` (`project_id`)
) DEFAULT CHARSET=utf8mb4 COMMENT='调度任务表';kg_scheduler_instance - 调度实例表
sql
CREATE TABLE `kg_scheduler_instance` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`project_id` bigint(20) unsigned NOT NULL,
`gmt_create` timestamp NOT NULL DEFAULT current_timestamp(),
`gmt_modified` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
`create_user` varchar(32) DEFAULT NULL,
`modify_user` varchar(32) DEFAULT NULL,
`unique_id` varchar(128) NOT NULL COMMENT '调度实例唯一ID',
`job_id` bigint(20) unsigned NOT NULL COMMENT '调度任务ID',
`type` varchar(64) NOT NULL COMMENT '实例类型',
`status` varchar(64) NOT NULL COMMENT '实例状态:RUNNING、SUCCESS、FAILED',
`progress` bigint(20) unsigned DEFAULT 0 COMMENT '进度(0-100)',
`begin_running_time` timestamp NULL COMMENT '开始时间',
`finish_time` timestamp NULL COMMENT '完成时间',
`life_cycle` varchar(64) NOT NULL COMMENT '调度周期类型',
`dependence` varchar(64) NOT NULL COMMENT '前置依赖',
`scheduler_date` timestamp NULL COMMENT '调度执行时间',
`version` varchar(64) DEFAULT NULL COMMENT '版本号',
`extension` longtext DEFAULT NULL COMMENT '扩展信息',
`task_dag` longtext DEFAULT NULL COMMENT '任务DAG(JSON)',
PRIMARY KEY (`id`),
KEY `idx_project_id` (`project_id`),
KEY `idx_job_id` (`job_id`),
UNIQUE KEY `uk_unique_id` (`unique_id`)
) DEFAULT CHARSET=utf8mb4 COMMENT='调度实例表';kg_scheduler_task - 调度作业节点表
sql
CREATE TABLE `kg_scheduler_task` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`project_id` bigint(20) unsigned NOT NULL,
`gmt_create` timestamp NOT NULL DEFAULT current_timestamp(),
`gmt_modified` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
`job_id` bigint(20) unsigned NOT NULL COMMENT '调度任务ID',
`instance_id` bigint(20) unsigned NOT NULL COMMENT '调度实例ID',
`type` varchar(64) NOT NULL COMMENT '类型',
`status` varchar(64) NOT NULL COMMENT '状态',
`title` varchar(128) NOT NULL COMMENT '节点标题',
`execute_num` bigint(20) unsigned DEFAULT 0 COMMENT '执行次数',
`begin_time` timestamp NULL COMMENT '开始执行时间',
`finish_time` timestamp NULL COMMENT '完成时间',
`estimate_finish_time` timestamp NULL COMMENT '预估完成时间',
`trace_log` longtext DEFAULT NULL COMMENT '执行日志',
`lock_time` timestamp NULL COMMENT '抢锁时间',
`resource` varchar(10240) DEFAULT NULL COMMENT '资源标记',
`input` longtext DEFAULT NULL COMMENT '输入信息',
`output` longtext DEFAULT NULL COMMENT '输出信息',
`node_id` varchar(64) NOT NULL COMMENT '节点ID',
`extension` longtext DEFAULT NULL COMMENT '扩展信息',
PRIMARY KEY (`id`),
KEY `idx_project_id` (`project_id`),
KEY `idx_job_id` (`job_id`),
KEY `idx_instance_id` (`instance_id`),
UNIQUE KEY `uk_instance_node_id` (`instance_id`,`node_id`)
) DEFAULT CHARSET=utf8mb4 COMMENT='调度作业节点表';2.2.4 推理任务表
kg_reason_session - 图谱推理任务会话表
sql
CREATE TABLE `kg_reason_session` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`project_id` bigint(20) unsigned NOT NULL COMMENT '项目ID',
`user_id` bigint(20) unsigned NOT NULL COMMENT '字段已废弃',
`name` varchar(1024) NOT NULL COMMENT '会话名称',
`description` longtext DEFAULT NULL COMMENT '会话描述',
`gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`gmt_modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`user_no` varchar(255) DEFAULT NULL COMMENT '用户工号',
`type` varchar(64) NOT NULL DEFAULT 'NORMAL' COMMENT '会话类型:DEBUG、NORMAL',
PRIMARY KEY(`id`),
KEY `idx_project_id`(`project_id`, `id`)
) DEFAULT CHARSET = utf8mb4 COMMENT = '图谱推理任务会话表';kg_reason_task - 图谱推理任务表
sql
CREATE TABLE `kg_reason_task` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`project_id` bigint(20) unsigned NOT NULL,
`user_id` bigint(20) unsigned NOT NULL COMMENT '字段已废弃',
`session_id` bigint(20) unsigned NOT NULL COMMENT '会话ID',
`gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`gmt_modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`mark` varchar(16) DEFAULT 'NULL' COMMENT '收藏状态',
`status` varchar(32) DEFAULT NULL COMMENT '状态:SUCCESS、FAILED、RUNNING',
`dsl` longtext DEFAULT NULL COMMENT 'KGDSL执行语句',
`nl` longtext DEFAULT NULL COMMENT '自然语言查询',
`params` longtext DEFAULT NULL COMMENT '参数(JSON)',
`result_message` longtext DEFAULT NULL COMMENT '执行结果或错误信息',
`result_table` longtext DEFAULT NULL COMMENT '执行结果:表格数据(JSON)',
`result_nodes` longtext DEFAULT NULL COMMENT '执行结果:点数据(JSON)',
`result_edges` longtext DEFAULT NULL COMMENT '执行结果:边数据(JSON)',
`result_paths` longtext DEFAULT NULL COMMENT '执行结果:路径数据(JSON)',
`user_no` varchar(255) DEFAULT NULL COMMENT '用户工号',
`reaction_type` varchar(64) DEFAULT NULL COMMENT '反应类型:UP、DOWN',
PRIMARY KEY(`id`),
KEY `idx_session_id_id`(`session_id`, `id`)
) DEFAULT CHARSET = utf8mb4 COMMENT = '图谱推理任务表';推理任务示例:
sql
INSERT INTO kg_reason_task
(project_id, session_id, status, dsl, nl)
VALUES
(1, 100, 'SUCCESS',
'Define (s:Person)-[p:worksAt]->(o:Company)',
'查询所有人物的工作单位');2.2.5 用户和权限表
kg_user - 用户管理表
sql
CREATE TABLE `kg_user` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`gmt_modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`user_no` varchar(255) NOT NULL COMMENT '用户工号',
`token` varchar(255) NOT NULL COMMENT 'token',
`last_token` varchar(255) DEFAULT NULL COMMENT '修改前token',
`salt` varchar(255) NOT NULL COMMENT '随机字符串',
`gmt_last_token_disable` timestamp NULL DEFAULT NULL COMMENT 'token修改时间',
`dw_access_id` varchar(32) DEFAULT NULL COMMENT '数仓用户ID',
`dw_access_key` varchar(64) DEFAULT NULL COMMENT '数仓用户密钥',
`real_name` varchar(50) DEFAULT NULL COMMENT '用户真名',
`nick_name` varchar(50) DEFAULT NULL COMMENT '用户花名',
`email` varchar(64) DEFAULT NULL COMMENT '用户邮箱',
`domain_account` varchar(64) DEFAULT NULL COMMENT '用户域账号',
`mobile` varchar(64) DEFAULT NULL COMMENT '用户手机号',
`wx_account` varchar(64) DEFAULT NULL COMMENT '用户微信账号',
`config` text DEFAULT NULL COMMENT '配置(JSON)',
PRIMARY KEY(`id`),
UNIQUE KEY `uk_userNo`(`user_no`),
UNIQUE KEY `uk_token`(`token`),
UNIQUE KEY `uk_domain_account`(`domain_account`)
) DEFAULT CHARSET = utf8mb4 COMMENT = '用户管理表';默认用户:
sql
INSERT INTO kg_user
(user_no, token, salt, real_name, nick_name, domain_account)
VALUES
('openspg', '075Df6275475a739', 'Ktu4O', 'openspg', 'openspg', 'openspg');kg_role - 平台角色表
sql
CREATE TABLE `kg_role` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`gmt_modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`role_name` varchar(255) NOT NULL COMMENT '角色名',
`permission_detail` text DEFAULT NULL COMMENT '角色权限详情(JSON)',
PRIMARY KEY(`id`),
UNIQUE KEY `uk_role_name`(`role_name`)
) DEFAULT CHARSET = utf8mb4 COMMENT = '平台角色表';角色定义:
sql
INSERT INTO kg_role (id, role_name, permission_detail) VALUES
(1, 'SUPER', ''), -- 超级管理员
(2, 'OWNER', ''), -- 项目所有者
(3, 'MEMBER', ''); -- 项目成员kg_resource_permission - 资源权限表
sql
CREATE TABLE `kg_resource_permission` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`gmt_modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`user_no` varchar(255) NOT NULL COMMENT '用户工号',
`resource_id` bigint(20) NOT NULL COMMENT '资源ID',
`role_id` bigint(20) NOT NULL COMMENT '角色ID',
`resource_tag` varchar(50) NOT NULL DEFAULT 'TYPE' COMMENT '资源分类:TYPE、PROJECT',
`status` varchar(2) NOT NULL DEFAULT '99' COMMENT '状态:-1-驳回, 99-审批中, 1-有效, 9-删除',
`expire_date` date DEFAULT NULL COMMENT '过期日期',
PRIMARY KEY(`id`),
UNIQUE KEY `uk_unique`(`user_no`, `resource_id`, `resource_tag`),
KEY `idx_resource`(`resource_id`, `role_id`)
) DEFAULT CHARSET = utf8mb4 COMMENT = '资源权限表';2.2.6 配置和数据源表
kg_config - 图谱配置表
sql
CREATE TABLE `kg_config` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`gmt_modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`project_id` varchar(64) NOT NULL COMMENT '项目ID',
`config_name` varchar(64) NOT NULL COMMENT '配置名称',
`config_id` varchar(128) NOT NULL COMMENT '配置ID',
`version` varchar(64) NOT NULL DEFAULT '1' COMMENT '配置版本',
`config` longtext NOT NULL COMMENT '配置内容(JSON)',
`status` int(11) NOT NULL DEFAULT '1' COMMENT '状态:1-有效',
`description` varchar(1024) DEFAULT NULL COMMENT '版本描述',
`resource_id` varchar(128) DEFAULT NULL COMMENT '资源ID',
`resource_type` varchar(128) DEFAULT 'CONFIG' COMMENT '资源类型',
`user_no` varchar(64) NOT NULL COMMENT '创建者',
PRIMARY KEY(`id`),
UNIQUE KEY `uk_configidversion`(`config_id`, `version`),
KEY `idx_projectid`(`project_id`)
) DEFAULT CHARSET = utf8mb4 COMMENT = '图谱配置表';kg_data_source - 数据源管理表
sql
CREATE TABLE `kg_data_source`(
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`gmt_create` timestamp NOT NULL DEFAULT current_timestamp(),
`gmt_modified` timestamp NOT NULL DEFAULT current_timestamp() on update current_timestamp(),
`create_user` varchar(32) NOT NULL DEFAULT 'system' COMMENT '创建用户',
`update_user` varchar(32) NOT NULL DEFAULT 'system' COMMENT '修改用户',
`status` varchar(64) NOT NULL DEFAULT 'ENABLE' COMMENT '状态:ENABLE、DISABLE',
`remark` varchar(1024) DEFAULT NULL COMMENT '描述',
`type` varchar(64) NOT NULL DEFAULT 'MYSQL' COMMENT '数据源类型:MYSQL、POSTGRESQL、ORACLE',
`db_name` varchar(256) NOT NULL COMMENT '数据源名称',
`db_url` varchar(1024) NOT NULL COMMENT '数据库URL',
`db_user` varchar(128) DEFAULT NULL COMMENT '数据源用户名',
`db_password` varchar(128) DEFAULT NULL COMMENT '数据源密码',
`db_driver_name` varchar(128) DEFAULT NULL COMMENT '数据源驱动',
`category` varchar(64) DEFAULT NULL COMMENT '数据源类别',
`connection_info` longtext DEFAULT NULL COMMENT '连接配置信息',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_db_name` (`db_name`)
) DEFAULT CHARSET=utf8mb4 COMMENT='数据源管理表';kg_retrieval - 索引类配置表
sql
CREATE TABLE `kg_retrieval` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`gmt_create` timestamp NOT NULL DEFAULT current_timestamp(),
`gmt_modified` timestamp NOT NULL DEFAULT current_timestamp() on update current_timestamp(),
`create_user` varchar(32) NOT NULL DEFAULT 'system',
`update_user` varchar(32) NOT NULL DEFAULT 'system',
`type` varchar(64) NOT NULL DEFAULT 'KAG' COMMENT '类型',
`status` varchar(64) NOT NULL DEFAULT 'ENABLE' COMMENT '状态',
`is_default` varchar(8) NOT NULL DEFAULT 'N' COMMENT '是否默认:Y、N',
`name` varchar(128) NOT NULL COMMENT '名称',
`chinese_name` varchar(128) DEFAULT NULL COMMENT '中文名称',
`schema_desc` longtext DEFAULT NULL COMMENT 'Schema描述',
`scenarios_desc` longtext DEFAULT NULL COMMENT '应用场景描述',
`cost_desc` longtext DEFAULT NULL COMMENT '成本描述',
`method_desc` longtext DEFAULT NULL COMMENT '索引方法描述',
`extractor_desc` longtext DEFAULT NULL COMMENT '索引抽取描述',
`retriever_desc` longtext DEFAULT NULL COMMENT '索引召回描述',
`module_path` varchar(128) NOT NULL DEFAULT '' COMMENT '索引类路径',
`class_name` varchar(128) NOT NULL DEFAULT '' COMMENT '索引类名称',
`method` varchar(128) NOT NULL DEFAULT '' COMMENT '索引类方法',
`extension` longtext DEFAULT NULL COMMENT '扩展信息',
`config` longtext DEFAULT NULL COMMENT '配置信息',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_name` (`name`)
) DEFAULT CHARSET=utf8mb4 COMMENT='索引类配置表';2.2.7 LLM模型配置表
kg_model_provider - 模型供应商表
sql
CREATE TABLE `kg_model_provider` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`gmt_modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`name` varchar(32) NOT NULL COMMENT '名称',
`provider` varchar(32) NOT NULL COMMENT '供应商英文名称',
`status` varchar(32) NOT NULL COMMENT '状态:0-禁用, 1-启用',
`page_mode` varchar(32) NOT NULL COMMENT '添加模型模式:ALL、SINGLE',
`model_type` varchar(255) NOT NULL COMMENT '支持模型类型(逗号分隔)',
`logo` varchar(255) NOT NULL COMMENT '图标',
`tags` varchar(255) NOT NULL COMMENT '标签',
`params` longtext NOT NULL COMMENT '供应商参数(JSON)',
`creator` varchar(64) NOT NULL,
`modifier` varchar(64) NOT NULL,
PRIMARY KEY(`id`),
UNIQUE KEY `uk_provider`(`provider`)
) DEFAULT CHARSET = utf8mb4 COMMENT = '模型供应商表';供应商示例:
sql
INSERT INTO kg_model_provider (name, provider, status, page_mode, model_type, logo, tags) VALUES
('OpenAI', 'OpenAI', '1', 'SINGLE', 'chat,embedding', '/img/logo/openai.png', 'LLM,TEXT EMBEDDING'),
('Ollama', 'Ollama', '1', 'SINGLE', 'chat,embedding', '/img/logo/ollama.png', 'LLM,TEXT EMBEDDING');kg_user_model - 用户模型表
sql
CREATE TABLE `kg_user_model` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`gmt_modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`instance_id` varchar(64) NOT NULL COMMENT '实例ID',
`visibility` varchar(32) NOT NULL COMMENT '可见性:PUBLIC_READ、PRIVATE',
`provider` varchar(32) NOT NULL COMMENT '供应商英文名称',
`name` varchar(64) NOT NULL COMMENT '唯一名称',
`config` longtext DEFAULT NULL COMMENT '模型配置(JSON)',
`creator` varchar(64) NOT NULL DEFAULT 'system',
`modifier` varchar(64) NOT NULL DEFAULT 'system',
PRIMARY KEY(`id`),
UNIQUE KEY `uk_instanceid`(`instance_id`)
) DEFAULT CHARSET = utf8mb4 COMMENT = '用户模型表';2.3 表关系图
┌──────────────────────┐
│ kg_project_info │◄──┐
│ (项目信息) │ │
└──────────┬───────────┘ │
│ │
│ project_id │ project_id
▼ │
┌──────────────────────┐ │
│ kg_project_entity │ │
│ (项目类型关联) │ │
└──────────┬───────────┘ │
│ entity_id │
▼ │
┌──────────────────────┐ │
│ kg_ontology_entity │ │
│ (本体类型) │ │
└──────────┬───────────┘ │
│ id │
▼ │
┌────────────────────────────────────────┐
│ kg_ontology_entity_property_range │
│ (SPO三元组: domain_id -> property -> range_id) │
└────────────────────────────────────────┘
│
▼
┌──────────────────────┐
│ kg_ontology_property│
│ _constraint │
│ (属性约束) │
└──────────────────────┘
┌──────────────────────┐
│ kg_builder_job │
│ (构建任务) │───┐
└──────────┬───────────┘ │ project_id
│ │
▼ │
┌──────────────────────┐ │
│ kg_scheduler_job │◄──┘
│ (调度任务) │
└──────────┬───────────┘
│ job_id
▼
┌──────────────────────┐
│ kg_scheduler_ │
│ instance │
│ (调度实例) │
└──────────┬───────────┘
│ instance_id
▼
┌──────────────────────┐
│ kg_scheduler_task │
│ (调度作业节点) │
└──────────────────────┘2.4 常用查询SQL
查询项目的所有类型
sql
SELECT
e.id,
e.name,
e.name_zh,
e.entity_category,
e.version,
e.version_status
FROM kg_project_entity pe
JOIN kg_ontology_entity e ON pe.entity_id = e.id
WHERE pe.project_id = 1
AND pe.version_status = 'ONLINE'
AND e.status = '1';查询类型的所有属性和关系
sql
-- 查询Person类型的所有属性
SELECT
epr.property_name,
epr.property_name_zh,
epr.property_category,
range_entity.name as range_type,
epr.index_type,
c.name as constraint_name
FROM kg_ontology_entity_property_range epr
JOIN kg_ontology_entity domain_entity ON epr.domain_id = domain_entity.id
JOIN kg_ontology_entity range_entity ON epr.range_id = range_entity.id
LEFT JOIN kg_ontology_property_constraint c ON epr.constraint_id = c.id
WHERE domain_entity.name = 'Person'
AND epr.version_status = 'ONLINE'
AND epr.status = '1';查询类型的继承层次
sql
-- 查询Person类型的继承路径
SELECT
child.name as child_type,
parent.name as parent_type,
ep.path,
ep.deep_inherit
FROM kg_ontology_entity_parent ep
JOIN kg_ontology_entity child ON ep.entity_id = child.id
JOIN kg_ontology_entity parent ON ep.parent_id = parent.id
WHERE child.name = 'Person'
AND ep.status = '1';查询构建任务状态
sql
SELECT
j.id,
j.job_name,
j.status,
j.type,
j.data_source_type,
j.gmt_create,
j.gmt_modified
FROM kg_builder_job j
WHERE j.project_id = 1
ORDER BY j.gmt_create DESC
LIMIT 10;查询推理任务历史
sql
SELECT
t.id,
t.nl,
t.dsl,
t.status,
t.result_message,
t.gmt_create
FROM kg_reason_task t
WHERE t.project_id = 1
AND t.session_id = 100
ORDER BY t.gmt_create DESC;3. 图数据库存储
3.1 Neo4j存储结构
OpenSPG将知识图谱数据存储在Neo4j/TuGraph图数据库中。
3.1.1 节点Label命名规范
{namespace}_{TypeName}
示例:
- DEFAULT_Person
- DEFAULT_Company
- medical_Disease3.1.2 关系Type命名规范
{relationName}
示例:
- worksAt
- foundedBy
- hasSymptom3.1.3 Neo4j Schema同步
当Schema在MySQL中发布后,PostProcessStage会自动将Schema同步到Neo4j:
cypher
-- 1. 创建节点唯一约束
CREATE CONSTRAINT IF NOT EXISTS
FOR (n:DEFAULT_Person)
REQUIRE n.id IS UNIQUE;
-- 2. 创建属性索引
CREATE INDEX IF NOT EXISTS
FOR (n:DEFAULT_Person)
ON (n.name);
-- 3. 创建全文索引
CREATE FULLTEXT INDEX IF NOT EXISTS person_fulltext
FOR (n:DEFAULT_Person)
ON EACH [n.name, n.description];3.1.4 数据写入示例
cypher
-- 创建Person节点
CREATE (p:DEFAULT_Person {
id: 'P001',
name: '张三',
age: 30,
email: 'zhangsan@example.com'
});
-- 创建Company节点
CREATE (c:DEFAULT_Company {
id: 'C001',
name: '阿里巴巴',
foundYear: '1999',
industry: '电子商务'
});
-- 创建worksAt关系
MATCH (p:DEFAULT_Person {id: 'P001'})
MATCH (c:DEFAULT_Company {id: 'C001'})
CREATE (p)-[:worksAt {
startDate: '2020-01-01',
position: '高级工程师'
}]->(c);3.2 TuGraph存储结构
TuGraph使用Vertex Label和Edge Label定义Schema:
json
// Vertex Label
{
"label": "DEFAULT_Person",
"type": "VERTEX",
"properties": [
{"name": "id", "type": "STRING", "primary": true},
{"name": "name", "type": "STRING", "index": true},
{"name": "age", "type": "INT32"},
{"name": "email", "type": "STRING"}
]
}
// Edge Label
{
"label": "worksAt",
"type": "EDGE",
"constraints": [
["DEFAULT_Person", "DEFAULT_Company"]
],
"properties": [
{"name": "startDate", "type": "STRING"},
{"name": "position", "type": "STRING"}
]
}3.3 Elasticsearch索引
对于需要全文检索的属性,OpenSPG会在Elasticsearch中创建索引:
json
PUT /default_person_idx
{
"mappings": {
"properties": {
"id": {"type": "keyword"},
"name": {
"type": "text",
"analyzer": "ik_max_word",
"fields": {
"keyword": {"type": "keyword"}
}
},
"age": {"type": "integer"},
"email": {"type": "keyword"},
"description": {
"type": "text",
"analyzer": "ik_smart"
},
"embedding": {
"type": "dense_vector",
"dims": 768,
"index": true,
"similarity": "cosine"
}
}
}
}4. 数据流转
4.1 完整数据流
┌─────────────────────────────────────────────────────────┐
│ 数据流转全景图 │
└─────────────────────────────────────────────────────────┘
1. Schema定义阶段
┌──────────────┐
│ Schema DSL │
│ 或 Java API │
└──────┬───────┘
│
▼
┌──────────────┐
│ SchemaManager│ ──Parse──▶ SchemaModel
│ │ ──Validate──▶ Constraints Check
└──────┬───────┘ ──Inherit──▶ Property Merging
│
▼
┌─────────────────────────────────────┐
│ MySQL: kg_ontology_entity │
│ kg_ontology_entity_property_range │
└──────┬──────────────────────────────┘
│ 同步
▼
┌─────────────────────────────────────┐
│ Neo4j: CREATE CONSTRAINT/INDEX │
└─────────────────────────────────────┘
2. 数据构建阶段
┌──────────────┐
│ 数据源 │ (CSV、JSON、DB、Markdown)
└──────┬───────┘
│
▼
┌──────────────┐
│ SourceReader │ ──Read──▶ BuilderRecord[]
└──────┬───────┘
│
▼
┌──────────────┐
│ Processor │ ──Map──▶ EntityRecord, RelationRecord
│ Chain │ ──Extract──▶ SubGraphRecord (LLM)
└──────┬───────┘ ──Transform──▶ Python Processing
│
▼
┌──────────────┐
│ SinkWriter │ ──Write──▶ Neo4j/TuGraph
└──────┬───────┘ ──Index──▶ Elasticsearch
│
▼
┌─────────────────────────────────────┐
│ 知识图谱数据层 │
│ • 实体节点 (Entities) │
│ • 关系边 (Relations) │
│ • 属性值 (Properties) │
└─────────────────────────────────────┘
3. 推理查询阶段
┌──────────────┐
│ KGDSL Query │
└──────┬───────┘
│
▼
┌──────────────┐
│ KGDSL Parser │ ──Parse──▶ LogicalPlan
└──────┬───────┘ ──Optimize──▶ PhysicalPlan
│
▼
┌──────────────┐
│ Reasoner │ ──Execute──▶ Neo4j Cypher Query
│ Engine │ ──Compute──▶ Rule Inference
└──────┬───────┘
│
▼
┌─────────────────────────────────────┐
│ MySQL: kg_reason_task │
│ (保存查询历史和结果) │
└─────────────────────────────────────┘
│
▼
┌──────────────┐
│ 查询结果 │ (表格、图、路径)
└──────────────┘4.2 Schema同步流程
Schema定义/修改
↓
SchemaAlterPipeline
├── PreProcessStage: 验证和继承
├── ProcessStage: 持久化到MySQL
└── PostProcessStage: 同步到图存储
│
├──▶ GraphStoreSyncer
│ ├── CREATE CONSTRAINT (Neo4j)
│ ├── CREATE INDEX (Neo4j)
│ └── ALTER SCHEMA (TuGraph)
│
└──▶ SearchEngineSyncer
└── PUT Mapping (Elasticsearch)4.3 数据构建流程
原始数据 (CSV/JSON/Text)
↓
Source Reader
↓
BuilderRecord[] (KV格式)
↓
SPG Type Mapping
↓
EntityRecord[] / RelationRecord[]
↓
Optional: Python Processing / LLM Extraction
↓
GraphStore Writer
↓
知识图谱 (Neo4j/TuGraph)
↓
同步索引到Elasticsearch (如果配置了索引)5. 使用指南
5.1 初始化数据库
bash
# 1. 创建数据库
mysql -u root -p -e "CREATE DATABASE openspg CHARACTER SET utf8mb4;"
# 2. 执行初始化脚本
mysql -u root -p openspg < /path/to/openspg-initdb.sql
mysql -u root -p openspg < /path/to/initdb.sql
# 3. 验证表创建
mysql -u root -p openspg -e "SHOW TABLES;"5.2 配置数据库连接
在application.yml中配置:
yaml
spring:
datasource:
url: jdbc:mysql://localhost:3306/openspg?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
username: root
password: your_password
driver-class-name: com.mysql.cj.jdbc.Driver5.3 Java代码访问示例
查询项目Schema
java
// 查询项目的所有SPG类型
String sql = """
SELECT
e.id, e.name, e.name_zh, e.entity_category
FROM kg_project_entity pe
JOIN kg_ontology_entity e ON pe.entity_id = e.id
WHERE pe.project_id = ?
AND pe.version_status = 'ONLINE'
AND e.status = '1'
""";
List<Map<String, Object>> types = jdbcTemplate.queryForList(sql, projectId);查询类型的属性
java
String sql = """
SELECT
epr.property_name,
epr.property_name_zh,
range_entity.name as range_type,
epr.index_type
FROM kg_ontology_entity_property_range epr
JOIN kg_ontology_entity domain ON epr.domain_id = domain.id
JOIN kg_ontology_entity range_entity ON epr.range_id = range_entity.id
WHERE domain.name = ?
AND epr.version_status = 'ONLINE'
""";
List<Map<String, Object>> properties = jdbcTemplate.queryForList(sql, "Person");5.4 数据库备份
bash
# 备份整个数据库
mysqldump -u root -p openspg > openspg_backup_$(date +%Y%m%d).sql
# 只备份Schema表
mysqldump -u root -p openspg \
kg_ontology_entity \
kg_ontology_entity_parent \
kg_ontology_entity_property_range \
kg_ontology_property_constraint \
> openspg_schema_backup.sql
# 恢复数据库
mysql -u root -p openspg < openspg_backup_20231213.sql5.5 性能优化建议
索引优化
- 已有的索引都很合理,保持即可
- 如果有自定义查询,考虑添加联合索引
查询优化
sql-- 使用EXPLAIN分析查询计划 EXPLAIN SELECT * FROM kg_ontology_entity WHERE name = 'Person'; -- 避免全表扫描 -- ❌ 不好 SELECT * FROM kg_ontology_entity_property_range WHERE property_name LIKE '%age%'; -- ✅ 好 SELECT * FROM kg_ontology_entity_property_range WHERE property_name = 'age';定期维护
sql-- 分析表以更新统计信息 ANALYZE TABLE kg_ontology_entity; -- 优化表碎片 OPTIMIZE TABLE kg_ontology_entity_property_range;
5.6 常见问题
Q1: 如何查看某个项目的Schema版本历史?
sql
SELECT
version,
description,
status,
user_no,
gmt_create
FROM kg_ontology_release
WHERE project_id = 1
ORDER BY version DESC;Q2: 如何查询类型的完整定义(包括继承的属性)?
sql
-- 需要递归查询继承链,建议使用SchemaManager的Java API
ProjectSchema schema = schemaManager.getProjectSchema(projectId);
BaseSPGType type = schema.getByName("Person");
List<Property> allProperties = type.getProperties(); // 包含继承属性Q3: 数据库存储了Schema,图数据库存储了什么?
- MySQL: 存储Schema定义(元数据)、任务配置、推理历史
- Neo4j/TuGraph: 存储知识图谱数据(实体节点、关系边、属性值)
附录
A. 表索引统计
| 表名 | 行数估计 | 索引数 | 备注 |
|---|---|---|---|
| kg_ontology_entity | 1,000 - 10,000 | 4 | 类型定义 |
| kg_ontology_entity_property_range | 10,000 - 100,000 | 5 | SPO三元组 |
| kg_project_info | 10 - 100 | 2 | 项目信息 |
| kg_builder_job | 1,000 - 10,000 | 2 | 构建任务 |
| kg_reason_task | 10,000 - 1,000,000 | 3 | 推理查询历史 |
B. 字段命名规范
id: 主键gmt_create: 创建时间(GMT)gmt_modified: 修改时间(GMT)status: 状态字段version: 版本号config: JSON配置extension: 扩展信息(JSON)
C. 参考资源
- 数据库DDL:
/dev/release/mysql/sql/openspg-initdb.sql - Java实体类:
server/core/schema/model/src/main/java/ - MyBatis Mapper:
server/infra/dao/src/main/resources/mapper/
版本信息
- 文档版本: 1.0
- OpenSPG版本: 0.8
- 数据库版本: MySQL 5.7+
- 最后更新: 2025-12-13
许可证
本文档基于 Apache License 2.0 开源协议。