何时使用
当你需要从 STRING(5900 万+ 蛋白、200 亿+ 互作、5000+ 物种)检索蛋白-蛋白互作(PPI)数据时使用本技能。典型场景:
- 检索单个或多个蛋白的互作网络(功能型 functional / 物理型 physical)
- 对蛋白列表做功能富集(GO、KEGG、Pfam、InterPro、UniProt Keywords)
- 从种子蛋白发现互作伙伴、扩展网络
- 检验一组蛋白是否构成显著富集的功能模块(PPI enrichment)
- 生成按证据着色的网络图(PNG/SVG)
- 分析跨物种同源/蛋白家族关系、识别 hub 蛋白与连通模式
不该用本技能的边界:
- 化合物-蛋白生物活性互作(IC50/Ki,化学小分子)→ 用
chembl-bioactivity-database - 以通路为中心的查询(通路成员、通路图、ID 转换)→ 用
kegg-database - 拿到网络后做图论分析/中心性/社区发现/可视化布局 → 用
networkx-graph-analysis
步骤 / 指令
准备环境:
pip install requests(唯一必需),表格分析另装pandas。无需 API key。无硬性速率限制,但每次调用间time.sleep(1);蛋白组规模分析改用 STRING 批量下载(https://string-db.org/cgi/download),勿用 API 循环。统一调用器(所有端点共用,
fmt切换输出格式):import requests, time STRING_API = "https://string-db.org/api" def string_query(endpoint, params, fmt="tsv"): url = f"{STRING_API}/{fmt}/{endpoint}" params.setdefault("caller_identity", "everything_skills") r = requests.get(url, params=params); r.raise_for_status() time.sleep(1) # 限速 return r.text先映射标识符(强烈建议第一步):用
get_string_ids把基因名映射成 STRING ID。STRING ID 格式{taxonId}.{ensemblProteinId}(如人类 TP53 =9606.ENSP00000269305),后续查询用 ID 更快、更准。选端点 + 拼参数。核心端点(
endpoint取值):端点 作用 关键参数 get_string_ids基因名→STRING ID limit(每项匹配数)、echo_querynetwork取互作网络(边表) required_score、network_type、add_nodesinteraction_partners某蛋白的 top 互作伙伴 limit、required_scoreenrichmentGO/KEGG/Pfam 富集(Fisher + BH-FDR) — ppi_enrichment检验是否构成显著网络 required_score(取fmt="json")homology蛋白间同源性打分 — versionSTRING 版本(写方法学用) — image/network网络图(二进制 PNG/SVG,非文本) network_flavor、required_score必带
species(NCBI taxon ID):9606 人、10090 小鼠、10116 大鼠、7227 果蝇、6239 线虫、4932 酵母、3702 拟南芥、7955 斑马鱼、511145 大肠杆菌。>10 个蛋白的网络查询缺 species 会报错,建议任何查询都显式带上。选置信度阈值
required_score(0-1000,综合 7 个证据通道):150 探索性、400 标准(默认)、700 高置信(发表常用)、900 极严。选网络类型
network_type:functional(默认,所有证据,适合通路/富集/系统生物学)或physical(仅直接结合证据,适合结构/复合物分析)。解析输出:TSV 用
pd.read_csv(io.StringIO(text), sep='\t');JSON 用json.loads;图像端点返回二进制,用requests.get(...).content写文件。identifiers多蛋白用%0d连接(URL)或\n(POST body)。
示例
快速上手 — 映射 ID + 取网络:
import requests, time, io, json, pandas as pd
STRING_API = "https://string-db.org/api"
def string_query(endpoint, params, fmt="tsv"):
r = requests.get(f"{STRING_API}/{fmt}/{endpoint}",
params={**params, "caller_identity": "everything_skills"})
r.raise_for_status(); time.sleep(1); return r.text
# 1) 基因名 → STRING ID(务必先做)
ids = string_query("get_string_ids",
{"identifiers": "TP53\nBRCA1\nEGFR", "species": 9606, "echo_query": 1})
df = pd.read_csv(io.StringIO(ids), sep='\t')
print(dict(zip(df['queryItem'], df['stringId']))) # {'TP53':'9606.ENSP00000269305', ...}
# 2) 取互作网络(required_score=400 标准阈值)
net = string_query("network", {
"identifiers": "TP53%0dBRCA1%0dMDM2%0dATM%0dCHEK2",
"species": 9606, "required_score": 400, "network_type": "functional"})
ndf = pd.read_csv(io.StringIO(net), sep='\t')
print(f"{len(ndf)} 条互作")
print(ndf[['preferredName_A', 'preferredName_B', 'score']].head())
互作伙伴 + 网络扩展:
# 某蛋白 top-20 互作伙伴(高置信)
p = string_query("interaction_partners",
{"identifiers": "TP53", "species": 9606, "limit": 20, "required_score": 700})
# 从种子蛋白扩展:add_nodes 拉入 10 个最相连的蛋白
exp = string_query("network",
{"identifiers": "TP53", "species": 9606, "add_nodes": 10, "required_score": 700})
功能富集(GO/KEGG/Pfam,Fisher + BH-FDR):
en = string_query("enrichment", {
"identifiers": "TP53%0dMDM2%0dATM%0dCHEK2%0dBRCA1%0dATR%0dTP73", "species": 9606})
edf = pd.read_csv(io.StringIO(en), sep='\t') # 列:category, term, description, p_value, fdr ...
sig = edf[edf['fdr'] < 0.05]
for cat, g in sig.groupby('category'): # 按 GO/KEGG/Pfam 分组
print(cat, len(g), g.iloc[0]['description'])
PPI 富集检验(是否构成显著功能模块):
d = json.loads(string_query("ppi_enrichment",
{"identifiers": "TP53%0dMDM2%0dATM%0dCHEK2%0dBRCA1", "species": 9606,
"required_score": 400}, fmt="json"))
print(d['number_of_edges'], d['expected_number_of_edges'], d['p_value'])
# p < 0.05 → 这组蛋白的互作显著多于随机,构成富集网络
导出网络图(二进制 PNG):
img = requests.get(f"{STRING_API}/image/network", params={
"identifiers": "TP53%0dMDM2%0dATM%0dCHEK2%0dBRCA1", "species": 9606,
"required_score": 700, "network_flavor": "evidence", # evidence|confidence|actions
"caller_identity": "everything_skills"}).content
open("network.png", "wb").write(img)
跨物种比较(注意同源基因符号不同):
for sp, name, gene in [(9606, "Human", "TP53"), (10090, "Mouse", "Trp53")]:
n = string_query("network",
{"identifiers": gene, "species": sp, "required_score": 700, "add_nodes": 5})
print(name, gene, len(pd.read_csv(io.StringIO(n), sep='\t')), "条互作")
注意事项
- 先映射 ID:任何操作前用
get_string_ids,STRING ID(9606.ENSP...)比基因名更快更准,也能提前发现拼写/物种错误。 - 每次调用限速 1 秒:
time.sleep(1),避免被限流;批量请求按 50-100 蛋白分批,蛋白组规模改用批量下载。 - 必带
species:>10 蛋白网络缺 species 直接报 "Species required";任何查询都建议显式带上。 - 空网络 / 查不到蛋白:多半是阈值太严或物种/拼写错——先降
required_score、用get_string_ids核对映射、确认物种 taxon ID。 - 富集需要 ≥5 个蛋白才有意义,蛋白太少返回空结果。
- 图像端点是二进制:
/image/network用.content写文件;当作文本解析会乱码。 - 400 Bad Request:多蛋白须用
%0d(URL)或\n(POST)分隔并 URL 编码特殊字符。 - network_type 选错会得到不同结果:通路/富集用
functional,结构/复合物用physical。 - 可复现性:方法学里写明 STRING 版本——
string_query("version", {}),记成 "STRING vX, accessed "。 - 跨物种同源基因符号不同:人
TP53↔ 鼠Trp53,比较前先各自映射。
互见
uniprot-protein-database— 取蛋白序列/功能注释,补全 STRING 节点的蛋白信息kegg-database— 以通路为中心的查询,与 STRING 富集互补gene-set-enrichment-analysis— 更通用的 ORA/GSEA 富集(自定义基因集、排序表)networkx-graph-analysis— 对 STRING 网络做中心性、社区发现、布局与可视化opentargets-database— 把蛋白互作模块关联到疾病-靶点证据chembl-bioactivity-database— 化合物-靶点生物活性(化学互作,本技能不覆盖)alphafold-database-access— 对互作蛋白取三维结构
参考:STRING 官网 https://string-db.org | API 文档 https://string-db.org/help/api/ | 批量下载 https://string-db.org/cgi/download | 物种全表 https://string-db.org/cgi/input?input_page_active_form=organisms
采编自 jaechang-hits/SciAgent-Skills(CC-BY-4.0)。