You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SBML中添加、访问及修改基因注释?CBMPy使用疑问

如何在CBMPy中访问、修改和添加代谢模型的注释?

我明白你遇到的问题:CBMPy的getAnnotations()方法返回空字典,是因为它默认只解析非RDF格式的注释,而你的模型里的基因注释是用RDF(bqbiol:isEncodedBy)结构存储的,需要借助libsbml的工具来解析。下面分三部分解决你的问题:

1. 访问RDF格式的基因注释

CBMPy的Gene对象封装了底层的libsbml GeneProduct元素,我们可以直接获取这个原始对象,再用libsbml的RDFAnnotationParser来解析RDF注释:

import cbmpy as cbm
from libsbml import RDFAnnotationParser

# 读取模型
cmod = cbm.CBRead.readSBML3FBC('iMM904.xml')
# 获取目标基因
gene = cmod.getGene('G_YLR189C')

# 获取底层的SBML GeneProduct对象
sbml_gene = gene.getSBMLObject()
# 获取原始注释字符串
annotation_str = sbml_gene.getAnnotationString()

if annotation_str:
    # 解析RDF注释
    parser = RDFAnnotationParser()
    annotation_entries = parser.parseRDFAnnotation(annotation_str)
    
    # 遍历输出注释内容
    for entry in annotation_entries:
        print(f"注释关系类型: {entry.getQualifierType()}")
        print(f"关联资源URL: {entry.getResourceURI()}")

运行这段代码后,你就能看到bqbiol:isEncodedBy对应的NCBI和SGD基因ID了。

2. 修改现有RDF注释

如果要修改已有的RDF注释(比如替换NCBI基因ID),可以先清空原有注释,再重新构建RDF结构并写回:

# 定义新的NCBI基因ID
new_ncbi_uri = "http://identifiers.org/ncbigene/123456"
sbml_gene = gene.getSBMLObject()

# 清空现有注释
sbml_gene.unsetAnnotation()

# 创建新的RDF文档
parser = RDFAnnotationParser()
rdf_doc = parser.createRDFAnnotation()
# 创建对应基因的描述节点
desc = rdf_doc.createDescription(sbml_gene.getId())

# 构建新的isEncodedBy资源集合
resource_bag = rdf_doc.createBag()
resource_bag.addResource(new_ncbi_uri)
resource_bag.addResource("http://identifiers.org/sgd/S000004179")  # 保留原有SGD ID

# 将资源集合关联到isEncodedBy属性
desc.addProperty("bqbiol:isEncodedBy", resource_bag)

# 将新注释写入SBML元素
sbml_gene.setAnnotation(rdf_doc.toXMLString())

# 保存修改后的模型
cbm.CBWrite.writeSBML3FBC(cmod, 'modified_iMM904.xml')

3. 添加自定义注释(如last modified by)

对于last modified by这类自定义注释,分为两种场景:

给整个模型添加注释

可以直接用CBMPy的setAnnotation()或addNote()方法:

# 添加键值对形式的机器可读注释
cmod.setAnnotation('last modified by', 'Vinz')
# 添加人类可读的详细备注
cmod.addNote('This model was updated on 2024-05-20 to correct gene annotation entries.')

给单个基因添加自定义注释

同样可以用基因对象的setAnnotation()或addNote():

gene = cmod.getGene('G_YLR189C')
# 添加键值对注释
gene.setAnnotation('last modified', '2024-05-20')
# 添加人类可读的备注
gene.addNote('This gene encodes a putative transporter with unknown substrate specificity.')

这类注释会被存储为非RDF格式,你可以直接用getAnnotations()获取键值对,用getNotes()获取备注内容。

内容的提问来源于stack exchange,提问作者Vinz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:38:04