Skip to content

OpenSPG 数据库 Schema 文档 ​

目录 ​


1. 存储架构概述 ​

1.1 双层存储设计 ​

┌─────────────────────────────────────────────────────────────────┐
│                     OpenSPG 存储架构                              │
├─────────────────────────────────────────────────────────────────┤
│                                                                   │
│  ┌───────────────────────┐         ┌──────────────────────┐    │
│  │  MySQL关系型数据库     │         │   图数据库            │    │
│  │  (元数据层)            │         │   (数据层)           │    │
│  ├───────────────────────┤         ├──────────────────────┤    │
│  │ • Schema定义           │         │ • 实体节点           │    │
│  │ • 项目信息             │  同步   │ • 关系边             │    │
│  │ • 构建任务             │ ────▶  │ • 属性值             │    │
│  │ • 推理任务             │         │ • 索引               │    │
│  │ • 用户权限             │         │                      │    │
│  │ • 调度配置             │         │ Neo4j / TuGraph      │    │
│  └───────────────────────┘         └──────────────────────┘    │
│                                                                   │
└─────────────────────────────────────────────────────────────────┘

1.2 存储职责划分 ​

存储层职责技术选型
MySQLSchema元数据管理、任务调度、权限控制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: 项目命名空间,用于隔离不同项目的Schema
  • config: 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 -> Thing
kg_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_Disease

3.1.2 关系Type命名规范 ​

{relationName}

示例:
- worksAt
- foundedBy
- hasSymptom

3.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.Driver

5.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.sql

5.5 性能优化建议 ​

  1. 索引优化

    • 已有的索引都很合理,保持即可
    • 如果有自定义查询,考虑添加联合索引
  2. 查询优化

    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';
  3. 定期维护

    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_entity1,000 - 10,0004类型定义
kg_ontology_entity_property_range10,000 - 100,0005SPO三元组
kg_project_info10 - 1002项目信息
kg_builder_job1,000 - 10,0002构建任务
kg_reason_task10,000 - 1,000,0003推理查询历史

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 开源协议。