如何在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
相关产品推荐
相关产品推荐

