|
@@ -1,509 +1,493 @@
|
|
|
-- =====================================================
|
|
-- =====================================================
|
|
|
--- 灵越智报 v2.0 数据库初始化脚本(单文件)
|
|
|
|
|
--- PostgreSQL 15+
|
|
|
|
|
--- 包含所有表结构,不含 graph_nodes / graph_relations(已移除)
|
|
|
|
|
|
|
+-- 灵越智报 2.0 数据库初始化脚本
|
|
|
|
|
+-- PostgreSQL 15+ / pgvector
|
|
|
|
|
+-- 设计参考: a_docs/数据库设计文档.md
|
|
|
-- =====================================================
|
|
-- =====================================================
|
|
|
|
|
|
|
|
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
|
|
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
|
|
|
CREATE EXTENSION IF NOT EXISTS vector;
|
|
CREATE EXTENSION IF NOT EXISTS vector;
|
|
|
|
|
|
|
|
--- ============================================ 一、基础模块 ============================================
|
|
|
|
|
-
|
|
|
|
|
|
|
+-- ==================== 用户表 ====================
|
|
|
CREATE TABLE IF NOT EXISTS users (
|
|
CREATE TABLE IF NOT EXISTS users (
|
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
|
- username VARCHAR(50) UNIQUE NOT NULL,
|
|
|
|
|
- email VARCHAR(100) UNIQUE NOT NULL,
|
|
|
|
|
|
|
+ username VARCHAR(50) NOT NULL UNIQUE,
|
|
|
|
|
+ email VARCHAR(100) UNIQUE,
|
|
|
password_hash VARCHAR(255) NOT NULL,
|
|
password_hash VARCHAR(255) NOT NULL,
|
|
|
|
|
+ display_name VARCHAR(100),
|
|
|
avatar_url VARCHAR(500),
|
|
avatar_url VARCHAR(500),
|
|
|
- role VARCHAR(20) NOT NULL DEFAULT 'user',
|
|
|
|
|
- preferences TEXT DEFAULT '{}',
|
|
|
|
|
|
|
+ role VARCHAR(20) DEFAULT 'user',
|
|
|
|
|
+ preferences JSONB DEFAULT '{}',
|
|
|
|
|
+ is_active BOOLEAN DEFAULT TRUE,
|
|
|
last_login_at TIMESTAMP,
|
|
last_login_at TIMESTAMP,
|
|
|
create_by VARCHAR(36),
|
|
create_by VARCHAR(36),
|
|
|
create_by_name VARCHAR(100),
|
|
create_by_name VARCHAR(100),
|
|
|
- create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
|
|
|
+ create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
|
update_by VARCHAR(36),
|
|
update_by VARCHAR(36),
|
|
|
update_by_name VARCHAR(100),
|
|
update_by_name VARCHAR(100),
|
|
|
- update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
|
|
|
|
|
+ update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
|
);
|
|
);
|
|
|
CREATE INDEX IF NOT EXISTS idx_users_username ON users(username);
|
|
CREATE INDEX IF NOT EXISTS idx_users_username ON users(username);
|
|
|
CREATE INDEX IF NOT EXISTS idx_users_email ON users(email);
|
|
CREATE INDEX IF NOT EXISTS idx_users_email ON users(email);
|
|
|
|
|
|
|
|
|
|
+-- ==================== 文档表 ====================
|
|
|
CREATE TABLE IF NOT EXISTS documents (
|
|
CREATE TABLE IF NOT EXISTS documents (
|
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
|
user_id VARCHAR(36) NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
user_id VARCHAR(36) NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
|
name VARCHAR(255) NOT NULL,
|
|
name VARCHAR(255) NOT NULL,
|
|
|
- type VARCHAR(20) NOT NULL,
|
|
|
|
|
- status VARCHAR(20) NOT NULL DEFAULT 'pending',
|
|
|
|
|
|
|
+ file_name VARCHAR(500) NOT NULL,
|
|
|
|
|
+ file_path VARCHAR(500) NOT NULL,
|
|
|
file_size BIGINT,
|
|
file_size BIGINT,
|
|
|
- file_url VARCHAR(500),
|
|
|
|
|
- thumbnail_url VARCHAR(500),
|
|
|
|
|
|
|
+ file_type VARCHAR(20) NOT NULL,
|
|
|
|
|
+ status VARCHAR(20) DEFAULT 'uploaded',
|
|
|
parsed_text TEXT,
|
|
parsed_text TEXT,
|
|
|
- parse_status VARCHAR(20),
|
|
|
|
|
- parse_progress INTEGER DEFAULT 0,
|
|
|
|
|
- parse_error TEXT,
|
|
|
|
|
- parse_started_at TIMESTAMP,
|
|
|
|
|
- parse_completed_at TIMESTAMP,
|
|
|
|
|
|
|
+ page_count INT,
|
|
|
|
|
+ word_count INT,
|
|
|
|
|
+ entity_count INT DEFAULT 0,
|
|
|
|
|
+ relation_count INT DEFAULT 0,
|
|
|
|
|
+ rule_count INT DEFAULT 0,
|
|
|
metadata JSONB DEFAULT '{}',
|
|
metadata JSONB DEFAULT '{}',
|
|
|
- structured_status VARCHAR(20) DEFAULT 'pending',
|
|
|
|
|
- image_count INT DEFAULT 0,
|
|
|
|
|
- table_count INT DEFAULT 0,
|
|
|
|
|
- element_count INT DEFAULT 0,
|
|
|
|
|
|
|
+ del_flag BOOLEAN DEFAULT FALSE,
|
|
|
create_by VARCHAR(36),
|
|
create_by VARCHAR(36),
|
|
|
- create_by_name VARCHAR(100),
|
|
|
|
|
- create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
|
|
|
+ create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
|
update_by VARCHAR(36),
|
|
update_by VARCHAR(36),
|
|
|
- update_by_name VARCHAR(100),
|
|
|
|
|
- update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
|
|
|
|
|
+ update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
|
);
|
|
);
|
|
|
-CREATE INDEX IF NOT EXISTS idx_documents_user_id ON documents(user_id);
|
|
|
|
|
|
|
+CREATE INDEX IF NOT EXISTS idx_documents_user ON documents(user_id);
|
|
|
|
|
+CREATE INDEX IF NOT EXISTS idx_documents_type ON documents(file_type);
|
|
|
CREATE INDEX IF NOT EXISTS idx_documents_status ON documents(status);
|
|
CREATE INDEX IF NOT EXISTS idx_documents_status ON documents(status);
|
|
|
-CREATE INDEX IF NOT EXISTS idx_documents_type ON documents(type);
|
|
|
|
|
-CREATE INDEX IF NOT EXISTS idx_documents_created_at ON documents(create_time DESC);
|
|
|
|
|
-CREATE INDEX IF NOT EXISTS idx_documents_metadata ON documents USING GIN(metadata);
|
|
|
|
|
|
|
|
|
|
-CREATE TABLE IF NOT EXISTS elements (
|
|
|
|
|
|
|
+-- ==================== 文档章节结构表 ====================
|
|
|
|
|
+CREATE TABLE IF NOT EXISTS document_sections (
|
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
|
document_id VARCHAR(36) NOT NULL REFERENCES documents(id) ON DELETE CASCADE,
|
|
document_id VARCHAR(36) NOT NULL REFERENCES documents(id) ON DELETE CASCADE,
|
|
|
- user_id VARCHAR(36) NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
|
|
|
- type VARCHAR(20) NOT NULL,
|
|
|
|
|
- label VARCHAR(100) NOT NULL,
|
|
|
|
|
- value TEXT NOT NULL,
|
|
|
|
|
- position JSONB,
|
|
|
|
|
- confidence DECIMAL(3,2),
|
|
|
|
|
- extraction_method VARCHAR(20),
|
|
|
|
|
|
|
+ parent_id VARCHAR(36) REFERENCES document_sections(id) ON DELETE CASCADE,
|
|
|
|
|
+ section_index INT NOT NULL,
|
|
|
|
|
+ level INT NOT NULL DEFAULT 1,
|
|
|
|
|
+ title VARCHAR(500),
|
|
|
|
|
+ content TEXT,
|
|
|
|
|
+ start_page INT,
|
|
|
|
|
+ end_page INT,
|
|
|
|
|
+ start_char INT,
|
|
|
|
|
+ end_char INT,
|
|
|
|
|
+ section_type VARCHAR(32) DEFAULT 'heading',
|
|
|
|
|
+ table_data JSONB,
|
|
|
|
|
+ image_path VARCHAR(500),
|
|
|
|
|
+ image_caption VARCHAR(500),
|
|
|
metadata JSONB DEFAULT '{}',
|
|
metadata JSONB DEFAULT '{}',
|
|
|
- create_by VARCHAR(36),
|
|
|
|
|
- create_by_name VARCHAR(100),
|
|
|
|
|
- create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
|
- update_by VARCHAR(36),
|
|
|
|
|
- update_by_name VARCHAR(100),
|
|
|
|
|
- update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
|
|
|
|
|
+ sort_order INT DEFAULT 0,
|
|
|
|
|
+ create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
|
);
|
|
);
|
|
|
-CREATE INDEX IF NOT EXISTS idx_elements_document_id ON elements(document_id);
|
|
|
|
|
-CREATE INDEX IF NOT EXISTS idx_elements_user_id ON elements(user_id);
|
|
|
|
|
-CREATE INDEX IF NOT EXISTS idx_elements_type ON elements(type);
|
|
|
|
|
-CREATE INDEX IF NOT EXISTS idx_elements_position ON elements USING GIN(position);
|
|
|
|
|
|
|
+CREATE INDEX IF NOT EXISTS idx_doc_sections_document ON document_sections(document_id);
|
|
|
|
|
+CREATE INDEX IF NOT EXISTS idx_doc_sections_parent ON document_sections(parent_id);
|
|
|
|
|
+CREATE INDEX IF NOT EXISTS idx_doc_sections_level ON document_sections(level);
|
|
|
|
|
+CREATE INDEX IF NOT EXISTS idx_doc_sections_type ON document_sections(section_type);
|
|
|
|
|
|
|
|
-CREATE TABLE IF NOT EXISTS annotations (
|
|
|
|
|
|
|
+-- ==================== 文档分块表 ====================
|
|
|
|
|
+CREATE TABLE IF NOT EXISTS document_chunks (
|
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
|
document_id VARCHAR(36) NOT NULL REFERENCES documents(id) ON DELETE CASCADE,
|
|
document_id VARCHAR(36) NOT NULL REFERENCES documents(id) ON DELETE CASCADE,
|
|
|
- user_id VARCHAR(36) NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
|
|
|
- text TEXT NOT NULL,
|
|
|
|
|
- position JSONB NOT NULL,
|
|
|
|
|
- type VARCHAR(20) NOT NULL,
|
|
|
|
|
- suggestion TEXT,
|
|
|
|
|
- ai_generated BOOLEAN DEFAULT FALSE,
|
|
|
|
|
- confidence DECIMAL(3,2),
|
|
|
|
|
- status VARCHAR(20) DEFAULT 'pending',
|
|
|
|
|
- create_by VARCHAR(36),
|
|
|
|
|
- create_by_name VARCHAR(100),
|
|
|
|
|
- create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
|
- update_by VARCHAR(36),
|
|
|
|
|
- update_by_name VARCHAR(100),
|
|
|
|
|
- update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
|
|
|
-);
|
|
|
|
|
-CREATE INDEX IF NOT EXISTS idx_annotations_document_id ON annotations(document_id);
|
|
|
|
|
-CREATE INDEX IF NOT EXISTS idx_annotations_user_id ON annotations(user_id);
|
|
|
|
|
-CREATE INDEX IF NOT EXISTS idx_annotations_type ON annotations(type);
|
|
|
|
|
-CREATE INDEX IF NOT EXISTS idx_annotations_status ON annotations(status);
|
|
|
|
|
-
|
|
|
|
|
-CREATE TABLE IF NOT EXISTS graphs (
|
|
|
|
|
- id VARCHAR(36) PRIMARY KEY,
|
|
|
|
|
- document_id VARCHAR(36) NOT NULL REFERENCES documents(id) ON DELETE CASCADE,
|
|
|
|
|
- user_id VARCHAR(36) NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
|
|
|
- name VARCHAR(255) NOT NULL,
|
|
|
|
|
- nodes JSONB NOT NULL DEFAULT '[]',
|
|
|
|
|
- edges JSONB NOT NULL DEFAULT '[]',
|
|
|
|
|
- calculation_result JSONB,
|
|
|
|
|
- calculation_status VARCHAR(20),
|
|
|
|
|
|
|
+ section_id VARCHAR(36) REFERENCES document_sections(id) ON DELETE SET NULL,
|
|
|
|
|
+ chunk_index INT NOT NULL,
|
|
|
|
|
+ content TEXT NOT NULL,
|
|
|
|
|
+ start_char INT,
|
|
|
|
|
+ end_char INT,
|
|
|
|
|
+ page_number INT,
|
|
|
|
|
+ token_count INT,
|
|
|
metadata JSONB DEFAULT '{}',
|
|
metadata JSONB DEFAULT '{}',
|
|
|
- create_by VARCHAR(36),
|
|
|
|
|
- create_by_name VARCHAR(100),
|
|
|
|
|
- create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
|
- update_by VARCHAR(36),
|
|
|
|
|
- update_by_name VARCHAR(100),
|
|
|
|
|
- update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
|
|
|
|
|
+ create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
|
);
|
|
);
|
|
|
-CREATE INDEX IF NOT EXISTS idx_graphs_document_id ON graphs(document_id);
|
|
|
|
|
-CREATE INDEX IF NOT EXISTS idx_graphs_user_id ON graphs(user_id);
|
|
|
|
|
-CREATE INDEX IF NOT EXISTS idx_graphs_nodes ON graphs USING GIN(nodes);
|
|
|
|
|
-CREATE INDEX IF NOT EXISTS idx_graphs_edges ON graphs USING GIN(edges);
|
|
|
|
|
|
|
+CREATE INDEX IF NOT EXISTS idx_doc_chunks_document ON document_chunks(document_id);
|
|
|
|
|
+CREATE INDEX IF NOT EXISTS idx_doc_chunks_section ON document_chunks(section_id);
|
|
|
|
|
|
|
|
|
|
+-- ==================== 解析任务表(parse-service 依赖) ====================
|
|
|
CREATE TABLE IF NOT EXISTS parse_tasks (
|
|
CREATE TABLE IF NOT EXISTS parse_tasks (
|
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
|
document_id VARCHAR(36) NOT NULL REFERENCES documents(id) ON DELETE CASCADE,
|
|
document_id VARCHAR(36) NOT NULL REFERENCES documents(id) ON DELETE CASCADE,
|
|
|
- status VARCHAR(20) NOT NULL DEFAULT 'pending',
|
|
|
|
|
- progress INTEGER DEFAULT 0,
|
|
|
|
|
- current_step VARCHAR(100),
|
|
|
|
|
|
|
+ status VARCHAR(20) DEFAULT 'pending',
|
|
|
|
|
+ progress INT DEFAULT 0,
|
|
|
|
|
+ current_step VARCHAR(32),
|
|
|
error_message TEXT,
|
|
error_message TEXT,
|
|
|
options JSONB DEFAULT '{}',
|
|
options JSONB DEFAULT '{}',
|
|
|
started_at TIMESTAMP,
|
|
started_at TIMESTAMP,
|
|
|
completed_at TIMESTAMP,
|
|
completed_at TIMESTAMP,
|
|
|
parse_status VARCHAR(20) DEFAULT 'pending',
|
|
parse_status VARCHAR(20) DEFAULT 'pending',
|
|
|
- parse_progress INTEGER DEFAULT 0,
|
|
|
|
|
|
|
+ parse_progress INT DEFAULT 0,
|
|
|
rag_status VARCHAR(20) DEFAULT 'pending',
|
|
rag_status VARCHAR(20) DEFAULT 'pending',
|
|
|
- rag_progress INTEGER DEFAULT 0,
|
|
|
|
|
|
|
+ rag_progress INT DEFAULT 0,
|
|
|
structured_status VARCHAR(20) DEFAULT 'pending',
|
|
structured_status VARCHAR(20) DEFAULT 'pending',
|
|
|
- structured_progress INTEGER DEFAULT 0,
|
|
|
|
|
- structured_element_count INTEGER,
|
|
|
|
|
- structured_image_count INTEGER,
|
|
|
|
|
- structured_table_count INTEGER,
|
|
|
|
|
|
|
+ structured_progress INT DEFAULT 0,
|
|
|
|
|
+ structured_element_count INT,
|
|
|
|
|
+ structured_image_count INT,
|
|
|
|
|
+ structured_table_count INT,
|
|
|
ner_status VARCHAR(20) DEFAULT 'pending',
|
|
ner_status VARCHAR(20) DEFAULT 'pending',
|
|
|
- ner_progress INTEGER DEFAULT 0,
|
|
|
|
|
- ner_task_id VARCHAR(64),
|
|
|
|
|
- ner_entity_count INTEGER,
|
|
|
|
|
- ner_relation_count INTEGER,
|
|
|
|
|
- ner_message VARCHAR(255),
|
|
|
|
|
|
|
+ ner_progress INT DEFAULT 0,
|
|
|
|
|
+ ner_task_id VARCHAR(100),
|
|
|
|
|
+ ner_entity_count INT,
|
|
|
|
|
+ ner_relation_count INT,
|
|
|
|
|
+ ner_message TEXT,
|
|
|
graph_status VARCHAR(20) DEFAULT 'pending',
|
|
graph_status VARCHAR(20) DEFAULT 'pending',
|
|
|
- graph_progress INTEGER DEFAULT 0,
|
|
|
|
|
|
|
+ graph_progress INT DEFAULT 0,
|
|
|
create_by VARCHAR(36),
|
|
create_by VARCHAR(36),
|
|
|
create_by_name VARCHAR(100),
|
|
create_by_name VARCHAR(100),
|
|
|
- create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
|
|
|
+ create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
|
update_by VARCHAR(36),
|
|
update_by VARCHAR(36),
|
|
|
update_by_name VARCHAR(100),
|
|
update_by_name VARCHAR(100),
|
|
|
- update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
|
|
|
-);
|
|
|
|
|
-CREATE INDEX IF NOT EXISTS idx_parse_tasks_document_id ON parse_tasks(document_id);
|
|
|
|
|
-CREATE INDEX IF NOT EXISTS idx_parse_tasks_status ON parse_tasks(status);
|
|
|
|
|
-
|
|
|
|
|
-CREATE TABLE IF NOT EXISTS sessions (
|
|
|
|
|
- id VARCHAR(36) PRIMARY KEY,
|
|
|
|
|
- user_id VARCHAR(36) NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
|
|
|
- token_hash VARCHAR(255) NOT NULL UNIQUE,
|
|
|
|
|
- refresh_token_hash VARCHAR(255) NOT NULL UNIQUE,
|
|
|
|
|
- expires_at TIMESTAMP NOT NULL,
|
|
|
|
|
- ip_address VARCHAR(45),
|
|
|
|
|
- user_agent TEXT,
|
|
|
|
|
- create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
|
- last_used_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
|
|
|
|
|
+ update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
|
);
|
|
);
|
|
|
-CREATE INDEX IF NOT EXISTS idx_sessions_user_id ON sessions(user_id);
|
|
|
|
|
-CREATE INDEX IF NOT EXISTS idx_sessions_token_hash ON sessions(token_hash);
|
|
|
|
|
-CREATE INDEX IF NOT EXISTS idx_sessions_expires_at ON sessions(expires_at);
|
|
|
|
|
-
|
|
|
|
|
--- ============================================ 二、补充模块 ============================================
|
|
|
|
|
|
|
+CREATE INDEX IF NOT EXISTS idx_parse_tasks_document ON parse_tasks(document_id);
|
|
|
|
|
|
|
|
-CREATE TABLE IF NOT EXISTS rules (
|
|
|
|
|
|
|
+-- ==================== 文档结构化元素表(结构化解析 / 前端展示依赖) ====================
|
|
|
|
|
+CREATE TABLE IF NOT EXISTS document_elements (
|
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
|
- user_id VARCHAR(36) NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
|
|
|
- name VARCHAR(255) NOT NULL,
|
|
|
|
|
- description TEXT,
|
|
|
|
|
- entry_node_id VARCHAR(36),
|
|
|
|
|
- exit_node_id VARCHAR(36),
|
|
|
|
|
- rule_chain JSONB NOT NULL DEFAULT '[]',
|
|
|
|
|
- status VARCHAR(20) DEFAULT 'active',
|
|
|
|
|
- metadata JSONB DEFAULT '{}',
|
|
|
|
|
|
|
+ document_id VARCHAR(36) NOT NULL REFERENCES documents(id) ON DELETE CASCADE,
|
|
|
|
|
+ element_index INT,
|
|
|
|
|
+ element_type VARCHAR(50),
|
|
|
|
|
+ content TEXT,
|
|
|
|
|
+ style JSONB DEFAULT '{}',
|
|
|
|
|
+ runs JSONB DEFAULT '[]',
|
|
|
|
|
+ image_url VARCHAR(500),
|
|
|
|
|
+ image_path VARCHAR(500),
|
|
|
|
|
+ image_alt VARCHAR(500),
|
|
|
|
|
+ image_width INT,
|
|
|
|
|
+ image_height INT,
|
|
|
|
|
+ image_format VARCHAR(20),
|
|
|
|
|
+ table_index INT,
|
|
|
|
|
+ table_data JSONB,
|
|
|
|
|
+ table_row_count INT,
|
|
|
|
|
+ table_col_count INT,
|
|
|
|
|
+ table_text TEXT,
|
|
|
create_by VARCHAR(36),
|
|
create_by VARCHAR(36),
|
|
|
create_by_name VARCHAR(100),
|
|
create_by_name VARCHAR(100),
|
|
|
- create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
|
|
|
+ create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
|
update_by VARCHAR(36),
|
|
update_by VARCHAR(36),
|
|
|
update_by_name VARCHAR(100),
|
|
update_by_name VARCHAR(100),
|
|
|
- update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
|
|
|
|
|
+ update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
|
);
|
|
);
|
|
|
-CREATE INDEX IF NOT EXISTS idx_rules_user_id ON rules(user_id);
|
|
|
|
|
-CREATE INDEX IF NOT EXISTS idx_rules_status ON rules(status);
|
|
|
|
|
|
|
+CREATE INDEX IF NOT EXISTS idx_document_elements_document ON document_elements(document_id);
|
|
|
|
|
|
|
|
-CREATE TABLE IF NOT EXISTS data_sources (
|
|
|
|
|
|
|
+-- ==================== 向量嵌入表 ====================
|
|
|
|
|
+CREATE TABLE IF NOT EXISTS embeddings (
|
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
|
- user_id VARCHAR(36) NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
|
|
|
- document_id VARCHAR(36) REFERENCES documents(id) ON DELETE SET NULL,
|
|
|
|
|
- name VARCHAR(255) NOT NULL,
|
|
|
|
|
- type VARCHAR(50) NOT NULL,
|
|
|
|
|
- source_type VARCHAR(50) NOT NULL DEFAULT 'manual',
|
|
|
|
|
- node_ids JSONB DEFAULT '{"refs": []}',
|
|
|
|
|
- config JSONB DEFAULT '{}',
|
|
|
|
|
- metadata JSONB DEFAULT '{}',
|
|
|
|
|
- value_type VARCHAR(20) DEFAULT 'text',
|
|
|
|
|
- aggregate_type VARCHAR(20) DEFAULT 'first',
|
|
|
|
|
- separator VARCHAR(50) DEFAULT '',
|
|
|
|
|
- create_by VARCHAR(36),
|
|
|
|
|
- create_by_name VARCHAR(100),
|
|
|
|
|
- create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
|
- update_by VARCHAR(36),
|
|
|
|
|
- update_by_name VARCHAR(100),
|
|
|
|
|
- update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
|
|
|
|
|
+ chunk_id VARCHAR(36) NOT NULL REFERENCES document_chunks(id) ON DELETE CASCADE,
|
|
|
|
|
+ embedding vector(1536),
|
|
|
|
|
+ model_name VARCHAR(100) DEFAULT 'text-embedding-ada-002',
|
|
|
|
|
+ model_version VARCHAR(50),
|
|
|
|
|
+ create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
|
);
|
|
);
|
|
|
-CREATE INDEX IF NOT EXISTS idx_data_sources_user_id ON data_sources(user_id);
|
|
|
|
|
-CREATE INDEX IF NOT EXISTS idx_data_sources_document_id ON data_sources(document_id);
|
|
|
|
|
-CREATE INDEX IF NOT EXISTS idx_data_sources_type ON data_sources(type);
|
|
|
|
|
|
|
+CREATE INDEX IF NOT EXISTS idx_embeddings_chunk ON embeddings(chunk_id);
|
|
|
|
|
+CREATE INDEX IF NOT EXISTS idx_embeddings_vector ON embeddings USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);
|
|
|
|
|
|
|
|
-CREATE TABLE IF NOT EXISTS text_storage (
|
|
|
|
|
|
|
+-- ==================== 实体类型表 ====================
|
|
|
|
|
+CREATE TABLE IF NOT EXISTS entity_types (
|
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
|
- document_id VARCHAR(36) NOT NULL REFERENCES documents(id) ON DELETE CASCADE,
|
|
|
|
|
- file_path VARCHAR(500) NOT NULL,
|
|
|
|
|
- file_size BIGINT,
|
|
|
|
|
- checksum VARCHAR(64),
|
|
|
|
|
- create_by VARCHAR(36),
|
|
|
|
|
- create_by_name VARCHAR(100),
|
|
|
|
|
- create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
|
- update_by VARCHAR(36),
|
|
|
|
|
- update_by_name VARCHAR(100),
|
|
|
|
|
- update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
|
|
|
|
|
+ type_code VARCHAR(50) NOT NULL UNIQUE,
|
|
|
|
|
+ type_name VARCHAR(100) NOT NULL,
|
|
|
|
|
+ category VARCHAR(32),
|
|
|
|
|
+ color VARCHAR(20),
|
|
|
|
|
+ icon VARCHAR(50),
|
|
|
|
|
+ patterns JSONB DEFAULT '[]',
|
|
|
|
|
+ examples JSONB DEFAULT '[]',
|
|
|
|
|
+ description TEXT,
|
|
|
|
|
+ is_active BOOLEAN DEFAULT TRUE,
|
|
|
|
|
+ sort_order INT DEFAULT 0,
|
|
|
|
|
+ create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
|
+ update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
|
);
|
|
);
|
|
|
-CREATE INDEX IF NOT EXISTS idx_text_storage_document_id ON text_storage(document_id);
|
|
|
|
|
-CREATE UNIQUE INDEX IF NOT EXISTS idx_text_storage_document_unique ON text_storage(document_id);
|
|
|
|
|
-
|
|
|
|
|
--- ============================================ 三、RAG 模块 ============================================
|
|
|
|
|
|
|
+CREATE INDEX IF NOT EXISTS idx_entity_types_code ON entity_types(type_code);
|
|
|
|
|
|
|
|
-CREATE TABLE IF NOT EXISTS text_chunks (
|
|
|
|
|
|
|
+-- ==================== 实体表 ====================
|
|
|
|
|
+CREATE TABLE IF NOT EXISTS entities (
|
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
|
- document_id VARCHAR(36) NOT NULL,
|
|
|
|
|
- text_storage_id VARCHAR(36),
|
|
|
|
|
- chunk_index INTEGER NOT NULL,
|
|
|
|
|
- content TEXT NOT NULL,
|
|
|
|
|
- token_count INTEGER,
|
|
|
|
|
|
|
+ document_id VARCHAR(36) NOT NULL REFERENCES documents(id) ON DELETE CASCADE,
|
|
|
|
|
+ entity_type VARCHAR(50) NOT NULL,
|
|
|
|
|
+ entity_text VARCHAR(500) NOT NULL,
|
|
|
|
|
+ normalized_text VARCHAR(500),
|
|
|
|
|
+ occurrence_count INT DEFAULT 1,
|
|
|
|
|
+ confidence FLOAT DEFAULT 1.0,
|
|
|
|
|
+ business_label VARCHAR(100),
|
|
|
|
|
+ embedding vector(1536),
|
|
|
|
|
+ is_confirmed BOOLEAN DEFAULT FALSE,
|
|
|
|
|
+ is_merged BOOLEAN DEFAULT FALSE,
|
|
|
|
|
+ merged_to_id VARCHAR(36),
|
|
|
metadata JSONB DEFAULT '{}',
|
|
metadata JSONB DEFAULT '{}',
|
|
|
- create_by VARCHAR(36),
|
|
|
|
|
- create_by_name VARCHAR(100),
|
|
|
|
|
- create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
|
- update_by VARCHAR(36),
|
|
|
|
|
- update_by_name VARCHAR(100),
|
|
|
|
|
- update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
|
|
|
|
|
+ create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
|
+ update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
|
+ UNIQUE(document_id, entity_type, normalized_text)
|
|
|
);
|
|
);
|
|
|
-CREATE INDEX IF NOT EXISTS idx_text_chunks_document_id ON text_chunks(document_id);
|
|
|
|
|
-CREATE INDEX IF NOT EXISTS idx_text_chunks_text_storage_id ON text_chunks(text_storage_id);
|
|
|
|
|
-CREATE UNIQUE INDEX IF NOT EXISTS idx_text_chunks_doc_index ON text_chunks(document_id, chunk_index);
|
|
|
|
|
-
|
|
|
|
|
-CREATE TABLE IF NOT EXISTS vector_embeddings (
|
|
|
|
|
|
|
+CREATE INDEX IF NOT EXISTS idx_entities_document ON entities(document_id);
|
|
|
|
|
+CREATE INDEX IF NOT EXISTS idx_entities_type ON entities(entity_type);
|
|
|
|
|
+CREATE INDEX IF NOT EXISTS idx_entities_text ON entities(entity_text);
|
|
|
|
|
+CREATE INDEX IF NOT EXISTS idx_entities_normalized ON entities(normalized_text);
|
|
|
|
|
+CREATE INDEX IF NOT EXISTS idx_entities_label ON entities(business_label);
|
|
|
|
|
+
|
|
|
|
|
+-- ==================== 关系类型表 ====================
|
|
|
|
|
+CREATE TABLE IF NOT EXISTS relation_types (
|
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
|
- chunk_id VARCHAR(36) NOT NULL REFERENCES text_chunks(id) ON DELETE CASCADE,
|
|
|
|
|
- embedding vector(768),
|
|
|
|
|
- model_name VARCHAR(100) DEFAULT 'nomic-embed-text',
|
|
|
|
|
- create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
|
|
|
|
|
+ type_code VARCHAR(50) NOT NULL UNIQUE,
|
|
|
|
|
+ type_name VARCHAR(100) NOT NULL,
|
|
|
|
|
+ source_entity_types JSONB DEFAULT '[]',
|
|
|
|
|
+ target_entity_types JSONB DEFAULT '[]',
|
|
|
|
|
+ is_symmetric BOOLEAN DEFAULT FALSE,
|
|
|
|
|
+ description TEXT,
|
|
|
|
|
+ is_active BOOLEAN DEFAULT TRUE,
|
|
|
|
|
+ sort_order INT DEFAULT 0,
|
|
|
|
|
+ create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
|
+ update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
|
);
|
|
);
|
|
|
-CREATE INDEX IF NOT EXISTS idx_vector_embeddings_chunk_id ON vector_embeddings(chunk_id);
|
|
|
|
|
-CREATE INDEX IF NOT EXISTS idx_vector_embeddings_model ON vector_embeddings(model_name);
|
|
|
|
|
-CREATE INDEX IF NOT EXISTS idx_vector_embeddings_hnsw ON vector_embeddings USING hnsw (embedding vector_cosine_ops);
|
|
|
|
|
-
|
|
|
|
|
--- ============================================ 四、文档结构化模块 ============================================
|
|
|
|
|
|
|
+CREATE INDEX IF NOT EXISTS idx_relation_types_code ON relation_types(type_code);
|
|
|
|
|
|
|
|
-CREATE TABLE IF NOT EXISTS document_blocks (
|
|
|
|
|
- id VARCHAR(64) PRIMARY KEY,
|
|
|
|
|
- document_id VARCHAR(64) NOT NULL,
|
|
|
|
|
- parent_id VARCHAR(64),
|
|
|
|
|
- children JSONB,
|
|
|
|
|
- block_index INTEGER NOT NULL,
|
|
|
|
|
- block_type VARCHAR(32) NOT NULL,
|
|
|
|
|
- elements JSONB,
|
|
|
|
|
- style JSONB,
|
|
|
|
|
- metadata JSONB,
|
|
|
|
|
- create_by VARCHAR(64),
|
|
|
|
|
- create_by_name VARCHAR(128),
|
|
|
|
|
|
|
+-- ==================== 实体关系表 ====================
|
|
|
|
|
+CREATE TABLE IF NOT EXISTS entity_relations (
|
|
|
|
|
+ id VARCHAR(36) PRIMARY KEY,
|
|
|
|
|
+ document_id VARCHAR(36) NOT NULL REFERENCES documents(id) ON DELETE CASCADE,
|
|
|
|
|
+ source_entity_id VARCHAR(36) NOT NULL REFERENCES entities(id) ON DELETE CASCADE,
|
|
|
|
|
+ target_entity_id VARCHAR(36) NOT NULL REFERENCES entities(id) ON DELETE CASCADE,
|
|
|
|
|
+ relation_type VARCHAR(50) NOT NULL,
|
|
|
|
|
+ relation_text VARCHAR(500),
|
|
|
|
|
+ confidence FLOAT DEFAULT 1.0,
|
|
|
|
|
+ extraction_method VARCHAR(32) DEFAULT 'auto',
|
|
|
|
|
+ evidence_text TEXT,
|
|
|
|
|
+ is_confirmed BOOLEAN DEFAULT FALSE,
|
|
|
|
|
+ metadata JSONB DEFAULT '{}',
|
|
|
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
|
- update_by VARCHAR(64),
|
|
|
|
|
- update_by_name VARCHAR(128),
|
|
|
|
|
update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
|
);
|
|
);
|
|
|
-CREATE INDEX IF NOT EXISTS idx_document_blocks_document_id ON document_blocks(document_id);
|
|
|
|
|
-CREATE INDEX IF NOT EXISTS idx_document_blocks_parent_id ON document_blocks(parent_id);
|
|
|
|
|
-CREATE INDEX IF NOT EXISTS idx_document_blocks_block_type ON document_blocks(block_type);
|
|
|
|
|
-CREATE INDEX IF NOT EXISTS idx_document_blocks_elements_gin ON document_blocks USING GIN (elements jsonb_path_ops);
|
|
|
|
|
|
|
+CREATE INDEX IF NOT EXISTS idx_relations_document ON entity_relations(document_id);
|
|
|
|
|
+CREATE INDEX IF NOT EXISTS idx_relations_source ON entity_relations(source_entity_id);
|
|
|
|
|
+CREATE INDEX IF NOT EXISTS idx_relations_target ON entity_relations(target_entity_id);
|
|
|
|
|
+CREATE INDEX IF NOT EXISTS idx_relations_type ON entity_relations(relation_type);
|
|
|
|
|
|
|
|
-CREATE TABLE IF NOT EXISTS document_entities (
|
|
|
|
|
- id VARCHAR(64) PRIMARY KEY,
|
|
|
|
|
- document_id VARCHAR(64) NOT NULL,
|
|
|
|
|
- block_id VARCHAR(64),
|
|
|
|
|
- name VARCHAR(512) NOT NULL,
|
|
|
|
|
- entity_type VARCHAR(32) NOT NULL,
|
|
|
|
|
- value TEXT,
|
|
|
|
|
- block_char_start INTEGER,
|
|
|
|
|
- block_char_end INTEGER,
|
|
|
|
|
- global_char_start INTEGER,
|
|
|
|
|
- global_char_end INTEGER,
|
|
|
|
|
- anchor_before VARCHAR(100),
|
|
|
|
|
- anchor_after VARCHAR(100),
|
|
|
|
|
- source VARCHAR(16) DEFAULT 'auto',
|
|
|
|
|
- confidence DECIMAL(5,4),
|
|
|
|
|
- confirmed BOOLEAN DEFAULT FALSE,
|
|
|
|
|
- metadata JSONB,
|
|
|
|
|
- create_by VARCHAR(64),
|
|
|
|
|
- create_by_name VARCHAR(128),
|
|
|
|
|
|
|
+-- ==================== 规则表 ====================
|
|
|
|
|
+CREATE TABLE IF NOT EXISTS rules (
|
|
|
|
|
+ id VARCHAR(36) PRIMARY KEY,
|
|
|
|
|
+ document_id VARCHAR(36) REFERENCES documents(id) ON DELETE SET NULL,
|
|
|
|
|
+ user_id VARCHAR(36) NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
|
|
|
+ name VARCHAR(200) NOT NULL,
|
|
|
|
|
+ description TEXT,
|
|
|
|
|
+ category VARCHAR(50),
|
|
|
|
|
+ rule_type VARCHAR(32) NOT NULL,
|
|
|
|
|
+ source VARCHAR(32) DEFAULT 'auto',
|
|
|
|
|
+ priority INT DEFAULT 0,
|
|
|
|
|
+ status VARCHAR(20) DEFAULT 'draft',
|
|
|
|
|
+ embedding vector(1536),
|
|
|
|
|
+ is_global BOOLEAN DEFAULT FALSE,
|
|
|
|
|
+ del_flag BOOLEAN DEFAULT FALSE,
|
|
|
|
|
+ create_by VARCHAR(36),
|
|
|
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
|
- update_by VARCHAR(64),
|
|
|
|
|
- update_by_name VARCHAR(128),
|
|
|
|
|
|
|
+ update_by VARCHAR(36),
|
|
|
update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
|
);
|
|
);
|
|
|
-CREATE INDEX IF NOT EXISTS idx_document_entities_document_id ON document_entities(document_id);
|
|
|
|
|
-CREATE INDEX IF NOT EXISTS idx_document_entities_block_id ON document_entities(block_id);
|
|
|
|
|
-CREATE INDEX IF NOT EXISTS idx_document_entities_type ON document_entities(entity_type);
|
|
|
|
|
-CREATE INDEX IF NOT EXISTS idx_document_entities_name ON document_entities(name);
|
|
|
|
|
-CREATE INDEX IF NOT EXISTS idx_document_entities_global_char ON document_entities(document_id, global_char_start, global_char_end);
|
|
|
|
|
|
|
+CREATE INDEX IF NOT EXISTS idx_rules_document ON rules(document_id);
|
|
|
|
|
+CREATE INDEX IF NOT EXISTS idx_rules_user ON rules(user_id);
|
|
|
|
|
+CREATE INDEX IF NOT EXISTS idx_rules_type ON rules(rule_type);
|
|
|
|
|
+CREATE INDEX IF NOT EXISTS idx_rules_status ON rules(status);
|
|
|
|
|
+CREATE INDEX IF NOT EXISTS idx_rules_category ON rules(category);
|
|
|
|
|
|
|
|
-CREATE TABLE IF NOT EXISTS document_elements (
|
|
|
|
|
- id VARCHAR(64) PRIMARY KEY,
|
|
|
|
|
- document_id VARCHAR(64) NOT NULL,
|
|
|
|
|
- element_index INT NOT NULL,
|
|
|
|
|
- element_type VARCHAR(32) NOT NULL,
|
|
|
|
|
- content TEXT,
|
|
|
|
|
- style JSONB,
|
|
|
|
|
- runs JSONB,
|
|
|
|
|
- image_url VARCHAR(500),
|
|
|
|
|
- image_path VARCHAR(500),
|
|
|
|
|
- image_alt VARCHAR(255),
|
|
|
|
|
- image_width INT,
|
|
|
|
|
- image_height INT,
|
|
|
|
|
- image_format VARCHAR(16),
|
|
|
|
|
- table_index INT,
|
|
|
|
|
- table_data JSONB,
|
|
|
|
|
- table_row_count INT,
|
|
|
|
|
- table_col_count INT,
|
|
|
|
|
- table_text TEXT,
|
|
|
|
|
- create_by VARCHAR(64),
|
|
|
|
|
- create_by_name VARCHAR(128),
|
|
|
|
|
|
|
+-- ==================== 规则条件表 ====================
|
|
|
|
|
+CREATE TABLE IF NOT EXISTS rule_conditions (
|
|
|
|
|
+ id VARCHAR(36) PRIMARY KEY,
|
|
|
|
|
+ rule_id VARCHAR(36) NOT NULL REFERENCES rules(id) ON DELETE CASCADE,
|
|
|
|
|
+ condition_index INT NOT NULL,
|
|
|
|
|
+ condition_type VARCHAR(32) NOT NULL,
|
|
|
|
|
+ config JSONB NOT NULL,
|
|
|
|
|
+ logic_operator VARCHAR(10) DEFAULT 'AND',
|
|
|
|
|
+ sort_order INT DEFAULT 0,
|
|
|
|
|
+ create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
|
|
|
+);
|
|
|
|
|
+CREATE INDEX IF NOT EXISTS idx_rule_conditions_rule ON rule_conditions(rule_id);
|
|
|
|
|
+
|
|
|
|
|
+-- ==================== 规则动作表 ====================
|
|
|
|
|
+CREATE TABLE IF NOT EXISTS rule_actions (
|
|
|
|
|
+ id VARCHAR(36) PRIMARY KEY,
|
|
|
|
|
+ rule_id VARCHAR(36) NOT NULL REFERENCES rules(id) ON DELETE CASCADE,
|
|
|
|
|
+ action_index INT NOT NULL,
|
|
|
|
|
+ action_type VARCHAR(32) NOT NULL,
|
|
|
|
|
+ config JSONB NOT NULL,
|
|
|
|
|
+ target_field VARCHAR(100),
|
|
|
|
|
+ sort_order INT DEFAULT 0,
|
|
|
|
|
+ create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
|
|
|
+);
|
|
|
|
|
+CREATE INDEX IF NOT EXISTS idx_rule_actions_rule ON rule_actions(rule_id);
|
|
|
|
|
+
|
|
|
|
|
+-- ==================== 生成任务表 ====================
|
|
|
|
|
+CREATE TABLE IF NOT EXISTS generations (
|
|
|
|
|
+ id VARCHAR(36) PRIMARY KEY,
|
|
|
|
|
+ user_id VARCHAR(36) NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
|
|
|
+ document_id VARCHAR(36) REFERENCES documents(id) ON DELETE SET NULL,
|
|
|
|
|
+ template_id VARCHAR(36),
|
|
|
|
|
+ name VARCHAR(200),
|
|
|
|
|
+ applied_rules JSONB DEFAULT '[]',
|
|
|
|
|
+ source_file_map JSONB DEFAULT '{}',
|
|
|
|
|
+ extracted_data JSONB DEFAULT '{}',
|
|
|
|
|
+ confirmed_data JSONB DEFAULT '{}',
|
|
|
|
|
+ output_file_path VARCHAR(500),
|
|
|
|
|
+ output_file_name VARCHAR(255),
|
|
|
|
|
+ output_document_id VARCHAR(36),
|
|
|
|
|
+ progress INTEGER,
|
|
|
|
|
+ status VARCHAR(20) DEFAULT 'pending',
|
|
|
|
|
+ error_message TEXT,
|
|
|
|
|
+ started_at TIMESTAMP,
|
|
|
|
|
+ reviewed_at TIMESTAMP,
|
|
|
|
|
+ completed_at TIMESTAMP,
|
|
|
|
|
+ del_flag BOOLEAN DEFAULT FALSE,
|
|
|
|
|
+ create_by VARCHAR(36),
|
|
|
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
|
- update_by VARCHAR(64),
|
|
|
|
|
- update_by_name VARCHAR(128),
|
|
|
|
|
|
|
+ update_by VARCHAR(36),
|
|
|
update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
|
);
|
|
);
|
|
|
-CREATE INDEX IF NOT EXISTS idx_document_elements_document_id ON document_elements(document_id);
|
|
|
|
|
-CREATE INDEX IF NOT EXISTS idx_document_elements_type ON document_elements(element_type);
|
|
|
|
|
-CREATE INDEX IF NOT EXISTS idx_document_elements_order ON document_elements(document_id, element_index);
|
|
|
|
|
|
|
+CREATE INDEX IF NOT EXISTS idx_generations_user ON generations(user_id);
|
|
|
|
|
+CREATE INDEX IF NOT EXISTS idx_generations_document ON generations(document_id);
|
|
|
|
|
+CREATE INDEX IF NOT EXISTS idx_generations_status ON generations(status);
|
|
|
|
|
|
|
|
--- ============================================ 五、模板系统模块 ============================================
|
|
|
|
|
|
|
+-- ==================== 生成输出表 ====================
|
|
|
|
|
+CREATE TABLE IF NOT EXISTS generation_outputs (
|
|
|
|
|
+ id VARCHAR(36) PRIMARY KEY,
|
|
|
|
|
+ generation_id VARCHAR(36) NOT NULL REFERENCES generations(id) ON DELETE CASCADE,
|
|
|
|
|
+ version INT NOT NULL DEFAULT 1,
|
|
|
|
|
+ file_path VARCHAR(500) NOT NULL,
|
|
|
|
|
+ file_name VARCHAR(255) NOT NULL,
|
|
|
|
|
+ file_size BIGINT,
|
|
|
|
|
+ file_type VARCHAR(20) DEFAULT 'docx',
|
|
|
|
|
+ share_token VARCHAR(100),
|
|
|
|
|
+ share_expires_at TIMESTAMP,
|
|
|
|
|
+ download_count INT DEFAULT 0,
|
|
|
|
|
+ is_final BOOLEAN DEFAULT FALSE,
|
|
|
|
|
+ create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
|
|
|
+);
|
|
|
|
|
+CREATE INDEX IF NOT EXISTS idx_gen_outputs_generation ON generation_outputs(generation_id);
|
|
|
|
|
+CREATE INDEX IF NOT EXISTS idx_gen_outputs_share ON generation_outputs(share_token);
|
|
|
|
|
|
|
|
|
|
+-- ==================== 模板/变量/来源文件(兼容现有模板流程) ====================
|
|
|
CREATE TABLE IF NOT EXISTS templates (
|
|
CREATE TABLE IF NOT EXISTS templates (
|
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
|
- user_id VARCHAR(36) NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
|
|
|
- name VARCHAR(255) NOT NULL,
|
|
|
|
|
|
|
+ user_id VARCHAR(36) NOT NULL,
|
|
|
|
|
+ name VARCHAR(200),
|
|
|
description TEXT,
|
|
description TEXT,
|
|
|
- base_document_id VARCHAR(36) REFERENCES documents(id) ON DELETE SET NULL,
|
|
|
|
|
- status VARCHAR(32) DEFAULT 'draft',
|
|
|
|
|
|
|
+ base_document_id VARCHAR(36),
|
|
|
|
|
+ status VARCHAR(20) DEFAULT 'draft',
|
|
|
config JSONB DEFAULT '{}',
|
|
config JSONB DEFAULT '{}',
|
|
|
is_public BOOLEAN DEFAULT FALSE,
|
|
is_public BOOLEAN DEFAULT FALSE,
|
|
|
use_count INT DEFAULT 0,
|
|
use_count INT DEFAULT 0,
|
|
|
- rating DECIMAL(2,1) DEFAULT 0.0,
|
|
|
|
|
- create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
|
- update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
|
|
|
+ rating DOUBLE PRECISION,
|
|
|
create_by VARCHAR(36),
|
|
create_by VARCHAR(36),
|
|
|
create_by_name VARCHAR(100),
|
|
create_by_name VARCHAR(100),
|
|
|
|
|
+ create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
|
update_by VARCHAR(36),
|
|
update_by VARCHAR(36),
|
|
|
- update_by_name VARCHAR(100)
|
|
|
|
|
|
|
+ update_by_name VARCHAR(100),
|
|
|
|
|
+ update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
|
|
|
+);
|
|
|
|
|
+CREATE INDEX IF NOT EXISTS idx_templates_user ON templates(user_id);
|
|
|
|
|
+
|
|
|
|
|
+CREATE TABLE IF NOT EXISTS variables (
|
|
|
|
|
+ id VARCHAR(36) PRIMARY KEY,
|
|
|
|
|
+ template_id VARCHAR(36) NOT NULL REFERENCES templates(id) ON DELETE CASCADE,
|
|
|
|
|
+ name VARCHAR(100) NOT NULL,
|
|
|
|
|
+ display_name VARCHAR(200),
|
|
|
|
|
+ variable_group VARCHAR(100),
|
|
|
|
|
+ category VARCHAR(50),
|
|
|
|
|
+ location JSONB,
|
|
|
|
|
+ example_value TEXT,
|
|
|
|
|
+ value_type VARCHAR(20),
|
|
|
|
|
+ source_file_alias VARCHAR(100),
|
|
|
|
|
+ source_type VARCHAR(30),
|
|
|
|
|
+ source_config JSONB DEFAULT '{}',
|
|
|
|
|
+ extract_type VARCHAR(30),
|
|
|
|
|
+ extract_config JSONB DEFAULT '{}',
|
|
|
|
|
+ display_order INT DEFAULT 0,
|
|
|
|
|
+ create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
|
+ update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
|
);
|
|
);
|
|
|
-CREATE INDEX IF NOT EXISTS idx_templates_user_id ON templates(user_id);
|
|
|
|
|
-CREATE INDEX IF NOT EXISTS idx_templates_status ON templates(status);
|
|
|
|
|
-CREATE INDEX IF NOT EXISTS idx_templates_is_public ON templates(is_public);
|
|
|
|
|
-CREATE INDEX IF NOT EXISTS idx_templates_base_document ON templates(base_document_id);
|
|
|
|
|
|
|
+CREATE INDEX IF NOT EXISTS idx_variables_template ON variables(template_id);
|
|
|
|
|
|
|
|
CREATE TABLE IF NOT EXISTS source_files (
|
|
CREATE TABLE IF NOT EXISTS source_files (
|
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
|
template_id VARCHAR(36) NOT NULL REFERENCES templates(id) ON DELETE CASCADE,
|
|
template_id VARCHAR(36) NOT NULL REFERENCES templates(id) ON DELETE CASCADE,
|
|
|
alias VARCHAR(100) NOT NULL,
|
|
alias VARCHAR(100) NOT NULL,
|
|
|
description TEXT,
|
|
description TEXT,
|
|
|
- file_types JSONB DEFAULT '["pdf", "docx"]',
|
|
|
|
|
|
|
+ file_types JSONB DEFAULT '[]',
|
|
|
required BOOLEAN DEFAULT TRUE,
|
|
required BOOLEAN DEFAULT TRUE,
|
|
|
- example_document_id VARCHAR(36) REFERENCES documents(id) ON DELETE SET NULL,
|
|
|
|
|
|
|
+ example_document_id VARCHAR(36),
|
|
|
display_order INT DEFAULT 0,
|
|
display_order INT DEFAULT 0,
|
|
|
- create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
|
- update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
|
- CONSTRAINT uk_source_files_alias UNIQUE (template_id, alias)
|
|
|
|
|
|
|
+ create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
|
);
|
|
);
|
|
|
CREATE INDEX IF NOT EXISTS idx_source_files_template ON source_files(template_id);
|
|
CREATE INDEX IF NOT EXISTS idx_source_files_template ON source_files(template_id);
|
|
|
|
|
|
|
|
-CREATE TABLE IF NOT EXISTS variables (
|
|
|
|
|
|
|
+-- ==================== 标准实体表 ====================
|
|
|
|
|
+CREATE TABLE IF NOT EXISTS standard_entities (
|
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
|
- template_id VARCHAR(36) NOT NULL REFERENCES templates(id) ON DELETE CASCADE,
|
|
|
|
|
- name VARCHAR(100) NOT NULL,
|
|
|
|
|
- display_name VARCHAR(200) NOT NULL,
|
|
|
|
|
- variable_group VARCHAR(100),
|
|
|
|
|
- category VARCHAR(32),
|
|
|
|
|
- location JSONB NOT NULL,
|
|
|
|
|
- example_value TEXT,
|
|
|
|
|
- value_type VARCHAR(32) DEFAULT 'text',
|
|
|
|
|
- source_file_alias VARCHAR(100),
|
|
|
|
|
- source_type VARCHAR(32) NOT NULL,
|
|
|
|
|
- source_config JSONB,
|
|
|
|
|
- extract_type VARCHAR(32),
|
|
|
|
|
- extract_config JSONB,
|
|
|
|
|
- display_order INT DEFAULT 0,
|
|
|
|
|
|
|
+ entity_type VARCHAR(50) NOT NULL,
|
|
|
|
|
+ name VARCHAR(500) NOT NULL,
|
|
|
|
|
+ aliases JSONB DEFAULT '[]',
|
|
|
|
|
+ attributes JSONB DEFAULT '{}',
|
|
|
|
|
+ embedding vector(1536),
|
|
|
|
|
+ occurrence_count INT DEFAULT 1,
|
|
|
|
|
+ document_count INT DEFAULT 1,
|
|
|
|
|
+ is_verified BOOLEAN DEFAULT FALSE,
|
|
|
|
|
+ del_flag BOOLEAN DEFAULT FALSE,
|
|
|
|
|
+ create_by VARCHAR(36),
|
|
|
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
|
- update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
|
- CONSTRAINT uk_variables_name UNIQUE (template_id, name)
|
|
|
|
|
|
|
+ update_by VARCHAR(36),
|
|
|
|
|
+ update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
|
);
|
|
);
|
|
|
-CREATE INDEX IF NOT EXISTS idx_variables_template ON variables(template_id);
|
|
|
|
|
-CREATE INDEX IF NOT EXISTS idx_variables_source_alias ON variables(source_file_alias);
|
|
|
|
|
-CREATE INDEX IF NOT EXISTS idx_variables_source_type ON variables(source_type);
|
|
|
|
|
-CREATE INDEX IF NOT EXISTS idx_variables_category ON variables(category);
|
|
|
|
|
|
|
+CREATE INDEX IF NOT EXISTS idx_std_entities_type ON standard_entities(entity_type);
|
|
|
|
|
+CREATE INDEX IF NOT EXISTS idx_std_entities_name ON standard_entities(name);
|
|
|
|
|
+CREATE INDEX IF NOT EXISTS idx_std_entities_vector ON standard_entities USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);
|
|
|
|
|
|
|
|
-CREATE TABLE IF NOT EXISTS generations (
|
|
|
|
|
|
|
+-- ==================== 标准关系表 ====================
|
|
|
|
|
+CREATE TABLE IF NOT EXISTS standard_relations (
|
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
|
- template_id VARCHAR(36) NOT NULL REFERENCES templates(id) ON DELETE RESTRICT,
|
|
|
|
|
- user_id VARCHAR(36) NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
|
|
|
- name VARCHAR(255),
|
|
|
|
|
- source_file_map JSONB NOT NULL,
|
|
|
|
|
- variable_values JSONB,
|
|
|
|
|
- output_document_id VARCHAR(36) REFERENCES documents(id) ON DELETE SET NULL,
|
|
|
|
|
- output_file_path VARCHAR(500),
|
|
|
|
|
- status VARCHAR(32) DEFAULT 'pending',
|
|
|
|
|
- error_message TEXT,
|
|
|
|
|
- progress INT DEFAULT 0,
|
|
|
|
|
|
|
+ source_entity_id VARCHAR(36) NOT NULL REFERENCES standard_entities(id) ON DELETE CASCADE,
|
|
|
|
|
+ target_entity_id VARCHAR(36) NOT NULL REFERENCES standard_entities(id) ON DELETE CASCADE,
|
|
|
|
|
+ relation_type VARCHAR(50) NOT NULL,
|
|
|
|
|
+ attributes JSONB DEFAULT '{}',
|
|
|
|
|
+ occurrence_count INT DEFAULT 1,
|
|
|
|
|
+ is_verified BOOLEAN DEFAULT FALSE,
|
|
|
|
|
+ del_flag BOOLEAN DEFAULT FALSE,
|
|
|
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
|
- completed_at TIMESTAMP
|
|
|
|
|
|
|
+ update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
|
);
|
|
);
|
|
|
-CREATE INDEX IF NOT EXISTS idx_generations_template ON generations(template_id);
|
|
|
|
|
-CREATE INDEX IF NOT EXISTS idx_generations_user ON generations(user_id);
|
|
|
|
|
-CREATE INDEX IF NOT EXISTS idx_generations_status ON generations(status);
|
|
|
|
|
-CREATE INDEX IF NOT EXISTS idx_generations_create_time ON generations(create_time DESC);
|
|
|
|
|
-
|
|
|
|
|
--- ============================================ 触发器 ============================================
|
|
|
|
|
-
|
|
|
|
|
-CREATE OR REPLACE FUNCTION update_update_time_column()
|
|
|
|
|
-RETURNS TRIGGER AS $$
|
|
|
|
|
-BEGIN
|
|
|
|
|
- NEW.update_time = CURRENT_TIMESTAMP;
|
|
|
|
|
- RETURN NEW;
|
|
|
|
|
-END;
|
|
|
|
|
-$$ LANGUAGE plpgsql;
|
|
|
|
|
-
|
|
|
|
|
-DO $$
|
|
|
|
|
-DECLARE
|
|
|
|
|
- tbl TEXT;
|
|
|
|
|
- tables TEXT[] := ARRAY[
|
|
|
|
|
- 'users', 'documents', 'elements', 'annotations', 'graphs',
|
|
|
|
|
- 'parse_tasks', 'sessions', 'rules', 'data_sources', 'text_storage',
|
|
|
|
|
- 'text_chunks', 'document_blocks', 'document_entities', 'document_elements',
|
|
|
|
|
- 'templates', 'source_files', 'variables', 'generations'
|
|
|
|
|
- ];
|
|
|
|
|
-BEGIN
|
|
|
|
|
- FOREACH tbl IN ARRAY tables LOOP
|
|
|
|
|
- EXECUTE format('DROP TRIGGER IF EXISTS trigger_%s_update_time ON %I', tbl, tbl);
|
|
|
|
|
- EXECUTE format('CREATE TRIGGER trigger_%s_update_time BEFORE UPDATE ON %I FOR EACH ROW EXECUTE FUNCTION update_update_time_column()', tbl, tbl);
|
|
|
|
|
- END LOOP;
|
|
|
|
|
-END $$;
|
|
|
|
|
|
|
+CREATE INDEX IF NOT EXISTS idx_std_relations_source ON standard_relations(source_entity_id);
|
|
|
|
|
+CREATE INDEX IF NOT EXISTS idx_std_relations_target ON standard_relations(target_entity_id);
|
|
|
|
|
+CREATE INDEX IF NOT EXISTS idx_std_relations_type ON standard_relations(relation_type);
|
|
|
|
|
|
|
|
--- ============================================ 向量检索函数 ============================================
|
|
|
|
|
-
|
|
|
|
|
-CREATE OR REPLACE FUNCTION search_similar_chunks(
|
|
|
|
|
- query_embedding vector(768),
|
|
|
|
|
- target_document_id VARCHAR(36),
|
|
|
|
|
- result_limit INTEGER DEFAULT 3
|
|
|
|
|
-)
|
|
|
|
|
-RETURNS TABLE (chunk_id VARCHAR(36), document_id VARCHAR(36), content TEXT, chunk_index INTEGER, similarity FLOAT) AS $$
|
|
|
|
|
-BEGIN
|
|
|
|
|
- RETURN QUERY
|
|
|
|
|
- SELECT tc.id, tc.document_id, tc.content, tc.chunk_index,
|
|
|
|
|
- 1 - (ve.embedding <=> query_embedding) AS similarity
|
|
|
|
|
- FROM text_chunks tc
|
|
|
|
|
- JOIN vector_embeddings ve ON tc.id = ve.chunk_id
|
|
|
|
|
- WHERE tc.document_id = target_document_id
|
|
|
|
|
- ORDER BY ve.embedding <=> query_embedding
|
|
|
|
|
- LIMIT result_limit;
|
|
|
|
|
-END;
|
|
|
|
|
-$$ LANGUAGE plpgsql;
|
|
|
|
|
-
|
|
|
|
|
-CREATE OR REPLACE FUNCTION search_similar_chunks_global(
|
|
|
|
|
- query_embedding vector(768),
|
|
|
|
|
- result_limit INTEGER DEFAULT 5
|
|
|
|
|
-)
|
|
|
|
|
-RETURNS TABLE (chunk_id VARCHAR(36), document_id VARCHAR(36), content TEXT, chunk_index INTEGER, similarity FLOAT) AS $$
|
|
|
|
|
-BEGIN
|
|
|
|
|
- RETURN QUERY
|
|
|
|
|
- SELECT tc.id, tc.document_id, tc.content, tc.chunk_index,
|
|
|
|
|
- 1 - (ve.embedding <=> query_embedding) AS similarity
|
|
|
|
|
- FROM text_chunks tc
|
|
|
|
|
- JOIN vector_embeddings ve ON tc.id = ve.chunk_id
|
|
|
|
|
- ORDER BY ve.embedding <=> query_embedding
|
|
|
|
|
- LIMIT result_limit;
|
|
|
|
|
-END;
|
|
|
|
|
-$$ LANGUAGE plpgsql;
|
|
|
|
|
-
|
|
|
|
|
-SELECT '灵越智报 v2.0 数据库初始化完成' AS result;
|
|
|
|
|
|
|
+-- ==================== 实体合并记录表 ====================
|
|
|
|
|
+CREATE TABLE IF NOT EXISTS entity_merge_records (
|
|
|
|
|
+ id VARCHAR(36) PRIMARY KEY,
|
|
|
|
|
+ source_entity_id VARCHAR(36) NOT NULL REFERENCES entities(id) ON DELETE CASCADE,
|
|
|
|
|
+ target_entity_id VARCHAR(36) NOT NULL REFERENCES standard_entities(id) ON DELETE CASCADE,
|
|
|
|
|
+ similarity_score FLOAT,
|
|
|
|
|
+ merge_type VARCHAR(32) DEFAULT 'auto',
|
|
|
|
|
+ create_by VARCHAR(36),
|
|
|
|
|
+ create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
|
|
|
+);
|
|
|
|
|
+CREATE INDEX IF NOT EXISTS idx_merge_records_source ON entity_merge_records(source_entity_id);
|
|
|
|
|
+CREATE INDEX IF NOT EXISTS idx_merge_records_target ON entity_merge_records(target_entity_id);
|
|
|
|
|
+
|
|
|
|
|
+-- ==================== 预置数据 ====================
|
|
|
|
|
+INSERT INTO entity_types (id, type_code, type_name, category, color, icon, description, sort_order) VALUES
|
|
|
|
|
+('et-001', 'PERSON', '人名', 'basic', '#1890ff', 'user', '人物姓名,如:张经理、李总', 1),
|
|
|
|
|
+('et-002', 'ORG', '机构', 'basic', '#faad14', 'bank', '组织机构,如:成都检测公司、环保局', 2),
|
|
|
|
|
+('et-003', 'LOC', '地点', 'basic', '#52c41a', 'environment', '地理位置,如:成都市高新区', 3),
|
|
|
|
|
+('et-004', 'DATE', '日期', 'basic', '#722ed1', 'calendar', '日期时间,如:2024年5月15日', 4),
|
|
|
|
|
+('et-005', 'NUMBER', '数值', 'basic', '#13c2c2', 'number', '数值数量,如:50分贝、100万元', 5),
|
|
|
|
|
+('et-006', 'DEVICE', '设备', 'domain', '#eb2f96', 'tool', '设备仪器,如:噪音检测设备、光谱仪', 10),
|
|
|
|
|
+('et-007', 'PROJECT', '项目', 'domain', '#f5222d', 'project', '项目名称,如:环境监测项目', 11),
|
|
|
|
|
+('et-008', 'TERM', '术语', 'domain', '#a0d911', 'book', '专业术语,如:COD、BOD、PM2.5', 12),
|
|
|
|
|
+('et-009', 'STANDARD', '标准', 'domain', '#2f54eb', 'file-text', '标准规范,如:GB 3096-2008', 13),
|
|
|
|
|
+('et-010', 'MATERIAL', '材料', 'domain', '#fa8c16', 'experiment', '材料物质,如:甲醛、苯', 14),
|
|
|
|
|
+('et-011', 'METHOD', '方法', 'domain', '#1890ff', 'api', '检测方法,如:气相色谱法', 15)
|
|
|
|
|
+ON CONFLICT (id) DO NOTHING;
|
|
|
|
|
+
|
|
|
|
|
+INSERT INTO relation_types (id, type_code, type_name, source_entity_types, target_entity_types, is_symmetric, description) VALUES
|
|
|
|
|
+('rt-001', 'LOCATED_IN', '位于', '["ORG", "PERSON", "PROJECT"]', '["LOC"]', false, '实体位于某地'),
|
|
|
|
|
+('rt-002', 'WORKS_FOR', '任职于', '["PERSON"]', '["ORG"]', false, '人员任职于机构'),
|
|
|
|
|
+('rt-003', 'BELONGS_TO', '属于', '["ORG", "PROJECT"]', '["ORG"]', false, '隶属关系'),
|
|
|
|
|
+('rt-004', 'RESPONSIBLE_FOR', '负责', '["PERSON", "ORG"]', '["PROJECT", "LOC"]', false, '负责某事/某地'),
|
|
|
|
|
+('rt-005', 'USES', '使用', '["ORG", "PERSON", "PROJECT"]', '["DEVICE", "METHOD"]', false, '使用设备/方法'),
|
|
|
|
|
+('rt-006', 'DETECTS', '检测', '["ORG", "PERSON", "DEVICE"]', '["MATERIAL", "TERM"]', false, '检测某物质/指标'),
|
|
|
|
|
+('rt-007', 'CONTAINS', '包含', '["PROJECT", "ORG"]', '["PROJECT", "TERM", "MATERIAL"]', false, '包含关系'),
|
|
|
|
|
+('rt-008', 'COMPLIES_WITH', '符合', '["PROJECT", "ORG", "METHOD"]', '["STANDARD"]', false, '符合某标准'),
|
|
|
|
|
+('rt-009', 'PRODUCES', '产生', '["ORG", "PROJECT", "DEVICE"]', '["NUMBER", "MATERIAL"]', false, '产生数据/物质'),
|
|
|
|
|
+('rt-010', 'COOPERATES', '合作', '["ORG"]', '["ORG"]', true, '机构合作关系'),
|
|
|
|
|
+('rt-011', 'OCCURS_AT', '发生于', '["PROJECT"]', '["DATE"]', false, '发生在某时间')
|
|
|
|
|
+ON CONFLICT (id) DO NOTHING;
|