Files

147 lines
4.6 KiB
Python
Raw Permalink Normal View History

#!/usr/bin/env python3
"""SQLite版知识图谱(临时替代Neo4j)"""
import json
import sqlite3
from pathlib import Path
class GeneFamilyKG_SQLite:
def __init__(self, db_path="/home/xzq/gene-family-mas-v2/kg.db"):
self.db_path = db_path
self.conn = sqlite3.connect(db_path)
self.init_schema()
def init_schema(self):
"""初始化Schema"""
cursor = self.conn.cursor()
# 基因家族表
cursor.execute('''
CREATE TABLE IF NOT EXISTS gene_families (
name TEXT PRIMARY KEY,
full_name TEXT,
description TEXT
)
''')
# 物种表
cursor.execute('''
CREATE TABLE IF NOT EXISTS species (
name TEXT PRIMARY KEY,
common_name TEXT
)
''')
# 基因表
cursor.execute('''
CREATE TABLE IF NOT EXISTS genes (
id TEXT PRIMARY KEY,
name TEXT,
species TEXT,
family TEXT,
FOREIGN KEY (species) REFERENCES species(name),
FOREIGN KEY (family) REFERENCES gene_families(name)
)
''')
# 系统发育分组表
cursor.execute('''
CREATE TABLE IF NOT EXISTS phylogeny_groups (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
gene_family TEXT,
UNIQUE(name, gene_family)
)
''')
# 基因-分组关系表
cursor.execute('''
CREATE TABLE IF NOT EXISTS gene_groups (
gene_id TEXT,
group_id INTEGER,
FOREIGN KEY (gene_id) REFERENCES genes(id),
FOREIGN KEY (group_id) REFERENCES phylogeny_groups(id),
PRIMARY KEY (gene_id, group_id)
)
''')
self.conn.commit()
print("SQLite Schema初始化完成")
def import_phylogeny_data(self, json_path: Path):
"""导入v5提取数据"""
with open(json_path) as f:
data = json.load(f)
gene_family = data.get("gene_family", "Unknown")
species = data.get("species", "Unknown")
groups = data.get("groups", {})
cursor = self.conn.cursor()
# 插入基因家族
cursor.execute(
"INSERT OR REPLACE INTO gene_families (name) VALUES (?)",
(gene_family,)
)
# 插入物种
cursor.execute(
"INSERT OR REPLACE INTO species (name) VALUES (?)",
(species,)
)
# 插入分组和基因
for group_name, genes in groups.items():
# 插入分组
cursor.execute(
"INSERT OR REPLACE INTO phylogeny_groups (name, gene_family) VALUES (?, ?)",
(group_name, gene_family)
)
cursor.execute(
"SELECT id FROM phylogeny_groups WHERE name=? AND gene_family=?",
(group_name, gene_family)
)
group_id = cursor.fetchone()[0]
# 插入基因并建立关系
for gene_id in genes:
cursor.execute(
"INSERT OR REPLACE INTO genes (id, name, species, family) VALUES (?, ?, ?, ?)",
(gene_id, gene_id, species, gene_family)
)
cursor.execute(
"INSERT OR REPLACE INTO gene_groups (gene_id, group_id) VALUES (?, ?)",
(gene_id, group_id)
)
self.conn.commit()
print(f"导入完成: {gene_family}")
print(f" - 分组数: {len(groups)}")
print(f" - 基因数: {sum(len(g) for g in groups.values())}")
def get_stats(self):
"""获取统计信息"""
cursor = self.conn.cursor()
stats = {}
for table in ['gene_families', 'species', 'genes', 'phylogeny_groups']:
cursor.execute(f"SELECT COUNT(*) FROM {table}")
stats[table] = cursor.fetchone()[0]
return stats
def close(self):
self.conn.close()
if __name__ == "__main__":
kg = GeneFamilyKG_SQLite()
# 导入番茄P450数据
data_path = Path("/home/xzq/gene-family-mas-v2/evaluation/auto_results/番茄p450基因家族BMCgenomics2020_v5.json")
if data_path.exists():
kg.import_phylogeny_data(data_path)
print("\n统计信息:", kg.get_stats())
else:
print(f"数据文件不存在: {data_path}")
kg.close()