关于 brenda-database
brenda-database 是一个通过 SOAP 服务查询 BRENDA 酶数据的 Python 技能,适用于研究人员按生物体和底物筛选测量值,用于酶比较与动力学模型构建。
主要功能
- 01查询 Km、kcat、Vmax 和 Ki
- 02查找底物、产物与抑制剂
- 03按生物体筛选酶数据
- 04获取 pH 与温度最适值
- 05关联 EC 编号与 UniProt
适用场景
- 01为代谢模型提取 Km 和 kcat
- 02比较不同生物体中的酶参数
- 03查找特定 EC 编号的抑制剂
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ jaechang-hits/ sciagent-skills --skill brenda-database安装后在 Claude Code 中输入/brenda-database确认已加载。
详细介绍
BRENDA 酶数据库
概述
BRENDA(BRaunschweig ENzyme DAtabase,布伦瑞克酶数据库)是全球最全面的酶信息系统,包含 80,000 多条酶条目,涵盖所有已分类的酶(EC 编号)。数据库收录了来自 200,000 多篇文献的 700 多万个实验测定动力学参数(Km、Vmax、kcat、Ki、抑制常数)、底物特异性数据、辅因子需求、组织表达信息,以及特定生物的酶变体。可通过基于 SOAP 的 Web 服务(Python zeep 库)以编程方式访问,学术用途可免费注册。
适用场景
- 获取特定酶与底物组合的动力学参数(Km、kcat、Vmax、Ki)
- 比较不同生物或酶突变体的动力学参数
- 查找某个 EC 编号对应的天然底物、抑制剂和辅因子
- 构建需要 Michaelis-Menten 参数的代谢模拟动力学模型
- 查找特定酶的结构数据(推荐 pH 值、最佳温度)
- 交叉查询 EC 编号与 UniProt 登录号及生物分类信息
- 代谢网络模拟请使用
cobrapy-metabolic-modeling;代谢物结构请使用hmdb-database
前提条件
- Python 软件包:
zeep(SOAP 客户端)、pandas、requests - 数据要求:EC 编号(例如
1.1.1.1)、酶名称或生物名称 - 环境:需要互联网连接;在 https://www.brenda-enzymes.org/register.php 免费注册学术账号
- 速率限制:未明确说明限制;避免批量自动查询;请求之间应加入休眠间隔
pip install zeep pandas requests
# Register at https://www.brenda-enzymes.org/register.php to obtain API credentials
快速入门
from zeep import Client
WSDL = "https://www.brenda-enzymes.org/soap/brenda_zeep.wsdl"
client = Client(WSDL)
EMAIL = "[email protected]"
PASSWORD_SHA256 = "your_sha256_hashed_password" # Use hashlib.sha256
# Get Km values for lactate dehydrogenase (EC 1.1.1.27) and pyruvate
ec_number = "1.1.1.27"
params = (EMAIL, PASSWORD_SHA256,
f"ecNumber*{ec_number}", "substrate*pyruvate", "", "", "", "", "")
result = client.service.getKmValue(*params)
print(f"Km values for LDH with pyruvate: {len(result)} records")
for r in result[:3]:
print(f" Km={r.kmValue} {r.kmValueMaximum or ''} mM | org: {r.organism} | PMID: {r.literature}")
核心 API
查询 1:酶-底物组合的 Km 值
获取特定酶和底物的 Michaelis 常数(Km)值。
from zeep import Client
import hashlib, pandas as pd
WSDL = "https://www.brenda-enzymes.org/soap/brenda_zeep.wsdl"
client = Client(WSDL)
EMAIL = "[email protected]"
PASSWORD = "your_password"
PASSWORD_SHA256 = hashlib.sha256(PASSWORD.encode()).hexdigest()
def get_km_values(ec_number, substrate=""):
"""Retrieve Km values for an EC number, optionally filtered by substrate."""
substrate_param = f"substrate*{substrate}" if substrate else ""
params = (EMAIL, PASSWORD_SHA256,
f"ecNumber*{ec_number}", substrate_param, "", "", "", "", "")
return client.service.getKmValue(*params)
# Km for glucokinase (EC 2.7.1.2) with glucose
results = get_km_values("2.7.1.2", substrate="glucose")
print(f"Km (glucose, glucokinase): {len(results)} measurements")
rows = []
for r in results[:10]:
rows.append({
"km_value": r.kmValue,
"km_max": r.kmValueMaximum,
"unit": "mM",
"organism": r.organism,
"commentary": r.commentary[:80] if r.commentary else "",
"pmid": r.literature,
})
df = pd.DataFrame(rows)
print(df.to_string(index=False))
# Get ALL Km values (all substrates) for an EC number
all_km = get_km_values("1.1.1.1") # Alcohol dehydrogenase
print(f"\nAlcohol dehydrogenase - total Km records: {len(all_km)}")
substrate_counts = {}
for r in all_km:
sub = r.substrate or "unknown"
substrate_counts[sub] = substrate_counts.get(sub, 0) + 1
top_substrates = sorted(substrate_counts.items(), key=lambda x: -x[1])[:5]
print("Top substrates by measurement count:")
for sub, cnt in top_substrates:
print(f" {sub}: {cnt} measurements")
查询 2:kcat(周转数)值
获取酶的催化速率常数(kcat)。
from zeep import Client
import hashlib, pandas as pd
WSDL = "https://www.brenda-enzymes.org/soap/brenda_zeep.wsdl"
client = Client(WSDL)
EMAIL = "[email protected]"
PASSWORD_SHA256 = hashlib.sha256("your_password".encode()).hexdigest()
def get_kcat_values(ec_number, substrate=""):
substrate_param = f"substrate*{substrate}" if substrate else ""
params = (EMAIL, PASSWORD_SHA256,
f"ecNumber*{ec_number}", substrate_param, "", "", "", "", "")
return client.service.getTurnoverNumber(*params)
results = get_kcat_values("1.1.1.27") # Lactate dehydrogenase
print(f"kcat records for LDH: {len(results)}")
rows = []
for r in results[:10]:
rows.append({
"kcat": r.turnoverNumber,
"unit": "1/s",
"substrate": r.substrate,
"organism": r.organism,
})
df = pd.DataFrame(rows)
print(df.head())
查询 3:底物和产物
获取酶的天然底物和产物。
from zeep import Client
import hashlib, pandas as pd
WSDL = "https://www.brenda-enzymes.org/soap/brenda_zeep.wsdl"
client = Client(WSDL)
EMAIL = "[email protected]"
PASSWORD_SHA256 = hashlib.sha256("your_password".encode()).hexdigest()
def get_substrates_products(ec_number):
params = (EMAIL, PASSWORD_SHA256,
f"ecNumber*{ec_number}", "", "", "", "", "", "")
return client.service.getSubstrates(*params)
results = get_substrates_products("4.2.1.1") # Carbonic anhydrase
print(f"Substrates for carbonic anhydrase (EC 4.2.1.1):")
substrates_seen = set()
for r in results[:10]:
if r.substrate not in substrates_seen:
print(f" {r.substrate} | organism: {r.organism}")
substrates_seen.add(r.substrate)
# Get inhibitors
def get_inhibitors(ec_number):
params = (EMAIL, PASSWORD_SHA256,
f"ecNumber*{ec_number}", "", "", "", "", "", "")
return client.service.getInhibitors(*params)
inhibitors = get_inhibitors("4.2.1.1")
print(f"\nInhibitors of carbonic anhydrase: {len(inhibitors)} records")
inhib_names = list(set(r.inhibitor for r in inhibitors if r.inhibitor))
print("Sample inhibitors:", inhib_names[:8])
查询 4:特定生物的酶数据
按生物筛选并查询动力学参数。
from zeep import Client
import hashlib
WSDL = "https://www.brenda-enzymes.org/soap/brenda_zeep.wsdl"
client = Client(WSDL)
EMAIL = "[email protected]"
PASSWORD_SHA256 = hashlib.sha256("your_password".encode()).hexdigest()
def get_km_by_organism(ec_number, organism):
params = (EMAIL, PASSWORD_SHA256,
f"ecNumber*{ec_number}", "", f"organism*{organism}", "", "", "", "")
return client.service.getKmValue(*params)
# Human GAPDH Km values
human_km = get_km_by_organism("1.2.1.12", "Homo sapiens")
print(f"Human GAPDH (EC 1.2.1.12) Km values: {len(human_km)} records")
for r in human_km[:5]:
print(f" Substrate: {r.substrate:30s} Km={r.kmValue} mM")
查询 5:pH 和温度最佳值
获取酶的最佳 pH 和温度数据。
from zeep import Client
import hashlib
WSDL = "https://www.brenda-enzymes.org/soap/brenda_zeep.wsdl"
client = Client(WSDL)
EMAIL = "[email protected]"
PASSWORD_SHA256 = hashlib.sha256("your_password".encode()).hexdigest()
def get_ph_optimum(ec_number):
params = (EMAIL, PASSWORD_SHA256,
f"ecNumber*{ec_number}", "", "", "", "", "", "")
return client.service.getPhOptimum(*params)
def get_temp_optimum(ec_number):
params = (EMAIL, PASSWORD_SHA256,
f"ecNumber*{ec_number}", "", "", "", "", "", "")
return client.service.getTemperatureOptimum(*params)
ec = "3.4.21.4" # Trypsin
ph_data = get_ph_optimum(ec)
temp_data = get_temp_optimum(ec)
print(f"Trypsin (EC {ec}):")
ph_values = [r.phOptimum for r in ph_data[:10] if r.phOptimum]
temp_values = [r.temperatureOptimum for r in temp_data[:10] if r.temperatureOptimum]
if ph_values:
print(f" pH optima: {sorted(ph_values)}")
if temp_values:
print(f" Temperature optima (°C): {sorted(temp_values)}")
查询 6:EC 编号与 UniProt 交叉引用
将 EC 编号映射到 UniProt 登录号。
from zeep import Client
import hashlib
WSDL = "https://www.brenda-enzymes.org/soap/brenda_zeep.wsdl"
client = Client(WSDL)
EMAIL = "[email protected]"
PASSWORD_SHA256 = hashlib.sha256("your_password".encode()).hexdigest()
def get_uniprot_accessions(ec_number):
params = (EMAIL, PASSWORD_SHA256,
f"ecNumber*{ec_number}", "", "", "", "", "", "")
return client.service.getUniprotAccession(*params)
results = get_uniprot_accessions("1.1.1.27") # LDH
print(f"UniProt accessions for LDH (EC 1.1.1.27):")
seen = set()
for r in results[:10]:
acc = r.uniprotAccessionNumber
org = r.organism
if acc and acc not in seen:
print(f" {acc:12s} ({org})")
seen.add(acc)
关键概念
SOAP 接口和身份验证
BRENDA 通过 WSDL 定义使用 SOAP(而非 REST)。Python 库 zeep 会解析 WSDL 并生成类型化方法调用。身份验证需要使用 SHA256 哈希后的密码(而非明文)。每个服务方法都接收 (email, password_sha256, param1, param2, ..., "") 参数,其中字段筛选器以竖线分隔。
EC 编号分类
酶学委员会(EC)编号采用 X.X.X.X 格式,每一级都表示反应类别(氧化还原酶=1、转移酶=2、水解酶=3、裂合酶=4、异构酶=5、连接酶=6、转位酶=7)。BRENDA 按 EC 编号整理所有数据。
常见工作流
工作流 1:提取用于代谢建模的动力学参数
目标:针对代谢通路中的一组酶,提取 Km 和 kcat 值,为动力学模型设置参数。
from zeep import Client
import hashlib, pandas as pd, time
WSDL = "https://www.brenda-enzymes.org/soap/brenda_zeep.wsdl"
client = Client(WSDL)
EMAIL = "[email protected]"
PASSWORD_SHA256 = hashlib.sha256("your_password".encode()).hexdigest()
# Glycolysis enzymes
enzymes = {
"Hexokinase": "2.7.1.1",
"Phosphoglucose isomerase": "5.3.1.9",
"Phosphofructokinase": "2.7.1.11",
"Aldolase": "4.1.2.13",
}
rows = []
for name, ec in enzymes.items():
params = (EMAIL, PASSWORD_SHA256, f"ecNumber*{ec}", "", "organism*Homo sapiens", "", "", "", "")
try:
km_results = client.service.getKmValue(*params)
kcat_results = client.service.getTurnoverNumber(*params)
km_vals = [r.kmValue for r in km_results if r.kmValue]
kcat_vals = [r.turnoverNumber for r in kcat_results if r.turnoverNumber]
rows.append({
"enzyme": name,
"ec": ec,
"n_km_records": len(km_vals),
"km_median_mM": pd.Series(km_vals).median() if km_vals else None,
"n_kcat_records": len(kcat_vals),
"kcat_median_1_s": pd.Series(kcat_vals).median() if kcat_vals else None,
})
except Exception as e:
rows.append({"enzyme": name, "ec": ec, "error": str(e)})
time.sleep(0.5)
df = pd.DataFrame(rows)
df.to_csv("glycolysis_kinetics.csv", index=False)
print(df.to_string(index=False))
工作流 2:比较酶家族中的抑制剂
目标:比较一组相关酶的抑制剂概况,以确定药物发现的优先级。
from zeep import Client
import hashlib, pandas as pd, time
from collections import Counter
WSDL = "https://www.brenda-enzymes.org/soap/brenda_zeep.wsdl"
client = Client(WSDL)
EMAIL = "[email protected]"
PASSWORD_SHA256 = hashlib.sha256("your_password".encode()).hexdigest()
# Carbonic anhydrase isoforms
ca_ecs = ["4.2.1.1"] # All carbonic anhydrases share this EC
rows = []
for ec in ca_ecs:
params = (EMAIL, PASSWORD_SHA256, f"ecNumber*{ec}", "", "", "", "", "", "")
try:
inhib_results = client.service.getInhibitors(*params)
for r in inhib_results[:30]:
rows.append({
"ec": ec,
"inhibitor": r.inhibitor,
"organism": r.organism,
"ic50": r.ic50Value if hasattr(r, "ic50Value") else None,
})
except Exception as e:
print(f"Error for {ec}: {e}")
time.sleep(0.5)
df = pd.DataFrame(rows)
print(f"Total inhibitor records: {len(df)}")
top_inhib = Counter(df["inhibitor"]).most_common(10)
print("\nMost reported inhibitors:")
for inhib, count in top_inhib:
print(f" {inhib}: {count} records")
关键参数
| 参数 | 模块 | 默认值 | 范围 / 选项 | 作用 |
|---|---|---|---|---|
ecNumber* | 所有查询 | 必填 | EC 编号字符串 | 按酶类别筛选 |
substrate* | Km、kcat | — | 底物名称 | 按底物筛选 |
organism* | 所有查询 | — | 物种名称 | 按生物体筛选(例如,"Homo sapiens") |
commentary* | 所有查询 | — | 文本子串 | 按注释文本筛选 |
ligandStructureId* | 基于化合物的查询 | — | BRENDA 结构 ID | 按配体 ID 筛选 |
| Password | 身份验证 | 必填 | SHA256 哈希值 | 身份验证(hashlib.sha256) |
最佳实践
-
正确哈希密码:BRENDA 要求提供纯文本密码的 SHA256 哈希值,而不是密码本身。使用
hashlib.sha256("your_password".encode()).hexdigest()。 -
将凭据存储在环境变量中:切勿将凭据硬编码。使用
os.environ["BRENDA_EMAIL"]和os.environ["BRENDA_PASSWORD"]这类模式。 -
在查询之间添加
time.sleep():BRENDA 的 SOAP 服务可能运行缓慢;对于大型批量查询,每次间隔 0.5–1 秒,以避免超时。 -
建模时按生物体筛选:不同生物体的动力学参数差异可能很大;务必按与你的模型相关的生物体筛选(例如,
organism*Homo sapiens)。 -
使用中位数 / IQR 汇总参数:同一底物的多项文献测量值通常相差一个数量级;使用中位数 + IQR 而非均值来概括分布。
常用示例
示例:获取某个 EC 编号的所有底物
适用场景:了解酶的底物范围,以进行通路分析。
from zeep import Client
import hashlib
WSDL = "https://www.brenda-enzymes.org/soap/brenda_zeep.wsdl"
client = Client(WSDL)
EMAIL = "[email protected]"
PASSWORD_SHA256 = hashlib.sha256("your_password".encode()).hexdigest()
ec = "1.1.1.1" # Alcohol dehydrogenase
params = (EMAIL, PASSWORD_SHA256, f"ecNumber*{ec}", "", "", "", "", "", "")
results = client.service.getSubstrates(*params)
substrates = list(set(r.substrate for r in results if r.substrate))
print(f"Substrates of EC {ec} ({len(substrates)} unique): {substrates[:10]}")
示例:kcat/Km 效率比
适用场景:根据 BRENDA 数据计算催化效率(kcat/Km)。
import pandas as pd
# After fetching km_results and kcat_results for same ec + substrate
# km_values = [r.kmValue for r in km_results if r.kmValue] # mM
# kcat_values = [r.turnoverNumber for r in kcat_results if r.turnoverNumber] # 1/s
km_median = 0.1 # mM (example)
kcat_median = 500 # s^-1 (example)
efficiency = kcat_median / (km_median * 1e-3) # Convert Km to M
print(f"Catalytic efficiency (kcat/Km): {efficiency:.2e} M^-1 s^-1")
# Diffusion limit ≈ 10^8-10^9 M^-1 s^-1
示例:根据酶名称查找 EC 编号
适用场景:将酶的常用名称解析为 EC 编号,以便查询 BRENDA。
from zeep import Client
import hashlib
WSDL = "https://www.brenda-enzymes.org/soap/brenda_zeep.wsdl"
client = Client(WSDL)
EMAIL = "[email protected]"
PASSWORD_SHA256 = hashlib.sha256("your_password".encode()).hexdigest()
# Search enzymes by name
params = (EMAIL, PASSWORD_SHA256, "recommendedName*lactate dehydrogenase", "", "", "", "", "", "")
results = client.service.getEcNumber(*params)
print(f"EC numbers for 'lactate dehydrogenase':")
for r in results[:5]:
print(f" EC {r.ecNumber}: {r.recommendedName}")
故障排除
| 问题 | 原因 | 解决方案 |
|---|---|---|
zeep.exceptions.Fault: Authentication failed | 密码错误或 SHA256 格式不正确 | 确保使用 hashlib.sha256(password.encode()).hexdigest()——必须用 hexdigest,而不是 digest |
| 结果列表为空 | 未找到 EC 编号或底物 | 检查 EC 格式(X.X.X.X,以点分隔);先尝试不使用底物筛选 |
| SOAP 超时 | 查询量大或连接缓慢 | 使用生物体筛选来缩小结果集;设置 zeep 传输超时时间 |
结果字段出现 AttributeError | 此查询不提供该字段 | 使用 getattr(r, "field", None) 安全访问可选字段 |
| 常见酶响应缓慢 | 数据集很大(TP53 = 10K+ 条记录) | 按生物体和底物筛选,以减少数据传输 |
zeep.exceptions.TransportError | 网络连接问题 | 检查 VPN,并在 30 秒后重试 |
相关技能
cobrapy-metabolic-modeling— 使用 BRENDA 中的 Km/Vmax 作为动力学约束进行基于约束的代谢建模hmdb-database— 获取 BRENDA 底物的代谢物结构和生物学背景kegg-database— 通过 EC 编号交叉引用,了解 BRENDA 酶的通路背景uniprot-protein-database— 获取 BRENDA 中酶的蛋白质序列和结构数据
参考资料
- BRENDA 数据库 — BRENDA 主门户和手动搜索
- BRENDA Web 服务文档 — SOAP API 参考和参数说明
- zeep Python SOAP 客户端 — 用于 SOAP Web 服务的 Python 库
- Chang 等人(2021)BRENDA 更新 — BRENDA 2021 数据库更新论文