内容
# Ignet — 整合基因网络数据库
[](https://ignet.org/ignet/)
[](LICENSE)
[-orange)](https://ignet.org/api/v1/stats)
[](https://ignet.org/api/v1/mcp)

> **Ignet** 将超过 848,000 篇 PubMed 摘要转化为可查询的、基于证据的基因相互作用网络。**510 万 BioBERT 评分的基因对**、**190 万证据句子**、**30+ REST 端点**,以及一个 **MCP 端点**,允许 Claude Desktop 等 AI 助手直接查询数据库。每天从 NCBI PubMed FTP 源更新。
---
## 目录
- [什么是 Ignet?](#what-is-ignet)
- [快速入门(5 分钟)](#quick-start-5-minutes)
- [数据库概览](#database-at-a-glance)
- [视觉导览](#visual-tour)
- [发现与探索](#discovery-and-exploration)
- [网络构建与比较](#network-construction-and-comparison)
- [AI 增强工具](#ai-augmented-tools)
- [参考与 onboarding](#reference-and-onboarding)
- [使用案例演练](#use-case-walkthroughs)
- [演练 1 — 癌症驱动基因邻居(TP53)](#walkthrough-1--cancer-driver-gene-neighborhood-tp53)
- [演练 2 — 自定义基因集的药物靶点富集](#walkthrough-2--drug-target-enrichment-for-a-custom-gene-set)
- [演练 3 — 两个上下文之间的文献比较](#walkthrough-3--literature-comparison-between-two-contexts)
- [演练 4 — 基于证据的文献 Q&A](#walkthrough-4--evidence-grounded-literature-qa)
- [REST API](#rest-api)
- [curl 示例](#curl-examples)
- [Python 客户端示例](#python-client-examples)
- [JavaScript 客户端示例](#javascript-client-examples)
- [MCP — 模型上下文协议](#mcp--model-context-protocol)
- [连接 Claude Desktop](#connecting-claude-desktop)
- [系统架构](#system-architecture)
- [数据管道](#data-pipeline)
- [自托管](#self-hosting)
- [前提条件](#prerequisites)
- [本地开发](#local-development)
- [生产部署](#production-deployment)
- [环境变量](#environment-variables)
- [数据库架构](#database-schema)
- [性能和基准](#performance-and-benchmarks)
- [常见问题](#faq)
- [故障排除](#troubleshooting)
- [路线图](#roadmap)
- [相关项目](#related-projects)
- [引用](#citation)
- [资金支持](#funding)
- [许可证](#license)
- [联系方式](#contact)
---
## 什么是 Ignet?
Ignet(整合基因网络)是一个 **开放访问** 的网络平台,旨在帮助研究人员从生物医学文献中大规模发现基因-基因相互作用。它做了传统资源不做的事情:
1. **挖掘 PubMed 摘要全文**,使用 BioBERT 预测蛋白质相互作用,以发现任何结构化数据库中未整理的基因-基因关系。
2. **通过自动化每日管道保持更新**,该管道从 NCBI PubMed FTP 服务器获取更新文件,挖掘新摘要,并使用多层冗余避免刷新数据库。
3. **支持 REST 和 MCP**,因此可以从浏览器、脚本或 AI 助手内部使用。
它是原始 2016 Ignet PHP 系统的继任者,后者于 2025-2026 年完全重写为 React 19 SPA + Flask API,并于 2026-04-14 在 [GitHub](https://github.com/hurlab/Ignet) 上公开发布。
无论您是研究 **疫苗机制**、**癌症生物学**、**药物靶点发现**还是 **疾病通路**,Ignet 都能帮助您在几分钟内从研究问题找到基于文献的网络。
- **在线站点:** <https://ignet.org/ignet/>
- **疫苗聚焦姊妹站点:** <https://ignet.org/vignet/>
- **API 基址:** `https://ignet.org/api/v1/`
- **MCP 端点:** `https://ignet.org/api/v1/mcp`
---
## 快速入门(5 分钟)
您不需要安装任何东西即可使用 Ignet。从“从未听说过”到“刚刚从文献中生成了一个网络”的最快路径:
### 1. 打开站点
前往 <https://ignet.org/ignet/>。首页在 1 秒内加载。
### 2. 尝试四个旗舰工具
| 尝试 | 点击此处 | 您将看到 |
| --- | --- | --- |
| 查找基因 | <https://ignet.org/ignet/gene?q=TP53> | TP53 配置文件 + 顶级文献合作伙伴 + 诱导子网络 |
| 从主题构建网络 | <https://ignet.org/ignet/dignet?q=influenza+vaccine> | Cytoscape 渲染的共现网络,带有实体侧栏 |
| 对基因列表运行富集 | <https://ignet.org/ignet/enrichment?genes=TP53,BRCA1,EGFR,MDM2,CDKN1A> | 排名的药物、疾病和 INO 相互作用项 |
| 询问文献问题 | <https://ignet.org/ignet/assistant> | 基于证据的 Q&A,带有 PMID 引用 |
### 3. 从终端击中 API
```bash
# 数据库中目前有多少基因对?
curl -s https://ignet.org/api/v1/stats | python3 -m json.tool
```
```json
{
"total_genes": 18332,
"total_interactions": 5124468,
"total_pmids": 848456,
"total_sentences": 1898655,
"data_last_updated": "2026-05-04",
"data_file_number": 1434
}
```
### 4. 连接 Claude Desktop(可选,额外 2 分钟)
将以下内容添加到您的 Claude Desktop 配置文件(`~/Library/Application Support/Claude/claude_desktop_config.json` 在 macOS 上,`%APPDATA%\Claude\claude_desktop_config.json` 在 Windows 上):
```json
{
"mcpServers": {
"ignet": {
"url": "https://ignet.org/api/v1/mcp",
"transport": "streamable-http"
}
}
}
```
重启 Claude Desktop。现在您有 8 个 Ignet 工具可供模型使用。试试:
> “使用 ignet,找到 PubMed 中与 TP53 共同出现的前 5 个基因,并总结他们的角色。”
这是完整的快速入门。README 的其余部分深入介绍了细节。
---
## 数据库概览
通过 **pubmed26n**(2026 年 5 月发布,文件 1434)挖掘的 PubMed 文献:
| 数量 | 计数 | 源表 |
| --- | ---: | --- |
| 挖掘的 PubMed 摘要 | ~848,000 | `t_gene_pairs` 中的不同 PMID |
| 索引的唯一基因 | 18,332 | 规范化 HGNC + Entrez |
| 基因-基因共现对 | **5,124,468** | `t_gene_pairs`(BioBERT 评分) |
| 证据句子(≥2 个基因提及) | 1,898,655 | `t_sentences` |
| INO 相互作用类型注释 | 42,578,113 | `t_ino` |
| DrugBank 注释 | 7,071,575 | `t_drug` |
| 人类疾病本体注释 | 18,817,630 | `t_hdo` |
| 疫苗本体注释 | 586,455 | `t_vo` |
| 异质共现对 | 663,869 | 六个 `t_cooccurrence_*` 表 |
数据库每天由自动化管道更新,该管道从 NCBI FTP 服务器拉取 PubMed 更新文件,并使用 9 阶段挖掘引擎处理它们。有关详细信息,请参见 [数据管道](#data-pipeline)。
---
## 视觉导览
Ignet 公开 21 个单页工具。下面截图均来自 <https://ignet.org/ignet/> 生产站点。
### 发现与探索
**首页** — 统计数据卡片、工具网格、MCP 卡片和指向疫苗聚焦姊妹站点 Vignet 的链接。

**基因配置文件** — 单基因查找,带有同义词、顶级文献合作伙伴和诱导子网络。下面:加载 TP53 作为示例。

**GenePair 分析** — 对于任意两个基因,查看它们共现的所有 PubMed 句子,按 BioBERT 相互作用置信度排名。下面:TP53 ↔ MDM2。

**探索** — 在无需搜索查询的情况下浏览数据库中最具连接性的基因。

**INO 资源管理器** — 浏览 Interaction Network Ontology(~800 个标准化相互作用类型术语),并跳转到用每个术语注释的基因。

### 网络构建与比较
**Dignet** — 旗舰网络构建工具。输入任何 PubMed 主题,返回 Cytoscape 力导向图,显示共现基因,并带有实体侧栏(基因、药物、疾病、疫苗)和 GraphML/CSV 导出。下面:一个使用“流感疫苗”构建的网络示例。

**比较** — 运行两个主题通过 Dignet 管道,并并排查看它们,带有共享/唯一基因表和文氏图。

**富集** — 给它一个基因列表,获取文献中与超几何 p 值最相关的药物、疾病和 INO 术语。下面:一个 10 个基因肿瘤抑制因子集对抗数据库。

**基因集** — 一个持久的客户端基因购物车,其他工具(富集、BioSummarAI)可以从中获取。

### AI 增强工具
**BioSummarAI** — 选择一个基因列表,获取他们的文献的 GPT-4o 供电的叙述性总结,带有 PMID 引用和聊天式后续。

**分析文本** — 粘贴任意生物医学文本;BioBERT 识别基因提及并预测每对基因是否相互作用。

**文献助手** — 提出一个自然语言问题;助手检索匹配的证据,从数据库传递给 GPT-4o,强制引用,并渲染一个答案,其中每个声明都链接到 PMID。

**报告** — 为查询下载一个多节 HTML 报告(网络图像、证据表、AI 摘要)。

### 参考与 onboarding
**API 文档** — 带有示例有效载体的实时端点目录。该页面还记录了 MCP 的 AI 客户端设置。

**关于** — 团队、PI 配置文件、隶属关系。

**常见问题** — 用户实际提出的问题。

静态页面 **联系方式**、**链接**、**免责声明**、**致谢** 和 **登录** 完成了 SPA。
---
## 使用案例演练
每个演练都是具体的:一个实际的研究问题、确切的按钮点击(或 URL),以及您可以获得的见解类型。
### 演练 1 — 癌症驱动基因邻居(TP53)
**研究问题。** PubMed 论文经常与 TP53(典型的肿瘤抑制基因)一起提及的其他基因是什么,证据是什么?
**步骤。**
1. 打开 <https://ignet.org/ignet/gene?q=TP53>。
2. 页面渲染三个块:
- **报告卡** — 同义词、基因产物、顶级疾病。
- **顶级邻居表** — 按文献共现计数排名。
- **诱导子网络** — TP53 及其顶级邻居的 Cytoscape 力导向布局。
3. 点击 **MDM2**(TP53 的典型负调节因子)。
4. 基因对页面打开,加载 TP53 ↔ MDM2,您会看到实际的 PubMed 句子,同时带有 BioBERT 相互作用预测分数 [0, 1] 和可点击的 PMID。
**为什么它很重要。** 您从“TP53”到排名的文献合作伙伴和 BioBERT 评分证据,只需 3 次点击。手动 PubMed 查询需要数小时的搜索和浏览。
### 演练 2 — 自定义基因集的药物靶点富集
**研究问题。** 我有一个来自 RNA-seq 的 10 个基因肿瘤抑制因子签名。PubMed 中有哪些药物与这些基因一起被研究最多?疾病是什么?
**步骤。**
1. 打开 <https://ignet.org/ignet/enrichment>。
2. 粘贴您的基因列表(每行一个,或逗号分隔):
```
TP53, BRCA1, EGFR, MDM2, CDKN1A, ATM, CHEK2, RB1, PTEN, MYC
```
3. 点击 **分析**。页面调用 `POST /api/v1/enrichment/analyze` 并返回三个排名表:
- **药物富集** — 与您的输入基因共提及最多的药物,具有超几何 p 值。
- **疾病富集** — 类似地排名的人类疾病术语。
- **INO 富集** — 相互作用类型术语(磷酸化、结合、激活等)。
4. 点击任意行深入查看底层 PMID。
**为什么很重要。** 通路数据库(KEGG, Reactome)告诉你什么是**应该**交互;文献富集告诉你实际上**正在一起研究**。药物行尤其新颖 — DrugBank 本身不公开基因集关联。
### 演练 3 — 两个上下文之间的文献比较
**研究问题。** “神经退行性变”和“老化”是否在文献中共享基因签名?还是在不同的上下文中讨论?
**步骤。**
1. 打开 <https://ignet.org/ignet/compare>。
2. 输入两个查询:
- 查询 1:`神经退行性变`
- 查询 2:`老化`
3. 点击 **比较**。页面运行两个查询通过 Dignet 管道(PubMed → 挖掘的句子 → 基因对)并显示:
- **并排显示两个网络**(颜色编码)。
- **文氏图** 唯一 vs. 共享基因。
- **共享基因对** 表,按文献支持度排序。
4. 导出共享列表可供导出以使用 Walkthrough 2。
**为什么它很重要。** 通常需要数周的手动文献综述的系统性评论比较变成了 30 秒的查询。
### 演练 4 — 基于证据的文献 Q&A
**研究问题。** 在脓毒症的背景下,哪些基因与炎症小体的激活最密切相关?
**步骤。**
1. 打开 <https://ignet.org/ignet/assistant>。
2. 照原样输入问题并点击 **Ask**。
3. 助手:
- 使用 GPT-4o 将问题解析为结构化过滤器。
- 从 `t_sentences` 中检索匹配的行,与 `t_gene_pairs` 和相关注释表连接。
- 为 GPT-4o 构造强制引用提示。
- 渲染一个答案,其中 **每个声明都有内联 PMID 徽章**。
4. 点击任何 PMID 以展开底层句子和 BioBERT 分数。
**为什么它很重要。** 与可能产生幻觉的通用 LLM 不同,助手仅从索引证据综合 — 每个断言都是可审计的。
---
## REST API
Ignet 在 `https://ignet.org/api/v1/` 处公开了一个功能齐全的 REST API。
所有读取端点都是 **开放的**(无需 API 密钥),每分钟大约有 100 个请求的软限制。
### curl 示例
```bash
# 数据库健康状况
curl -s https://ignet.org/api/v1/health
# 包括数据货币化标签的聚合统计信息
curl -s https://ignet.org/api/v1/stats | python3 -m json.tool
# 基因搜索(返回 ID、符号、同义词)
curl -s "https://ignet.org/api/v1/genes/search?query=BRCA1&limit=5"
# 基因的顶级共现合作伙伴
curl -s "https://ignet.org/api/v1/genes/neighbors?gene=TP53&limit=20"
# 基因对证据,带有 BioBERT 分数
curl -s "https://ignet.org/api/v1/pairs/pair?gene1=TP53&gene2=MDM2&limit=10"
# 富集分析(POST,带有 JSON 正文)
curl -s -X POST https://ignet.org/api/v1/enrichment/analyze \
-H "Content-Type: application/json" \
-d '{"genes": ["TP53","BRCA1","EGFR","MDM2","CDKN1A"]}'
# 从 PubMed 查询构建 Dignet 网络
curl -s "https://ignet.org/api/v1/dignet/search?q=influenza+vaccine&max_pmids=200"
# INO 相互作用类型目录
curl -s https://ignet.org/api/v1/ino/terms
# 自定义句子上的 BioBERT 预测
curl -s -X POST https://ignet.org/api/v1/pairs/predict \
-H "Content-Type: application/json" \
-d '{"sentence":"TP53 directly binds and inhibits MDM2","gene1":"TP53","gene2":"MDM2"}'
```
### Python 客户端示例
API 使用纯 JSON 通信 — 无需 SDK。以下是用于最常见操作的复制粘贴客户端类。
```python
"""ignet_client.py — Ignet REST API 的最小 Python 包装器。"""
from __future__ import annotations
import requests
from typing import Iterable
class IgnetClient:
def __init__(self, base_url: str = "https://ignet.org/api/v1") -> None:
self.base = base_url.rstrip("/")
self.session = requests.Session()
def _get(self, path: str, **params) -> dict:
r = self.session.get(f"{self.base}/{path.lstrip('/')}", params=params, timeout=30)
r.raise_for_status()
return r.json()
def _post(self, path: str, json: dict) -> dict:
r = self.session.post(f"{self.base}/{path.lstrip('/')}", json=json, timeout=60)
r.raise_for_status()
return r.json()
def stats(self) -> dict:
return self._get("stats")
def gene_search(self, query: str, limit: int = 1) -> dict:
return self._get("genes/search", query=query, limit=limit)
def gene_neighbors(self, gene: str, limit: int = 20) -> dict:
return self._get("genes/neighbors", gene=gene, limit=limit)
def pair_evidence(self, gene1: str, gene2: str, limit: int = 50) -> dict:
return self._get("pairs/pair", gene1=gene1, gene2=gene2, limit=limit)
def enrichment(self, genes: Iterable[str]) -> dict:
return self._post("enrichment/analyze", json={"genes": list(genes)})
def dignet(self, query: str, max_pmids: int = 200) -> dict:
return self._get("dignet/search", q=query, max_pmids=max_pmids)
if __name__ == "__main__":
c = IgnetClient()
print("数据截止日期:", c.stats()["data_last_updated"])
# TP53 的前 5 个邻居
for n in c.gene_neighbors("TP53", limit=5)["neighbors"][:5]:
print(f" TP53 ↔ {n['gene']} (PMIDs: {n['count']})")
# 自定义签名药物的富集
enr = c.enrichment(["TP53", "BRCA1", "EGFR", "MDM2", "CDKN1A"])
for d in enr["drugs"][:5]:
print(f" 药物:{d['name']} 覆盖率={d['overlap']} p={d['pvalue']:.2e}")
```
Java客户端示例
```javascript
// 浏览器或 Node 18+(使用原生 fetch)
const IGNET = "https://ignet.org/api/v1";
async function igGet(path, params = {}) {
const qs = new URLSearchParams(params).toString();
const url = `${IGNET}/${path}${ `?${qs}` : ""}`;
const r = await fetch(url);
if (!r.ok) throw new Error(`${r.status} ${r.statusText} on ${url}`);
return r.json();
}
async function igPost(path, body) {
const r = await fetch(`${IGNET}/${path}`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(body),
});
(!r.ok) throw new Error(`${r.statusr.statusText}`);
return r.json();
}
// 示例
const stats = await igGet("stats");
const neighbors = await igGet("genes/neighbors", { "TP53", limit: 10 });
const evidence = await igGet("pairs/pair", { gene1: "TP53", gene2: "MDM2" });
const enrich = await igPost("enrichment/analyze",
{ genes: ["TP53","BRCA1","EGFR"] });
console.log("数据更新时间:", stats.data_last_updated);
```
完整的端点目录,请在浏览器中访问 <https://ignet.org/ignet/api-docs>,这是一个实时、自文档的游览。
---
## MCP — 模型上下文协议
Ignet 在 `https://ignet.org/api/v1/mcp` 处发布了一个**公共 MCP 端点**,该端点实现了 [模型上下文协议](https://spec.modelcontextprotocol.io/),基于流式 HTTP / JSON-RPC 2.0。这使得任何支持 MCP 的 AI 助手 Ignet 作为一流工具调用。
### 暴露
| 工具 | 功能 |
|---|---|
| `ignet_search_genes` | 按符号、名称或同义词搜索基因 |
| `ignet_get_gene_neighbors` | 基因的顶部共现伙伴 |
| `ignet_get_gene_pair_evidence` | 基因对的证据句子,附带 BioBERT 分数 |
| `ignet_get_stats` | 数据库范围的计数器和数据更新时间 |
| `ignet_get_enrichment` | 基因列表的药物 / 疾病 / INO 富集分析 |
| `vignet_search_vaccines` | 搜索疫苗本体(Vignet 桥接) |
| `vignet_get_vaccine_genes` | 与疫苗相关的基因(Vignet 桥| `_get_vaccine | 疫苗范围的计数器( 桥接) |
### 连接 Claude 桌面版
1. 打开 `claude_desktop_config.json`(`设置 → 开发者 → 编辑配置`)。
2. 在 `mcpServers` 下添加 `ignet` 服务器条目:
```json
{
"Servers": {
"ignet": {
" "https://ignet.org1/mcp",
"transport": "streamable-http"
}
}
}
```
3. 重启 Claude 桌面版。
4. 通过询问 Claude 验证:“`ignet` 服务器暴露了哪些工具?”——Claude 将列出所有 8 个工具。
### 示例查询
> "使用 `ignet`,给我 `BRCA1` 在 PubMed 中共现的 top 10 个基因,并为每个基因总结文献中关于它们的内容。"
> "对这些基因运行富集分析:`TNF`、`IL、`IL1B`、`NLRP3`。哪些药物和疾病与它们最相关?"
> "TP53` ↔ `MDM2` 交互的最强 BioBERT 评分句子,然后解释为什么它对癌症治疗很重要。"
Claude(或任何 的助手)将自动(a)发现工具,(b)调用它们,(c)在其引用 PMID。
### 原始 MCP 调用
如果您协议:
```bash
# 列出
curl -s -X POST https://ignet/v1/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list":{}}'
# 调用工具
curl -s POST https://ignet.org/api/v1/mcp -H "Content-Type: application/json" \
d '{
"jsonrpc":"2.id":2,
"method":"tools/call",
"params":{
"name":"ignet_get_gene_neighbors",
"arguments":{"gene":"TP53","limit":10}
}
}'
```
---
## 系统架构
```
Internet
│
┌────▼─────┐
│ Apache │ TLS, /ignet/, /vignet/, /api/v1/
│ :443 │
└─┬──┬───┬─┘
┌─────────────┘ │ └─────────────┐
│ │ │
┌─────────▼─────────┐ ┌───▼──────────────┐ │
│ Ignet 2.0 SPA │ │ Vignet SPA │ │
│ React 19 + Vite 8 │ │ (same stack) │ │
│ 21 pages │ │ 14 pages │ │
└─────────┬──────────┘ └────────┬─────────┘ │
│ fetch /api/v1/* │ │
└──────────┬───────────┘ │
│ │
┌──────────▼────────────────────────▼──┐
│ Flask + Waitress API │
│ 127.0.0.1:9637 │
│ 12 route files in api/routes/ │
└────┬───────────┬──────────┬──────────┘
│ │ │
┌────────▼──┐ ┌─────▼─────┐ ┌─▼────────────┐
│ MariaDB │ │ Redis │ │ AI services │
│ db=ignet │ │ stats │ │ BioBERT :9635│
│ 17 tables │ │ cache 24h │ │ BioSummarAI │
│ │ │ │ │ :9636 │
└────────────┘ └────────────┘ └──────┬───────┘
│
┌────────▼──────┐
│ OpenAI GPT-4o │
└────────────────┘
```
**两个单页应用,一个数据库。** Ignet 和 [Vignet](https://github.com/hurlab/Vignet) 都读取同一个 `MariaDB.ignet` 数据库,通过同一个 Flask API。它们的区别仅在于浏览器接收的 React 构建。Vignet "视图"是一个查询时投影,通过 `t_vo` 成员资格约束并遍历 `t_vo_hierarchy` 树来聚合子疫苗证据。
有关完整的架构文档,请参见 [`docs/IGNET_VIGNET_INTRODUCTION.md`](docs/IGNET_VIGNET_INTRODUCTION.md)。
---
## 数据管道
Ignet 的新鲜度来自于每天自动运行的 **PubMed 更新管道**,位于生产服务器的 `/home/juhur/IgnetDailyUpdate/` 目录下。该管道在每天的 02:00 本地时间从 `cron` 运行,并处理一个 NCBI PubMed 更新文件,直到完成,然后再获取下一个文件。
### 管道阶段
1. **下载** 一个更新文件(`pubmed26nNNNN.xml.gz`)从 `ftp.ncbi.nlm.nih.gov/pubmed/updatefiles/`。跟踪器 `last_processed_number.txt` 确保不会重新处理旧文件。
2. **预处理** XML 通过九个引擎阶段:提取 PMID,组织每个 PMID 的详细信息,分割句子,分配全局句子 ID,构建句子 ID → PMID 索引等。
3. **挖掘** 解析后的句子,应用五个命名过滤器:
- 主机(基因)- 基因名称挖掘
- VO(疫苗)- 疫苗名称挖掘
- HDO(疾病)- 疾病名称挖掘(Regexp::Trie 编译正则表达式,比逐项迭代快 2,372 倍)
- DrugBank(药物)- 药物名称挖掘
- INO(交互)- 交互类型挖掘(最后运行以利用实体过滤器)
4. **评分** 每个基因对使用 BioBERT(端口 9635)进行交互置信度。
5. **生成** 文件内共现对,跨六种实体对类型(VO-Gene,VO-Drug,VO-HDO,Drug-Gene,Drug-HDO,HDO-Gene)。
6. **UPS 到 MariaDB 批次的 DELETE-LOAD 模式。
### 冗余避免(四层)
这使得每天运行更新管道是安全的:
| 层 | 机制 | 保证内容 |
|---|---|---|
| **文件级** | `last_processed_number.txt` 仅在成功时推进;运行时断言如果未推进,则中止 | 绝不跳过文件;绝不重新处理已成功加载的文件 |
| **PMID 级** | 加载前:`DELETE` 当前文件中所有 PMID 的行,从六个挖掘表中 | 修订后的摘要原子性替换陈旧注释 |
| **句子级** | 句子 ID 分配为 `MAX(sentence_id) + 1` 每文件 | 句子 ID 绝不冲突 |
| **进程级** | 基于 PID 的锁定文件(`.pipeline.lock`)在退出陷阱时自动释放 | 没有并发的 cron 调用;崩溃不会使锁定文件滞留 |
### 故障模式行为
| 故障 | 跟踪器 | 数据库状态 | 恢复 |
|---|---|---|---|
| 下载失败 | 未推进 | 不受影响 | 下一次 cron 重试相同文件 |
| 挖掘失败 | 未推进 | 不受影响 | 下一次 cron 重新挖掘 |
| BioBERT 失败 | n/a(非致命) | `score = NULL` 对于新行 | 稍后可以回填 |
| 数据库 DELETE 成功,LOAD 失败 | 未推进 | 部分 | 下一次 cron 重新 DELETE(无操作)并重新 LOAD |
| 进程崩溃 | 未推进 | 锁定文件自动释放通过退出陷阱 | 下一次 cron 重试 |
| 并发 cron | n/a | 不受影响 | 第二个实例通过锁定退出 |
更详细的数据管道参考(附带代码级引用)位于 [`docs/IGNET_VIGNET_INTRODUCTION.md` §7](docs/IGNET_VIGNET_INTRODUCTION.md#7-daily-pubmed-update-pipeline)。
---
## 自主部署
您不需要自主部署即可使用 Ignet — 实时网站是开放的。自主部署有意义的是,如果您想 fork、扩展、运行私有文献或在内部镜像数据库。
### 先决条件
- **Node.js 22+** (适用于 React 前端;生产环境中测试为 24.9)
- **Python 3.12+** (适用于 Flask API)
- **MariaDB 10.6+** (MySQL 8 语义的替代品)
- **Redis 7+** (可选但推荐 — 24 小时统计数据缓存)
- **Apache 2.4+** 或 Nginx(生产环境反向代理,启用 TLS)
- 约 50 GB 磁盘用于数据库(最大表中 500 万+行)
- 约 16 GB RAM(8 GB 用于 MariaDB InnoDB 缓冲池;其余用于 Python + Node)
### 本地开发
```bash
# 1. 克隆
git clone https://github.com/hurlab/Ignet.git
cd Ignet
# 2. 前端
cd frontend
npm install
npm run dev # Vite 开发服务器,访问 http://localhost:5173
# 或生产环境构建:
npm run build # 导出到 ../dist-react/
# 3. 后端
cd ../api
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
# 配置环境变量(参见下面的环境变量部分)
python run.py Waitress,访问 http://localhost:9637
# 4. 数据库(导入储)
mysql -u root -p < ../scripts/schema_ignet.sql
# (批量数据加载特定于服务器;联系维护人员获取传输文件)
```
Vite 开发服务器代理 `/api/v1/*` 到 Flask 后端;在 `frontend/.env` 中设置 `VITE_API_PROXY_TARGET=http://127.0.0.1:9637`,后端运行在不同的。
### 生产环境部署
生产环境运行 **systemd** 服务 **Apache** 后面,启用 TLS。没有 Docker 或 Vercel 支持 — 这些引用在早期版本的 README 中是理想情况,现已删除。
API 的 systemd 单元示例(`/etc/systemd/system/ignet-api.service`):
```ini
[Unit]
Description=Ignet REST API
After=network.target mariadb.service redis.service
[Service]
Type=simple
User=ignet
WorkingDirectory=/opt/ignet/api
ExecStart=/opt/ignet/api/venv/bin/python run.py
EnvironmentFile=/opt/ignet/biosummarAI/.env
Environment=PYTHONUNBUFFERED=1
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
```
类似的单元存在于 `ignet-biobert.service`(端口 9635)和 `ignet-biosummarai.service`(端口 9636)。
Apache 反向代理 `/api/v1/*` 到 `127.0.0.1:9637` 并从 `dist-react/` 提供 SPA。`dist-react/` 中的 `.htaccess` 提供了 SPA 的回退:
```apache
Options -MultiViews
DirectoryIndex index.html
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.html [L]
</IfModule>
```
### 环境变量
创建 `biosummarAI/.env`。API 在启动时通过 systemd中的 `Environment 加载此文件。
```bash
# 数据库_HOST=localhost
DB_USER=ignet
DB_PASSWORD=<设置我>
DB_DATABASE=ignet
# OpenAI(用于 BioSummarAI / 助手)
OPENAI_API_KEY=sk-...
# 认证 — 必须之间保持稳定 使用帮助程序生成一次并持久化;轮换这些会使 BYOK 密钥不可读。
JWT_SECRET=<运行:scripts/generate_secrets.sh>
FERNET_KEY=<运行:scripts/generate_secrets.sh>
# 管道跟踪器(/v1/stats数据更新标签)
IGNET_PIPELINE_TRACKER=/pipeline_tracker=/var/lib/ignet/last_processed_number.txt
IGNET_PUBMED_FILE_DIR=/var/lib/ignet/pubmed-files
# 可选:NCBI 密钥,用于提高 esefetch 速率限制
NC_KEY=
```
帮助程序生成 JWT 和 Fernet 机密:
```bash
bash scripts/generate_secrets.sh >> biosummarAI/.env
```
---
## 数据库模式
完整的模式位于 [`scripts/schema_ignet.sql`](scripts/schema_)。17 个核心表的亮点 `pubmed26n` **下划线命名**): 表 | 行数 | 存储内容 |
|---|---:|---|
| `t` | 5,124, 基因对共现(主键 `id`,外键 `sentence_id `t_sentences`,BioBERT `score`) |
| `t_sentences` | 1,898,655 | 具有 ≥2 个基因提及的证据句子 |
| `t_ino` | 42,578,113 | INO 交互类型注释 |
| `t_vo` | 586,455 | 疫苗本体注释 |
| `t_drug` | 7,071,575 | DrugBank |
t_hdo` | 18,817,630 | 人类疾病本体注释 |
|_hierarchy` |796 | VO 本体树(父子) |
| `t_vo_has_gene_data` | 666 | 具有任何基因证据的 VO包括祖先) |
| `t_cooccurrence_vo_gene` | 7,960 | 疫苗 ↔ 基因边 |
| `t_cooccurrence_vo` | 6,495疫苗 ↔ 药物边 |
t_cooccurrence_vo_hdo`9,990 | 疫 疾病边 |
| `t_cooccurrence_drug_gene` | 178,784 | 药物 ↔ 基因边 |
| `t_cooccurrence_drug_hdo` | 167,691 | 药物 ↔ 疾病边 |
| `t_cooccurrence_hdo_gene` | 292,949 | 疾病 ↔ 基因边 |
命名约定:所有 2.0 版本列 **下划线命名** (`pmid`, `sentence_id`, `gene_symbol1`, `gene_match1`, `score`, `has_vaccine`, `ino_id`, `vo_id`)。2026-03 次迁移自 CamelCase 文档位于 [`scripts/01_rename_tables.sql`](scripts/01_rename_tables.sql)。
---
## 性能和基准
| 操作 | 典型延迟 |
|---|---|
| `/api/v1/stats`(缓存) | ~5 毫秒 |
| `/api/v1/genes/neighbors?gene=TP53` | ~80 毫秒 |
| `/api/v1/pairs/pair?gene1=…&gene2=…`(分页) | ~120 毫秒 |
| `/api/v1/enrichment/analyze`(10 个基因列表) | ~400 毫秒 |
| `/api/v1/dignet/search?q=…`(网络构建,200 PMID) | ~3–8 秒 |
| MCP `tools/list` | ~10 毫秒 |
| 每天的数据管道(一个 PubMed 更新文件 ~20 分钟端到端 |
| HDO 匹配与 `Regexp::Trie` 与逐项迭代 | **2,372×** 加速 |
使用中的 InnoDB 调优:`innodb_buffer_pool_size= `innodb_log_file_size=512M`.
---
## 常见问题
**问:Ignet 中的基因相互作用是否经过实验验证?**
答:否。Ignet 从 PubMed 摘要中提取共现模式,并使用 BioBERT 评分以预测相互作用的可能性。每个结果都链接回其您可以从主要文献中验证。请将 Ignet 视为假设生成工具,而不是精选数据库。
**问:Ignet 与 STRING、GeneMANIA 或 PubTator 有何不同?**
答:STRING 和 GeneMANIA 汇总了精选数据库和计算预测;它们按发布计划更新,而不是每天。PubTator 注释实体,但不构建可查询的交互网络。Ignet (a) 以句子粒度挖掘原始 PubMed 摘要,(b) 为每对基因对评分使用 BioBERT,(c) 配备一个 MCP 端点供 AI 助手使用,并且 (d) 每天更新。
**问:PubMed 论文出现在 Ignet 中的延迟是多少?**
答:NCBI 每天发布更新文件,通常在索引后几天内。管道每天 02:00 运行。根据 PubMed 索引到 Ignet 可见的时间,预计延迟 ~2–4 天。
**问:我可以运行 Ignet 来对抗私有(尚未发布)的文献吗?**
答:是的 — 复刻仓库并将管道指向您自己的 XML 文件。挖掘引擎 (`/home/juhur/IgnetDailyUpdate/sciminer_engine/`) 接受 PubMed 格式的 XML。
**问:有 Python SDK 吗?**
答:还没有 —纯 JSON,因此 30 行包装器就足够了(参见 [Python 客户端示例](#python-client-examples))。正式的 SDK 正在计划中。
**问:BioBERT 究竟评分什么?**
答:对于包含两个基因提及的每个句子,BioBERT 将提及替换为 `PROTEIN1` / `PROTEIN2`,可选地用 `[INT]…[/INT]` 括注交互动词,并输出一个 sigmoid 置信度,在 [0, 1] 中,说明句子是否描述蛋白质-蛋白质相互作用。模型:[`metalrt/ignet-biobert://huggingface.co/metalrt/ignet-biobert).
**Ignet 和 Vignet 之间是什么关系?**
答:Vignet 是一个姐妹站点,位于 <https://ignet.org/vignet/>,具有疫苗聚焦的信息架构。它运行在 **相同的** 数据库和 **相同的** Flask API 上。仓库位于 <https://github.com/hurlab/Vignet>.
**问:如何在论文中引用 Ignet答:参见下面的 [引用)。
---
## 故障排除
**助手返回“未找到证据仅从索引句子中综合信息。如果您的问题非常狭窄或关于一个主题,PubMed 覆盖范围很小,请尝试扩大查询范围或使用 Dignet 确认该主题是否有文献。
**API 返回 429(速率限制)。**
软限制约为每分钟 100 请求/ IP。对于更重的用法,请批量请求或通过 [联系](#contact) 私有部署。
**自主部署:`data_last_updated` 在 `/api/v1/stats` 中返回 `null`。**
检查 `IGNET_PIPELINE_TRACKER` 和 `IGNET_PUBMED_FILE_DIR` 在 `biosummarAI/.env` 中,并确认跟踪器文件存在并包含有效整数。
**自主部署:SPA 在直接路由导航时返回 404(例如 `/gene`)。**
您缺少 SPA `.htaccess` 重写。复制存储库中的 `dist-react/.htaccess` 到您的 `dist-react/` 部署中。
**MCP:Claude 桌面版显示“`tools/list` 失败。”**
通过 [MCP — 模型上下文协议](#mcp--模型上下文协议) 中的原始 `curl` 验证。如果有效 桌面版无效,请重启桌面版应用,并再次检查 `transport` 是否为 `streamable-http`(而不是 `stdio`)。
## 路线图
- [ ] **PMC全文挖掘** — 将挖掘范围从摘要扩展至PubMed Central的开放访问全文。
- [ ] **基于图嵌入的搜索** — 为异质知识图谱中的相似性搜索预训练节点嵌入。
- [ ] **显式因果模型** — 超越共现,提取方向性调控关系。
- [ ] **Cytoscape桌面导出** — 直接导出`.cys`文件用于下游分析。
- [ ] **更多本体** — 基因本体、Reactome、KEGG通路术语。
- [ ] **Python软件开发工具包** — 发布`pip install ignet-client`。
- [ ] **引用-DOI Zenodo工作流** — 正式的DOI版本发布。
- [ ] **自托管快速启动** — 带有示例数据集的Docker Compose捆绑包。
---
## 相关项目
- **[Vignet](https://github.com/hurlab/Vignet)** — 以疫苗为重点的姊妹网站,运行在相同的后端。
- **[VIOLIN](http://www.violinet.org/)** — 综合疫苗信息和本体知识库(由同一NIH资助)。
- **[BioBERT](https://github.com/dmis-lab/biobert)** — Ignet交互评分的生物医学BERT模型。
- **[交互网络本体(INO)](https://github.com/INO-ontology/ino)** — 分子交互的标准词汇。
- **[疫苗本体(VO)](https://github.com/vaccineontology/VO)** — Vignet的组织本体。
- **[模型上下文协议](https://spec.modelcontextprotocol.io/)** — Ignet的MCP端点实现的协议。
---
## 引用
如果您在已发表的作品中使用Ignet,请引用:
```bibtex
@misc{ignet2026,
title = {Ignet:一个整合的基因网络数据库,基于PubMed文献构建,带有BioBERT评分和公共MCP端点},
author = {Hur, Junguk and He, Yongqun and Ozgur, Arzucan},
year = {2026},
howpublished = {\url{https://ignet.org/ignet/}},
note = {公共版本2026-04-14;支持项目:NIH/NIAID U24AI171008(VIOLIN 2.0)}
}
```
引用示例:
> “基因交互网络使用Ignet构建,这是一个整合的基因网络数据库,从848,456篇PubMed摘要中挖掘,基于BioBERT的蛋白质交互评分(Hur等,2026)。数据库(`pubmed26n`,截至2026年5月)包含510万基因-基因共现对和190万证据句子,来自INO、DrugBank、HDO和疫苗本体的本体注释。”
---
## 资金支持
- **NIH/NIAID U24AI171008** — VIOLIN 2.0(疫苗信息和本体链接知识库)
- 北达科他州立大学 — 生物医学科学系
- 密歇根大学 — 医学院
- 博加齐奇大学 — 计算机工程系
---
## 许可证
[MIT License](LICENSE)。Ignet数据来源于公开可用的PubMed摘要和本体资源,为研究和教育目的提供,不保证任何形式的担保。
---
## 联系方式
- **网站:** <https://ignet.org/ignet/>
- **问题:** <https://github.com/hurlab/Ignet/issues>
- **电子邮件:** <hurlabshared@gmail.com>
- **用户手册:** [`docs/USER_MANUAL.md`](docs/USER_MANUAL.md)
- **稿件准备介绍:** [`docs/IGNET_VIGNET_INTRODUCTION.md`](docs/IGNET_VIGNET_INTRODUCTION.md) / [HTML版本](docs/IGNET_VIGNET_INTRODUCTION.html)
- **API文档(在线):** <https://ignet.org/ignet/api-docs>
---
## 团队
- **Junguk Hur, Ph.D.** — 实验室负责人,北达科他州立大学(生物医学科学)
- **Yongqun "Oliver" He, Ph.D.** — 联合负责人,密歇根大学(医学院)
- **Arzucan Ozgur, Ph.D.** — 自然语言处理合作者,博加齐奇大学(计算机工程)
- Hur实验室和贡献者社区
---
## 更新日志
### 2.1.0 — 2026-04-14(公开版本)
- **代码仓库公开**,完整历史记录重写,清理敏感信息,独立安全审计。
- 新增`scripts/generate_secrets.sh`脚本,供分叉和部署用户使用。
- 完善公共MCP端点和所有8种工具的文档。
- 管道跟踪器位置通过`IGNET_PIPELINE_TRACKER`配置。
### 2.0.0 — 2026-03(Ignet 2.0发布)
- 完整重写,从PHP迁移至**React 19 + Flask**单页应用。
- 数据库迁移至`pubmed26n`(约848K摘要,2026年5月快照)。
- 所有17个核心表的Snake_case模式。
- 新增Vignet姊妹网站,网址:<https://ignet.org/vignet/>。
- 新增文献助手(RAG)、BioSummarAI、文本分析、比较、富集、INO资源管理器、基因集、报告。
- 新增30+端点REST API和8工具MCP端点。
- 具备四层冗余避免功能的每日PubMed更新管道。
- 支持跨实体网络的六个异质共现表。
### 1.0 — 2016
- Ignet初始版本发布,使用PHP,包含Dignet、基因搜索、基因对功能。
- 基于BioBERT的基因提取。
- 约25年PubMed摘要挖掘。
---
**最近更新:** 2026-05-12
**数据库版本:** `pubmed26n`(文件1434,2026年5月4日)
**构建目标:** 研究影响力。
MCP 配置
以下是此 MCP Server 的配置信息,可直接复制到 Cursor 或其他 MCP 客户端中使用。
mcp.json
连接信息
猜你喜欢
暂无推荐服务器