先看结论
审稿人看验证部分时,主要核对下面五件事。前三件在计算开始前就要定下来。
WFCMS《网络药理学评价方法指南》的解读文章统计了 CNKI 收录的网络药理学论文(截至 2021 年 6 月):对结果做过实验验证的不足 30%,其中约三分之一用了体内外实验,多数研究只通过文献推测结果。审稿人见过大量只做对接的稿件,对接已不被当作验证。
成分有化学依据
核心成分要能证明确实存在于所用药材或制剂中,并有含量数据:自测 UHPLC-HRMS,或引用同一药材的定量文献。只来自数据库成分表的成分,最容易被要求补证据。
阈值预先设定且写明出处
OB、DL、靶点预测分数、GeneCards 分数、STRING 置信度和核心靶点规则,在看到结果前定好,方法里写清数据库版本和检索日期。看到结果数量后再改阈值,是审稿人最容易发现的问题。
对接有阳性对照和重对接
定位点对接,先用共晶配体做重对接验证参数,再用已知抑制剂作阳性对照。成分的打分和阳性对照比较。
分子动力学有独立副本
每个复合物至少 3 条独立模拟,报告均值和标准差,阳性对照用同样方案模拟。单条轨迹的 RMSD 曲线不足以说明结合稳定。
核心成分-靶点有实验
计算结果最终要落到实验上:分子水平结合或酶活实验(SPR、MST、ITC、酶活抑制)验证直接作用,细胞或动物实验验证通路。Frontiers in Pharmacology 和 Drug Design, Development and Therapy 的投稿要求都把实验验证作为送审前提。
全流程
工具版本为 2026-10-10 的当前版本。第 1、9、10、12 步决定验证部分是否站得住,第 2 到 8 步审稿人主要检查阈值和版本。
| 步骤 | 输入 | 工具 | 输出 | 论文图 |
|---|---|---|---|---|
| 1 成分收集与确认 | 药材或方剂名 | HERB 2.0、BATMAN-TCM 2.0、TCMSP、文献;有条件时 UHPLC-HRMS 自测 | 成分表:名称、PubChem CID、InChIKey、来源、含量 | 成分鉴定色谱图;成分来源表 |
| 2 ADME 筛选 | 成分 SMILES | TCMSP 的 OB/DL;SwissADME | 保留成分表与阈值说明 | 成分筛选表 |
| 3 成分靶点 | 成分 SMILES | SwissTargetPrediction、BATMAN-TCM 2.0(已知与预测分开)、PharmMapper | 成分-靶点对(UniProt ID 转为基因符号) | 成分-靶点网络 |
| 4 疾病靶点 | MeSH 标准疾病名;GEO 数据集 | OMIM、DisGeNET curated、GeneCards;GEO 差异分析 | 疾病基因表 | 疾病基因来源韦恩图 |
| 5 取交集 | 两个基因集合(统一为 HGNC 符号) | R 或 Python | 交集基因 | 成分靶点与疾病靶点韦恩图 |
| 6 PPI 与核心靶点 | 交集基因 | STRING 12.5、Cytoscape 3.10.5 + stringApp 2.2 | 网络 tsv、拓扑参数表 | PPI 网络图;核心靶点度值条形图 |
| 7 药材-成分-靶点-通路网络 | 第 1 到 8 步结果 | Cytoscape | 网络文件 | 多层网络图 |
| 8 GO/KEGG 富集 | 交集基因 + 背景基因集 | clusterProfiler | 富集表(含校正后 P 值) | 气泡图或条形图 |
| 9 分子对接 | 核心靶点 PDB 结构;核心成分与阳性对照的 3D 结构 | AutoDock Vina 1.2.7、Meeko | 打分表、对接姿态、重对接 RMSD | 打分热图(含阳性对照);2D/3D 相互作用图;重对接叠合图 |
| 10 分子动力学 | 对接复合物(含阳性对照) | GROMACS 2026;AmberTools/ACPYPE 或 OpenFF 生成配体参数 | 每个复合物至少 3 条轨迹 | 配体 RMSD、口袋 RMSF、氢键与接触占有率(均值 ± 标准差) |
| 11 结合自由能 | MD 轨迹 | gmx_MMPBSA 1.7.0 | ΔG 分项与残基分解 | 能量分项柱状图;残基贡献图 |
| 12 实验验证 | 核心成分与核心靶点 | SPR、MST、ITC、酶活;细胞与动物实验 | 实验数据 | 结合曲线;Western blot 等 |
数据库
下表按 2026-10-10 实际访问结果整理。方法部分对每个数据库写三项:版本或网址、检索日期、筛选条件。
WFCMS 指南解读文章检索了 CNKI 中以人参为对象的 13 篇网络药理学论文:即使用同一个数据库、同一组阈值,纳入的成分数也不一致,原因包括阈值改动和文献补充成分未说明。TCMSP 中 OB > 30% 且 DL > 0.18 的人参成分共 22 个,其中有预测靶点的 17 个。保存原始导出表并在附件中提供,是让别人能复现你的成分数和靶点数的最直接做法。
| 数据库 | 2026-10 现状 | 使用经验 | 可替代或补充 |
|---|---|---|---|
| TCMSP | tcmsp-e.com 改为门户页:旧版在 old.tcmsp-e.com(页脚版本 2.3,更新日志最近一条为 2025-04-20);新版 TCMSP 9.0.1 在 next.tcmsp-e.com,完整分析工具需会员 | 新版生成的方法段默认 OB ≥ 15%、DL ≥ 0.11,和旧版论文常用的 30%/0.18 不同,同一篇论文不要混用两版数据;旧版靶点表只能逐页复制,经验帖多用脚本整理,导出后核对靶点数 | HERB 2.0、BATMAN-TCM 2.0 |
| HERB 2.0 | herb.ac.cn/v2,2024 年 11 月发表于 NAR | 新增 8,558 项临床试验和 8,032 项 meta 分析的整理,适合给药材或成分找临床与实验证据,回应“成分是否有依据”的质疑 | TCMSP、文献 |
| BATMAN-TCM 2.0 | bionet.ncpsb.org.cn/batman-tcm,NAR 2024 | 已知成分-靶点相互作用 17,068 条,预测约 232 万条;Download 页可批量下载,论文中把已知和预测靶点分开报告 | SwissTargetPrediction |
| SwissTargetPrediction | 可访问,最近一次方法更新为 2019 年 | 只支持人、大鼠、小鼠;输入用 PubChem 的 SMILES,比按名称检索更不容易出错;Probability 的含义见下一节 | BATMAN-TCM 2.0 预测部分 |
| PharmMapper | lilab-ecust.cn/pharmmapper 可访问,最近一次方法更新为 2017 年 | 基于药效团反向匹配,任务需要排队;结果是 UniProt ID,用 UniProt ID mapping 转基因符号时只保留人源 reviewed 条目 | SwissTargetPrediction |
| GeneCards | 可访问,搜索结果页 Export 可导出 CSV | Relevance score 是搜索相关性得分,不同疾病检索之间不可比;检索前先在 MeSH 确认疾病标准名,同义词分别检索后合并 | OMIM、DisGeNET curated、GEO 差异基因 |
| OMIM | 网页检索可用 | 批量下载 genemap2 需先申请 API key,审核可能要几个工作日,赶进度时直接网页检索导出;以孟德尔遗传为主,复杂病基因数少,检索不到属正常 | DisGeNET curated |
| DisGeNET | disgenet.org 已跳转到 disgenet.com | 免费学术账号只能看到 curated 数据,旧教程“全部来源 + score 阈值”的结果用免费账号无法复现;方法中写明用的是 curated 数据 | OMIM、GeneCards |
| STRING | 当前版本 12.5 | 用 version-12-5.string-db.org 固定版本,避免投稿后升级导致结果对不上;combined score 表示相互作用为真的可能性,不表示作用强度 | — |
| Cytoscape 与插件 | Cytoscape 3.10.5(2026-09-29);stringApp 2.2.0;cytoHubba 的 App Store 最新版发布于 2017 年,CytoNCA 为 2014 年,MCODE 2.0.3 为 2023 年 | stringApp 2.2.0 的发布说明称这一版本用于保证 2024-12-31 之后继续可用,导入失败先升级 stringApp;度值等基本拓扑参数用内置 Analyze Network 即可得到 | Python networkx、R igraph |
阈值
多数阈值没有统一标准。可靠的做法是选一个有出处的值,在看到结果前固定,并在方法中写明理由。
| 参数 | 常见经验做法 | 出处 | 问题 | 建议写法 |
|---|---|---|---|---|
| OB / DL | OB ≥ 30%、DL ≥ 0.18;成分太少时降到 OB ≥ 20% | DL 0.18 是 TCMSP 定义的“类药”水平;TCMSP 参数说明页建议的筛选标准是 OB ≥ 20%、DL ≥ 0.1;TCMSP 原始论文的甘草示例用 OB ≥ 40%、DL ≥ 0.18 | OB 是口服生物利用度的预测值,注射剂和外用制剂不适用;按成分数量调阈值属于事后选择 | 写明 TCMSP 版本和阈值来源;对保留的核心成分补充药代动力学或血中成分文献 |
| SwissTargetPrediction Probability | 每个成分取前 15 位;或 Probability ≥ 0.1、> 0 | Probability 是“一个活性分子以该蛋白为靶点”的概率,不是化合物有活性的概率;外部测试中 72% 的分子在前 15 位里至少命中一个已知靶点,第 1 位命中 28% | 前 15 位里多数是假阳性 | 对所有成分统一取前 15 位,并与 BATMAN-TCM 已知靶点比对 |
| GeneCards Relevance score | ≥ 1、≥ 中位数、≥ 2 倍中位数 | 无;分数来自 GeneCards 搜索引擎的文本相关性 | 分数高只说明基因条目里提到该疾病的程度高,不表示因果关系;不同检索之间不可比 | 以 OMIM、DisGeNET curated 或疾病 GEO 差异基因为主,GeneCards 只作补充,写明检索词 |
| STRING combined score | 0.4 或 0.9,并去掉 Textmining 通道 | STRING 把 ≥ 0.400 称为 medium confidence | 高分边可能只有文本挖掘证据(见下一节实测) | 写明 STRING 版本、阈值和使用的证据通道 |
| 核心靶点 | 度值 ≥ 中位数;或度值、介数、紧密度都 ≥ 中位数;cytoHubba MCC 前 10 | 经验做法;WFCMS 指南解读指出拓扑筛选条件“较为混乱,缺少参考依据” | 度值偏向被研究得多的基因;小网络中中位数处大量并列 | 预先确定一种方法,并用疾病组学数据或文献对核心靶点做独立核对 |
PPI 网络
常规做法是把成分靶点和疾病靶点统一为 HGNC 基因符号后取交集,交集基因提交 STRING,在 Cytoscape 中计算拓扑参数,取度值不低于中位数的节点作核心靶点。
这样得到的核心靶点高度同质。Diao 等 2026 年统计了 1,038 篇天然产物网络药理学研究(2023 年 10 月至 2024 年 6 月发表):AKT1 出现在 48.8% 研究的核心靶点中,TNF 为 39.1%,EGFR 为 34.8%;只依赖数据库的研究中 AKT1 占 54.9%,整合了组学或实验数据的研究中为 19.6%。槲皮素在两类研究中分别占 71.9% 和 42.3%。
原因之一是 STRING 的文本挖掘证据偏向被研究得多的基因。下面的脚本先用 get_string_ids 核对每个基因符号映射到的蛋白,再从固定版本的 STRING API 取网络,标出只有文本挖掘证据的边,并按度值中位数列出核心靶点。本页实测(2026-10-10,STRING 12.5 API,Python 3 标准库):输入 AKT1、TNF、IL6、PTGS2、ESR1、STAT3、MAPK1、CASP3、BCL2、VEGFA 10 个网药高频基因,required_score=700 时得到 33 条边,其中 5 条只有文本挖掘证据,AKT1–IL6 的 0.88 分全部来自文本挖掘;9 个有连接的节点度中位数为 8,有 5 个节点并列达到中位数。
同一次实测发现:STRING 12.0 和 12.5 中查询 VEGFA 返回的是 COL18A1(9606.ENSP00000352798),不报错;用 UniProt 号 P15692 或 Entrez ID 7422 查询无结果,STRING 11.5 中 VEGFA 仍能正常匹配。直接把基因列表提交到 network 接口时,VEGFA 会被当作 COL18A1 进入网络(required_score=400 时 COL18A1 带着 3 条边出现)。VEGFA 是网药论文中的高频核心靶点,提交前先核对映射结果,映射不一致的基因在方法中单独说明。
降低同质性的做法:用疾病转录组或蛋白组数据核对核心靶点在疾病中是否有变化;除度值外同时报告介数等其他指标;在附件中给出完整靶点列表,便于审稿人判断。
# 用法:python3 string_hubs.py overlap_genes.txt 700
# overlap_genes.txt:每行一个交集基因符号;第二个参数为 required_score(0-1000)
import sys, csv, io, statistics, urllib.parse, urllib.request
from collections import defaultdict
API = "https://version-12-5.string-db.org/api/tsv"
def post(method, **params):
params.update({"species": 9606, "caller_identity": "np_validation_tutorial"})
data = urllib.parse.urlencode(params).encode()
with urllib.request.urlopen(f"{API}/{method}", data=data) as r:
return list(csv.DictReader(io.StringIO(r.read().decode()), delimiter="\t"))
genes = [g.strip() for g in open(sys.argv[1]) if g.strip()]
score = int(sys.argv[2]) if len(sys.argv) > 2 else 400
# 1. 先核对基因符号映射:STRING 会把查不到的符号静默映射到别的蛋白
mapped = post("get_string_ids", identifiers="\r".join(genes), echo_query=1, limit=1)
hit = {m["queryItem"]: m for m in mapped}
for g in genes:
if g not in hit:
print(f"WARNING not found in STRING: {g}")
elif hit[g]["preferredName"].upper() != g.upper():
print(f"WARNING {g} mapped to {hit[g]['preferredName']} ({hit[g]['stringId']})")
ids = [hit[g]["stringId"] for g in genes if g in hit and hit[g]["preferredName"].upper() == g.upper()]
# 2. 只用映射一致的 STRING ID 取网络
rows = post("network", identifiers="\r".join(ids), required_score=score)
edges = {}
for x in rows:
key = tuple(sorted((x["preferredName_A"], x["preferredName_B"])))
other = max(float(x[c]) for c in ("nscore", "fscore", "pscore", "ascore", "escore", "dscore"))
edges[key] = (float(x["score"]), float(x["tscore"]), other)
tm_only = [k for k, (s, t, o) in edges.items() if o == 0]
print(f"edges={len(edges)} textmining_only={len(tm_only)}")
for a, b in tm_only:
print(f" textmining only: {a}-{b} score={edges[(a, b)][0]}")
deg = defaultdict(int)
for a, b in edges:
deg[a] += 1
deg[b] += 1
med = statistics.median(deg.values())
print(f"nodes={len(deg)} median_degree={med}")
for g, d in sorted(deg.items(), key=lambda kv: -kv[1]):
print(f"{g}\t{d}\t{'>=median' if d >= med else ''}")
python3 string_hubs.py overlap_genes.txt 700富集分析
富集分析的两个常见漏洞是没有交代背景基因集和没有做多重检验校正。
Wijesooriya 等 2022 年审查了 186 篇使用富集分析的文章:95% 的过表达分析没有使用或没有说明合适的背景基因集,43% 没有做多重检验校正。在网药研究里,AGE-RAGE 和 PI3K-Akt 通路分别出现在 54.9% 和 54.7% 的研究中(Diao 等 2026)。
可行的做法是用全部成分靶点与疾病靶点的并集作背景,并在方法中写明背景大小、校正方法和 KEGG 访问日期。clusterProfiler 的 enrichGO() 中 ont 参数默认是 "MF",不写只会得到分子功能;enrichKEGG() 默认在线下载当前 KEGG 数据,因此要记录访问日期。
本页实测(2026-10-10,R 4.5.3,clusterProfiler 4.18.4,org.Hs.eg.db 3.22.0,macOS arm64):上面 10 个基因作交集基因,以它们在 STRING 12.5 中的互作伙伴共 191 个基因作背景,脚本运行通过。使用该背景时显著的 GO BP 条目为 170 个、KEGG 通路 20 个;不设 universe(默认以全部有注释的基因为背景)时分别为 1,493 个和 132 个;不写 ont 时得到的是 77 个 MF 条目。两种背景下排名第一的 KEGG 通路都是 AGE-RAGE signaling pathway in diabetic complications。示例背景只用于演示,实际分析用全部成分靶点与疾病靶点的并集。
# 依赖:BiocManager::install(c("clusterProfiler", "org.Hs.eg.db"))
library(clusterProfiler)
library(org.Hs.eg.db)
hits <- readLines("overlap_genes.txt") # 交集基因(基因符号)
bg <- readLines("background_genes.txt") # 背景:全部成分靶点与疾病靶点的并集
hits_id <- bitr(hits, fromType = "SYMBOL", toType = "ENTREZID", OrgDb = org.Hs.eg.db)$ENTREZID
bg_id <- bitr(bg, fromType = "SYMBOL", toType = "ENTREZID", OrgDb = org.Hs.eg.db)$ENTREZID
ego <- enrichGO(gene = hits_id, universe = bg_id, OrgDb = org.Hs.eg.db,
keyType = "ENTREZID", ont = "BP", # ont 默认是 "MF"
pAdjustMethod = "BH", pvalueCutoff = 0.05, qvalueCutoff = 0.2,
readable = TRUE)
ekegg <- enrichKEGG(gene = hits_id, universe = bg_id, organism = "hsa",
keyType = "kegg", pAdjustMethod = "BH",
pvalueCutoff = 0.05, qvalueCutoff = 0.2)
write.csv(as.data.frame(ego), "go_bp.csv", row.names = FALSE)
write.csv(as.data.frame(ekegg), "kegg.csv", row.names = FALSE)
writeLines(c(paste("hits", length(hits_id)),
paste("background", length(bg_id)),
paste("KEGG accessed", Sys.Date())), "enrichment_meta.txt")
分子对接
分子对接在网药论文中的作用是为核心成分和核心靶点提供结构层面的合理性。对接打分不能证明结合。
Che 和 Zhang 2025 年审查了 35 篇 2024 年发表的网药论文:约 15 篇用 −5.0 kcal/mol 作亲和力阈值,其他从 −1.2 到 −7.0 不等,都没有可追溯的出处;不同对接软件的打分不能互相比较;35 篇中没有一篇设阳性对照;4 篇明确使用盲对接,另有 13 篇不同配体对接到蛋白不同区域,疑似盲对接。他们在 CASF-2016 的 285 个复合物上测试:Vina 指定位点对接的打分与实验亲和力相关系数 0.604,盲对接为 0.387;盲对接时 exhaustiveness 为 8 的中位 RMSD 为 3.37 Å,提高到 64 降到 2.21 Å,耗时约为 8 倍。
受体与配体准备、盒子设置和完整命令见 /learn/autodock-vina-docking。
- 01
选结构
优先选人源、含共晶配体、结合口袋完整的晶体结构,写明 PDB ID 和分辨率。只有预测结构时,先检查口袋残基的 pLDDT(判读方法见 /learn/alphafold-results)。
- 02
定位点
用共晶配体位置或文献报道的功能残基定义对接盒子。位点未知时先做口袋预测,再用第二个对接程序交叉核对。
- 03
重对接
取出共晶配体后用同一套参数重新对接,最优姿态与晶体姿态的重原子 RMSD ≤ 2 Å,说明这套参数能复现已知结合模式(PoseBusters 采用同一标准)。
- 04
阳性对照
在同一盒子、同一参数下对接该靶点的已知抑制剂或共晶配体。成分打分与阳性对照比较,接近或优于阳性对照的成分才进入 MD。
- 05
报告参数
写明盒子中心和尺寸、exhaustiveness、随机种子和 Vina 版本,附 2D/3D 相互作用图和重对接叠合图。
| Vina 打分(kcal/mol) | 按 ΔG 换算的 Kd(298.15 K) | 论文中的常见说法 |
|---|---|---|
| −4.25 | 约 770 μM | “有结合活性” |
| −5.0 | 约 216 μM | “结合良好” |
| −7.0 | 约 7.4 μM | “结合很强” |
| −9.0 | 约 0.25 μM | — |
分子动力学
分子对接和分子动力学是先后两步:对接在近似刚性的受体上搜索配体姿态并打分,分子动力学在显式溶剂中检验这个姿态随时间能否保持。对接位点错了,MD 无法纠正。
时长没有统一标准。Communications Biology 2023 年发表的分子动力学可靠性清单要求的是收敛证据和每个条件至少 3 次独立模拟,没有规定固定纳秒数。判断平衡的经验做法是:先把每帧按蛋白骨架最小二乘叠合到参考结构,再算 RMSD,对曲线做滑动平均,从某个时间点起不再有整体上升或下降,才算结构平衡。
MM/PBSA 的已知局限(Genheden 和 Ryde 2015):算出的能量通常偏大;两个配体亲和力相差小于 12 kJ/mol(约 2.9 kcal/mol)时排序常不可靠;在整个 PDBbind 上与实验的 r² 约 0.3,单个蛋白在 0 到 0.8 之间;熵项统计误差最大,大规模测试中加入熵项并不改善结果,因此常被省略;溶质介电常数取 2 到 4 时结果往往最好;单轨迹法通常比三轨迹法准确。论文中写明是否计算熵项和所用介电常数。
gmx_MMPBSA 当前版本 1.7.0。照抄旧教程要注意:&gb 中 extdiel 自 1.5.0 起默认 78.5(此前为 80.0);用 Interaction Entropy 时要报告 σIE,σIE 大于约 3.6 kcal/mol 时结果不可靠。体系搭建、mdp 参数和命令见 /learn/gromacs-protein-ligand,RMSD、RMSF、氢键与 SASA 的计算和作图见 /learn/md-trajectory-analysis。
| 指标 | 回答的问题 | 常见错误 |
|---|---|---|
| 配体 RMSD(按蛋白骨架叠合后计算) | 配体是否留在原结合姿态 | 按配体自身叠合计算,看不到配体整体漂移 |
| 蛋白骨架 RMSD | 蛋白整体结构是否稳定 | 用它代替配体 RMSD 作为“结合稳定”的证据 |
| 口袋残基 RMSF | 结合区的柔性 | 只给全蛋白 RMSF 曲线,不标出口袋残基 |
| 氢键与接触占有率 | 哪些相互作用持续存在 | 只画氢键数量随时间的曲线,不给具体残基 |
| Rg、SASA | 蛋白是否展开或塌缩 | 把 Rg、SASA 平稳当作配体结合稳定的证据 |
| MM/PBSA 或 MM/GBSA | 与阳性对照相比的相对结合强弱 | 把绝对值当作结合自由能,直接和实验 ΔG 比较 |
- 每个复合物至少 3 条独立模拟(不同初始速度随机种子),报告均值与标准差。
- 给出被分析性质已平衡的证据,说明平衡段和分析段如何划分。
- 至少一条从不同初始构象(例如对接第二名姿态)出发的模拟,说明结论不依赖初始构象。
- 提供体系设置表:盒子尺寸、总原子数、水分子数、盐浓度、力场与水模型、质子化状态。
- 写明软件版本,附初始坐标、输入参数文件和最终坐标。
- 阳性对照复合物用同样方案模拟。
审稿意见
下表的质疑来自期刊审稿要求和方法学审查文章,应对做法可以在投稿前完成。
| 质疑 | 应对做法 | 依据 |
|---|---|---|
| 只有计算,没有实验 | 对排名最前的成分-靶点对做分子水平结合或酶活实验,再用细胞或动物实验验证关键通路 | Frontiers in Pharmacology Four Pillars;DDDT 投稿说明 |
| 成分在药材中是否存在、含量够不够 | UHPLC-HRMS 自测药材或制剂成分,或引用同一药材的定量文献;优先选入血成分 | Four Pillars 对化合物鉴定与含量的要求 |
| 槲皮素、山柰酚等是泛靶点成分 | 给出该成分在本药材中的含量和特异性证据,或把它降为次要成分讨论 | Four Pillars;Diao 等 2026(槲皮素见于 71.9% 的数据库型研究) |
| OB/DL 等阈值为什么这样设 | 引用阈值出处,说明阈值在分析前设定;非口服制剂说明为何不用 OB | TCMSP 参数说明页;WFCMS 指南对合理性的要求 |
| 核心靶点又是 AKT1、TNF、IL6 | 用疾病组学数据核对核心靶点;报告完整靶点列表;同时报告度值以外的拓扑指标 | Diao 等 2026 |
| 富集分析背景不清、未校正 | 写明背景基因集、校正方法、软件版本和 KEGG 访问日期 | Wijesooriya 等 2022 |
| 盲对接、无阳性对照、阈值无依据 | 定位点对接,重对接 RMSD ≤ 2 Å,同条件对接阳性对照,用相对排序代替固定阈值 | Che 和 Zhang 2025 |
| MD 只有一条轨迹 | 每个复合物至少 3 个独立副本,报告均值 ± 标准差 | Communications Biology 2023 可靠性清单 |
| MM/PBSA 数值偏大或与实验不符 | 只和阳性对照比较相对大小,说明熵项和介电常数设置 | Genheden 和 Ryde 2015 |
| 数据库版本和检索日期不清,结果无法复现 | 附检索日期、版本、原始导出表和全部脚本 | WFCMS 指南对数据溯源的要求 |
| 复方或提取物组成不清 | 写明组成比例、提取工艺、批号和化学表征 | Four Pillars 对组成的要求 |
国内做法
旧版 TCMSP 的靶点表给出的是蛋白名(target_name 列),做交集和富集前要转成基因符号。国内经验帖的通用做法是下载 UniProt 人源、reviewed 条目,按蛋白名匹配基因名(Excel VLOOKUP 或 R 脚本)。下面给出这一步的实测结果和需要人工处理的情况,以及 Cytoscape 导入时的常见问题。
# 用法:python3 tcmsp2symbol.py tcmsp_targets.txt > target_symbol.tsv
# tcmsp_targets.txt:每行一个 TCMSP 靶点名(target_name 列,去重后)
# 只依赖 Python 3 标准库;运行时从 UniProt 下载人源 reviewed 条目(约 2 万行)
import csv, io, re, sys, urllib.request
URL = ("https://rest.uniprot.org/uniprotkb/stream?query=organism_id:9606+AND+reviewed:true"
"&fields=accession,protein_name,gene_primary&format=tsv")
rec, alt = {}, {}
with urllib.request.urlopen(URL, timeout=600) as r:
for row in csv.DictReader(io.StringIO(r.read().decode()), delimiter="\t"):
gene = row["Gene Names (primary)"]
if not gene:
continue
pn = row["Protein names"].split(" [Cleaved")[0] # 去掉切割产物说明
rec.setdefault(re.sub(r"\s*\(.*$", "", pn).strip().lower(), set()).add(gene) # 推荐名
for name in re.findall(r"\(([^()]*)\)", pn): # 括号中的别名
alt.setdefault(name.strip().lower(), set()).add(gene)
names = [l.strip() for l in open(sys.argv[1], encoding="utf-8") if l.strip()]
n_rec = n_alt = 0
print("target_name\tsymbols\tmatch")
for n in dict.fromkeys(names):
key = n.lower()
if key in rec:
genes, how = rec[key], "recommended"; n_rec += 1
elif key in alt:
genes, how = alt[key], "alternative"; n_alt += 1 # 别名匹配:逐条人工核对
else:
genes, how = set(), "none" # 未匹配:人工查 UniProt
flag = "ambiguous" if len(genes) > 1 else how
print(f"{n}\t{'/'.join(sorted(genes))}\t{flag}")
print(f"targets={len(dict.fromkeys(names))} recommended={n_rec} alternative={n_alt} "
f"unmatched={len(dict.fromkeys(names)) - n_rec - n_alt}", file=sys.stderr)只做精确匹配会丢掉约三成靶点
本页实测(2026-10-10,旧版 TCMSP 2.3,UniProt REST 接口):黄芩(Scutellariae Radix)中 OB ≥ 30%、DL ≥ 0.18 的 36 个成分对应 507 个成分-靶点对、124 个不重复的靶点名。与 UniProt 推荐名精确匹配的有 85 个;加上括号中的别名再匹配 15 个,共 100 个;24 个两种方式都匹配不上。经验帖中的 R 脚本也要把连字符换成空格、去掉括号部分再匹配几轮,原因相同。
匹配不上和别名匹配的条目要逐条看
同一次实测中未匹配的原因有四类:UniProt 改了推荐名(VEGFA 现名 Vascular endothelial growth factor A, long form);TCMSP 名称是切割产物(Thrombin 属于 F2 编码的 Prothrombin);名称对应一个基因家族(Calmodulin 对应 CALM1、CALM2、CALM3,Heat shock protein HSP 90 对应 HSP90AA1 等);以及“mRNA of …”这类条目。别名匹配中,Beta-lactamase 被匹配到人的 DPEP1;TCMSP 表中的 Beta-lactamase 是细菌的 β-内酰胺酶,Cytochrome P450-cam 是恶臭假单胞菌的 CYP101,两者都应删除,不能计入人源靶点。
Cytoscape 导入报错与节点异常
经验帖中导入网络文件报 Could not initialize preview 的处理:Excel 另存为“CSV UTF-8”格式再导入,并替换掉单元格中的换行符、逗号、分号等特殊字符;中文版 Excel 的“CSV(逗号分隔)”按 GBK 编码保存,节点名含中文时导入会乱码。同一基因的写法要统一,HIF1A 和 Hif1a 会被当成两个节点。PPI 图中出现没有连线的孤立靶点,常见原因是前一步基因名转换出错,先回到映射表核对。经验帖里“节点太多就提高 SwissTargetPrediction 阈值让同心圆好看”的做法,属于看到结果后改阈值;节点多时改用只画核心靶点的子网络。
交给 Agent
计算部分的步骤固定、文件多、跑得久,适合交给科学智能体执行,判断和实验仍由你负责。
一句话指令示例:「以黄芩为研究对象、溃疡性结肠炎为疾病:从 HERB 2.0 和 BATMAN-TCM 2.0 收集成分与靶点,按 OB ≥ 30%、DL ≥ 0.18 和 SwissTargetPrediction 前 15 位筛选;疾病靶点用 OMIM、DisGeNET curated 和 GEO 差异基因;构建 STRING 12.5 网络并标出只有文本挖掘证据的边;以全部成分靶点与疾病靶点的并集为背景做 GO/KEGG 富集;对前 5 个核心靶点做定位点对接、重对接和阳性对照;对得分最高的 3 个复合物和阳性对照各跑 3 个 100 ns 副本,做 MM/GBSA 并出图。」
- 01
检索与记录
访问各数据库,保存原始导出表,记录版本和检索日期。
- 02
网络与富集
运行 Python 和 R 脚本完成交集、PPI、核心靶点和富集分析,输出表格和图。
- 03
对接
下载 PDB 结构,准备受体和配体,完成重对接、成分对接和阳性对照对接,输出打分表和相互作用图。
- 04
分子动力学
在预装 GROMACS、AmberTools、ACPYPE 的环境中搭建体系,按需租用 GPU 跑多副本,完成轨迹分析和 gmx_MMPBSA 计算。
- 05
对抗审阅
检查任务是否真正完成,例如重对接 RMSD 是否 ≤ 2 Å、每个复合物的副本是否齐全、图中是否标注均值和标准差。
- 工作区保留:成分表、靶点表、网络 tsv、富集结果、对接日志与姿态、MD 输入文件与分析结果、全部脚本和图。
- 你仍需核对:核心成分是否确实存在于所用药材及其含量、阈值是否符合你的研究设计、PDB 结构和阳性对照的选择是否合适。
- 实验验证的设计和湿实验由你完成。
参考资料
- Frontiers in Pharmacology: The Four Pillars of Best Practice in Ethnopharmacology — 网络分析、对接、化合物鉴定与含量、泛靶点成分的审稿要求
- Drug Design, Development and Therapy 期刊页 — 对仅含网络药理学与对接稿件的要求及分子水平体外验证
- 牛明等.《网络药理学评价方法指南》解读. 中草药, 2021, 52(14): 4119-4129 — 评价框架、CNKI 网药论文验证比例、人参成分数不一致的统计
- Che X, Zhang L. Blind docking methods have been inappropriately used in most network pharmacology analysis. Front Pharmacol, 2025 — −5.0 kcal/mol 阈值、阳性对照缺失、盲对接准确度测试
- Diao X, et al. Rethinking network analysis in ethnopharmacology. Front Pharmacol, 2026 — 1,038 篇网药研究中核心靶点、通路与成分的同质化统计
- Reliability and reproducibility checklist for molecular dynamics simulations. Commun Biol, 2023 — 副本数、收敛证据、体系设置表与文件共享要求
- Genheden S, Ryde U. The MM/PBSA and MM/GBSA methods to estimate ligand-binding affinities. Expert Opin Drug Discov, 2015 — MM/PBSA 准确度、熵项、介电常数与排序可靠性
- gmx_MMPBSA 文档:输入文件与 Interaction Entropy — 当前默认参数与 σIE 判据
- Buttenschoen M, et al. PoseBusters. Chem Sci, 2024 — 对接姿态 RMSD ≤ 2 Å 标准
- Wijesooriya K, et al. Urgent need for consistent standards in functional enrichment analysis. PLoS Comput Biol, 2022 — 背景基因集与多重检验校正问题的比例
- Daina A, et al. SwissTargetPrediction: updated data and new features. Nucleic Acids Res, 2019 — Probability 含义与前 15 位命中率
- TCMSP 门户页与参数说明页 — 新旧版本状态、OB/DL 建议值与新版默认阈值
- BATMAN-TCM 2.0. Nucleic Acids Res, 2024 — 已知与预测成分-靶点相互作用数量
- HERB 2.0. Nucleic Acids Res, 2025 — 临床试验与 meta 分析整理
- The STRING database in 2025. Nucleic Acids Res, 2025 — STRING 12.5;combined score 含义见 string-db.org/cgi/info
- DisGeNET 支持文档:免费学术账号可见数据范围 — 免费账号只含 curated 数据
- Sobereva:谈谈怎么判断分子动力学模拟是否达到了平衡 — 经验帖:RMSD 叠合与滑动平均判断平衡
- CSDN:网络药理学速通流程版 — 经验帖:GeneCards、SwissTargetPrediction、PharmMapper、STRING 的常用经验阈值
- 腾讯云开发者社区:数据库获取疾病靶点并与中药靶点交集 — 经验帖:先用 MeSH 确认疾病标准名,多库取并集的 R 脚本
- 简书:疾病靶点之 GeneCards — 经验帖:GeneCards 按中位数或 2 倍中位数筛选
- UniProt 帮助:Programmatic access – Retrieving entries via queries — 用 REST 接口下载人源 reviewed 条目(organism_id:9606 AND reviewed:true)
- CSDN:结合 UniProt 进行 target 转 symbol — 经验帖:抓取 TCMSP 靶点并按多种蛋白名变体匹配 UniProt reviewed 表的 R 脚本
- CSDN:中药-成分-靶点网络与 PPI 网络制作(Cytoscape 3.8.2) — 经验帖:Could not initialize preview 的处理、孤立节点与基因名校正
- CSDN:Cytoscape 中药成分-靶点网络可视化入门 — 经验帖:另存为 CSV UTF-8、基因名大小写统一