255

UniProt:蛋白信息检索的基础数据库

UniProt 是蛋白序列与功能注释的权威基础库,几乎所有蛋白分析都从它取序列与注释。这篇讲清 Swiss-Prot 与 TrEMBL 的区别、检索语法与关键注释字段。

UniProt 是蛋白质序列与功能注释的权威数据库。做任何与蛋白相关的工作——结构预测、口袋分析、DTI 建模、抗体设计——第一步几乎都是从 UniProt 取序列和注释。它是整个蛋白信息生态的标识符枢纽

两个子库的关键区别

子库 规模 注释方式 可靠性
Swiss-Prot 约 57 万条 人工审编 高,注释详尽可信
TrEMBL 逾 2.5 亿条 自动注释 覆盖广但未经审核

做人类蛋白相关工作,基本只需要 Swiss-Prot(人类蛋白约 2 万条,全部人工审编)。检索时加 reviewed:true 过滤,能避免大量自动注释的冗余条目。

检索语法

# REST API 检索
curl "https://rest.uniprot.org/uniprotkb/search?query=gene:EGFR+AND+organism_id:9606+AND+reviewed:true&format=json"

# 取单条 FASTA
curl "https://rest.uniprot.org/uniprotkb/P00533.fasta"

# 批量取序列
curl "https://rest.uniprot.org/uniprotkb/stream?query=organism_id:9606+AND+reviewed:true&format=fasta" -o human_proteome.fasta

# 只要特定字段(省流量、易处理)
curl "https://rest.uniprot.org/uniprotkb/search?query=accession:P00533&fields=accession,id,protein_name,ft_binding,ft_act_site,cc_subcellular_location,xref_pdb&format=tsv"
import requests

def get_protein(acc):
    r = requests.get(f"https://rest.uniprot.org/uniprotkb/{acc}.json")
    d = r.json()
    return {
        "accession": d["primaryAccession"],
        "name": d["proteinDescription"]["recommendedName"]["fullName"]["value"],
        "length": d["sequence"]["length"],
        "sequence": d["sequence"]["value"],
        "pdb": [x["id"] for x in d.get("uniProtKBCrossReferences", [])
                if x["database"] == "PDB"],
    }

p = get_protein("P00533")
print(p["name"], p["length"], "PDB 结构数:", len(p["pdb"]))

药物研发最该关注的注释字段

  • Binding site / Active site:结合位点与催化残基的具体编号。做对接时用它确认口袋位置、验证结果是否落在正确位点。
  • Domain / Region:结构域边界。做结构预测时按域切分,比直接预测全长更可靠。
  • PTM(翻译后修饰):磷酸化、糖基化位点。这些位点可能影响结合,也可能是设计的着眼点。
  • Subcellular location:亚细胞定位。决定药物需要什么样的性质才能到达——胞内靶点需要膜通透性,分泌蛋白可用抗体。
  • Isoform:可变剪接产生的不同蛋白形式。选错 isoform 会导致残基编号全错,这是很常见的踩坑点。
  • Cross-references:到 PDB、AlphaFold DB、Pfam、Reactome、ChEMBL 等的链接,是打通各数据库的桥梁。
  • Variant:已知的天然变异及其效应。

标识符映射

# UniProt 的 ID Mapping 服务,用于跨数据库转换
import requests, time

r = requests.post("https://rest.uniprot.org/idmapping/run",
                  data={"from": "Gene_Name", "to": "UniProtKB-Swiss-Prot",
                        "ids": "EGFR,BRAF,KRAS", "taxId": "9606"})
job_id = r.json()["jobId"]

while True:
    s = requests.get(f"https://rest.uniprot.org/idmapping/status/{job_id}").json()
    if s.get("results") or s.get("failedIds"):
        break
    time.sleep(2)
print(s["results"])

基因名、Ensembl ID、RefSeq、PDB、ChEMBL 之间的映射经常需要,这个服务是最可靠的途径——不要用手工维护的映射表,标识符变更比想象中频繁。

注意事项

  • 规范序列 vs 全长:UniProt 给出「规范序列」(canonical),可能与某个特定 isoform 或 PDB 中的构建体不同。做残基编号对应时必须核对
  • 信号肽与前体:序列可能包含信号肽和前肽,成熟蛋白的编号不同。这在抗体与分泌蛋白工作中特别容易出错。
  • 物种要指定organism_id:9606 是人类。不指定会混入其他物种的同源蛋白。
  • 版本记录:序列偶尔会修订,可复现的分析要记录 UniProt release 版本。

上手提示

  • 做人类蛋白工作只需 Swiss-Prot,检索加 reviewed:true
  • Binding site / Active site 注释是验证对接结果落点的直接依据;
  • isoform 与信号肽会导致残基编号错位,务必核对;
  • 跨库标识符转换用 ID Mapping 服务,别手工维护映射表。

延伸资源