ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

生物信息学数据库检索:从NCBI GenBank到E-utilities实战

生物信息学数据库检索:从NCBI GenBank到E-utilities实战 简介生物信息学数据库及检索专题课件共127张PPT面向生物信息学初学者、医学生及相关科研人员系统讲解数据库的基本概念、记录结构、主要类型与检索方式。内容覆盖核苷酸数据库GenBank、EMBL、DDBJ和蛋白质数据库也涉及MySQL、AceDB等常用数据库工具及Taxonomy、Pubmed等资源库同时结合水稻抗病基因相关实例展示序列提交、注释与检索的完整流程。压缩包为PPTX格式含1个PPT文件包体约15MB。目前已有86人学习。借助这套幻灯片可快速建立对生物信息学数据库的整体认知掌握基于关键词、序列相似性、基因标识等途径的检索思路适合课程自学、教学备课或考试复习。1. 生物信息学数据库与检索从投稿交序列到看懂NCBI的GenBank如果你准备投一篇分子生物学或遗传学的文章编辑部通常不会先看结论有多漂亮而是先确认你的核苷酸序列有没有提交到 GenBank、EMBL 或 DDBJ 这类公共数据库中。这套 127 页的 PPT 把生物信息学数据库的体系从头到尾梳理了一遍以 NCBI 的 GenBank 为主线覆盖三大核苷酸数据库、dbEST、UniGene、dbSTS、dbGSS 等二级库并交代了 MySQL、AceDB 这类数据库工具的使用背景。它尤其适合两类人一是准备投稿的研究生二是想搞清“数据库记录里那条注释到底怎么来的”的入门者。看完你会明白一个 Accession 号背后其实藏着原始序列、物种分类、功能注释和十几个外部链接。2. 三大核苷酸数据库与GenBank记录结构Accession、GI、division怎么配合2.1 为什么先建库再投稿INSDC 的运作逻辑数据库Database这个词来自计算机领域意思是“用于收集、整理、储存、加工、发布和检索数据的系统”。生物信息学数据库比普通关系型数据库更复杂的地方在于每条记录不只是几行文本而是“原始数据 生物学注释”的捆绑体。水稻抗病相关基因 OsDR8 提交到 GenBank 后不仅包含那段碱基序列还包含基因名、功能描述、物种分类、编码区位置等注释信息而这些注释恰恰是后续检索和比对时最依赖的部分。国际上三个最重要的核苷酸数据库分别是 GenBank美国 NCBI、EMBL 核苷酸数据库欧洲和 DDBJ日本它们共同组成国际核苷酸序列数据库合作协议INSDC以天为单位交换各自新提交的序列数据。这就是为什么你在 GenBank 提交了一条序列几天后 EMBL 里也能查到同样的记录。另外USPTO、EPO、JPO 等专利机构的专利核苷酸序列也会被收入这些数据库所以检索时如果看到 PAT 分支下的记录别觉得奇怪——那正是专利序列的去重与归档机制。还有一个被很多人忽略的点投稿前提交序列不只是“规范要求”而是数据共享的起点。期刊编辑会直接检查稿件里引用的 Accession 号是否能访问、版本是否最新。如果你只给了一个不带版本号的旧号审稿阶段就会被退回补材料。后文 4.1 会专门讲这个坑。2.2 flatfile 里藏着三种标识Locus、Accession 与 GIGenBank 里每条序列都有一个 flatfile 文本记录类似一张结构化的“身份证”。一条记录通常包含三个专有编号Locus name位点名、Accession number注册号或登录号、GIGenInfo identifier。新手最容易混淆的是 Accession 和 GIAccession 是序列的稳定登录号比如 OsDR8 对应的那种字母数字组合GI 则是 NCBI 内部维护的整数编号用来追踪序列的每一次更新历史。简单说Accession 管“这条序列是什么”GI 管“这条序列现在是哪个版本”。PPT 里给出了一个真实 flatfile 的片段开头是碱基序列1 gggctccacc actagtaccc ctcactacag gtagccataa aaaaaatcga tcaccaaaac 61 ccattattag gttgtgtact gatacagaaa gttgggaacc aatctcccag cacagaaaac 121 ggtacggttc attagcgcgt gattaattaa atatttacta ttttttaaaa aaaatagatc 181 aatatgattt ttaagcaact ttcgtataaa tactttttca aaaaaacaca ccgttttcta 241 tagtttgaaa agcgtacacg cgtgaaatga gggagaaagg ttggaaacgt gggattgcaa ac注意看 LOCUS 行它定义了这条记录的位点名、序列长度、分子类型和所属的 GenBank 分支ORIGIN 之后才是实际碱基。实际检索时我一般不会直接读大段序列而是先看 ACCESSION 行和 VERSION 行确认版本号再看 SOURCE/ORGANISM 行确认物种最后扫一眼 FEATURES 里的 CDS 区间判断这个基因有没有完整的编码区注释。2.3 division 分支理解数据怎么分桶GenBank 把记录按来源和用途分成若干“分支”divisionPPT 里的表很实用PRI 是灵长类、ROD 是啮齿类、MAM 是其他哺乳类、VRT 是其他脊椎动物、INV 是无脊椎动物、PLN 是植物/真菌/海藻、BCT 是细菌、VRL 是病毒、PHG 是噬菌体还有 SYN 合成序列、UNA 未注释序列、EST 表达序列标签、PAT 专利序列、STS 序列标签位点、GSS 基因组调查序列、HTG 高通量基因组序列、HTC 高通量 cDNA 序列。这个分支表对检索的影响被很多人低估。比如你在 Nucleotide 库里搜“OsDR8”不加任何限定结果里可能混进大量来自 EST 分支的短片段如果加上“PLN”分支或“division”字段去过滤结果会干净很多。另外下载数据时也可以按分支拆分只想做植物基因分析就只取 PLN 分支不必把整个 GenBank 拖下来。2.4 数据体量与本地化511GB 下载成本的现实约束GenBank 的体量增长是很多初学者没概念的PPT 提到 Release 185 版本已有 142,284,608 条序列来源超过 50 万个物种其中约 12.2% 来自人类如果要下载全部序列大概需要 511 GB 磁盘空间。而且 GenBank 每天更新每年发布六个正式版本意味着“下全量”不是一个能一劳永逸的动作。面对这种体量PPT 里提到的 MySQL 数据库工具就有了实际意义。SQL 的好处在于能快速、灵活地存储记录文件和图像把 flatfile 解析成结构化表格后可以用一条 SQL 语句完成物种、长度、功能关键词的组合查询。另一个工具 AceDB 原本是线虫数据库A C. elegans DataBase它被广泛用于管理和展示基因组数据支持遗传图谱、物理图谱、新陈代谢途径、序列等多形式数据。我的习惯是如果只是日常做十几个基因的检索直接用网页端够用如果要建设自己的本地数据库先按 division 或物种子集下载再导入 MySQL而不是一口气下全量。3. 二级数据库与检索实操dbEST、UniGene、dbSTS、dbGSS怎么查怎么选3.1 dbESTGenBank 里最大的“草稿箱”dbEST 是 GenBank 的二级数据库专门存放表达序列标签EST。EST 是 cDNA 序列的一个片段通常来自 5 端、3 端或 CDS 区域长度一般在 300 到 400 bp而且是 single-pass 单次测序产物——也就是说质量不如全长 mRNA 序列那样经过多轮验证。PPT 里有一个很反直觉的数字GenBank 中 64% 以上的序列是 EST。这意味着你在 Nucleotide 里随便检索碰到的记录大概率是一个测序片段而不是完整基因。理解 EST 的定位很重要它适合做基因表达的存在性证据、设计 PCR 引物、辅助基因预测但不宜直接当全长序列用于构建载体或做精密比对。很多新手拿到一条 EST 就去分析蛋白结构结果自然不可靠。这个坑我在 4.3 里还会展开。3.2 UniGene把 EST 聚类成基因序列群UniGene 是 NCBI 另一个重要的核苷酸数据库它的核心思想是把来源于同一基因的非重复 EST 聚成一个“基因序列群”。也就是说UniGene 解决的是“我手里有一条片段但我不知道它属于哪个基因”的问题。PPT 列出了 UniGene 覆盖的物种范围人、大鼠、小鼠、斑马鱼、牛、蛙等模式生物以及拟南芥、水稻、小麦、大麦、玉米等植物一共 97 个物种。使用 UniGene 时常见操作是打开 UniGene 主页输入关键词比如“OsDR8”或“disease resistance”返回结果里会给出这个基因的序列群编号、所属物种、相关序列列表、表达谱信息等。我做基因家族分析时习惯先用 UniGene 确认一个基因是否有来自不同组织或不同发育阶段的 EST 支持再去决定要不要做实验验证。这个“先看证据、再定实验”的顺序能省不少时间。3.3 dbSTS 与 dbGSS定位标记和基因组调查序列的用途dbSTS 存的是序列标签位点STS200 到 500 bp 的短序列特点是已经定位到染色体上并且是单拷贝 DNA 片段。因为单拷贝它像一个“路标”可以用来构建遗传图谱或物理图谱。PPT 里提到一个非常具体的检索路径在 GenBank 主页选择 UniSTS 后输入关键词就能查看每条 STS 的染色体定位信息。dbGSS基因组调查序列和 dbEST 类似区别在于来源dbEST 是 cDNA 来源dbGSS 则是基因组来源通常由做全基因组测序的实验室提交序列可能来自 cosmid、BAC、YAC 等克隆载体。GSS 序列可以作为基因组 mapping 和测序组装的框架但片段较短、注释较粗不适合单独用来做基因功能研究。数据库序列来源长度特征主要用途我一般什么时候用dbESTcDNA 片段300–400 bp表达证据、引物设计验证目标基因是否有转录本UniGeneEST 聚类的基因群不固定基因存在性判断、表达谱基因家族分析前筛选dbSTS单拷贝基因组 DNA200–500 bp染色体定位、图谱构建做遗传图谱时选标记dbGSS基因组 DNA 片段不固定基因组测序框架组装大片段基因组时辅助3.4 检索实操NCBI 页面和 E-utilities 批量拿记录网页端检索是最基础的操作。打开 NCBI Nucleotide 数据库在搜索框里输入“OsDR8[Gene Name] AND Oryza sativa[Organism]”返回结果会明显比只输入 OsDR8 干净。接着点进任意一条记录重点看下面几块内容LOCUS 行写着序列长度和分子类型ACCESSION 和 VERSION 告诉你当前版本FEATURES 区域标注了 CDS、exon、intron 等坐标ORIGIN 是真正的碱基序列。如果需要批量下载直接抓网页效率太低。NCBI 提供了 E-utilities API常见做法是用 Python 的 Biopython 库from Bio import Entrez, SeqIO # NCBI 要求请求里带邮箱否则容易触发限流 Entrez.email youexample.com # 第一步检索获得命中的 ID 列表 search Entrez.esearch( dbnuccore, termOsDR8[Gene Name] AND Oryza sativa[Organism], retmax20 ) result Entrez.read(search) search.close() print(命中数量, result[Count]) print(前 20 个 ID, result[IdList]) # 第二步用 efetch 拉取完整 flatfile fetch Entrez.efetch( dbnuccore, id,.join(result[IdList]), rettypegb, retmodetext ) with open(osdr8_records.gb, w) as out: for line in fetch: out.write(line) fetch.close() # 第三步解析并输出每条的物种注释 for rec in SeqIO.parse(osdr8_records.gb, genbank): print(rec.id, rec.name, rec.annotations.get(organism))这里有两个参数需要留意retmax控制返回的最大条数默认 20如果你只想取前几条设成 5 就行rettypegb表示返回 GenBank flatfile 格式换成fasta则只返回序列。retmodetext是为了获得可读文本如果你想直接拿 XML 做下游解析可以改成retmodexml。注意 E-utilities 对请求频率有限制不加间隔地连发大量请求会被 NCBI 临时封 IP批量下载时最好在两次请求之间time.sleep(0.5)。4. 生物信息学数据库避坑记录标识符混淆、EST误判与本地导入的五个教训4.1 按旧 Accession 查不到序列现象文章或笔记里记录了一个 Accession 号比如几年前录的“U12345”现在去 NCBI 一查提示“sequence not found”或直接跳转到另一个号。原因GenBank 的序列会随实验修正、注释更新而发布新版本。旧版本序列不是被删除而是被标记为“secondary accession”主账号转移到了新版本记录上。不带版本号的 Accession 在新版系统里时常指向不明确。解决写引用时永远带上版本号比如U12345.2。检索时如果发现旧号失效先用 NCBI 的 “Nucleotide” 页搜索旧号看跳转关系再去https://www.ncbi.nlm.nih.gov/nuccore/旧号看它关联的新版本。从那以后我每次写论文草稿都会在括号里同时标注“Accession 版本号”补材料时省了大力气。4.2 只输基因名检索结果被 EST 淹没现象搜索“OsDR8”返回几千条结果其中大部分是 300 bp 左右的 EST 片段几乎没有完整的 mRNA 或基因组序列。原因上一章提到 GenBank 中超过六成的记录是 EST而 EST 又按物种、组织、处理条件分成了海量条目。不带任何字段限定地搜索相当于在整库里模糊匹配结果自然被片段序列霸屏。解决使用字段限定符。常用组合是基因名[Gene Name] AND 物种[Organism]如果还想进一步收紧可以加AND biomol_mRNA[Properties]或限定division PLN。NCBI 网页端的 “Advanced Search Builder” 可以可视化地组合这些条件脚本端则直接在 term 里拼字段。我一般先不加 division等看结果里 EST 占比太高时再补一条AND biomol mrna[Properties]。4.3 把 EST 当成全长 mRNA 做下游分析现象下载了几条 EST 序列直接做翻译、比对二级结构甚至设计过表达载体结果实验做不出来或被审稿人质疑序列完整性。原因EST 是 single-pass 单次测序片段长度只有 300 到 400 bp且可能带测序错误、载体序列污染无法代表完整的转录本。UniGene 聚类的意义就在于把同一个基因的多个 EST 拼成更可靠的基因序列群直接拿单条 EST 当前全长序列是用错了数据类型。解决先看 LOCUS 行的长度和分子类型再用 UniGene 找到该基因对应的序列群从群里的完整 mRNA 或 CDS 记录下手ESTS字段会列出所有成员 ESTHs.123456这种编号就是 UniGene 聚类号。如果订不到全长宁愿用 RACE 或转录组组装数据也别把 EST 硬拉成 ORF。4.4 本地 MySQL/SQLite 导入跑到一半失败现象从 GenBank 下载的 flatfile 导入 MySQL跑到几万条时报错要么是字段长度溢出要么是引号把 SQL 语法打断。原因flatfile 里的注释区域包含自由文本里面有引号、换行和特殊字符直接拼接 INSERT 语句必然出错另外 SeqEntry 的某些字段长度很容易突破默认 VARCHAR(255) 限制。解决不要用 SQL 直接解析 flatfile。常见做法是先用 Biopython 把 flatfile 解析成结构化 DataFrame 或 CSV再批量导入。导入时使用事务分批提交每 1000 条 commit 一次LOAD DATA INFILE比逐条 INSERT 快一个数量级。如果只是做小规模检索SQLite 就够用不必上 MySQL。4.5 全量 GenBank 下载的容量陷阱现象照着“下载全部序列大概需要 511 GB”这句话去规划环境结果磁盘不够或者下载到一半断掉、没有续传前功尽弃。原因511 GB 是 Release 185 时代的估算量现在实际体积已经涨了不少而且 GenBank 每天更新全量同步在实际操作中既不现实也没必要。解决按需获取。NCBI 提供按分支division、按物种、按时间范围分割的下载方式日常分析只需要某个基因家族的数据就让 E-utilities 返回结果而不是下载全库。如果一定要做本地镜像用 NCBI 的rsync服务并且按release目录分块同步不要用一个进程跑到底。5. 进阶用法把E-utilities和本地SQLite串成全流程检索前面几章讲的都是单点操作网页查询、脚本批量下载、本地导入。真正用起来我更推荐把“检索”和“本地管理”串成一个固定流程。核心思路是维护一张映射表记录 Accession、版本号、GI、物种、序列长度和文件路径。别小看这张表日常检索最痛苦的就是“我记得我下过这个基因但找不到了”有了一张索引表就再也不会翻车。用 SQLite 建表并填充数据的脚本大致长这样import sqlite3 from Bio import Entrez, SeqIO Entrez.email youexample.com conn sqlite3.connect(local_bioseq.db) cur conn.cursor() cur.execute( CREATE TABLE IF NOT EXISTS seq_index ( accession TEXT PRIMARY KEY, version TEXT, gi TEXT, name TEXT, organism TEXT, length INTEGER ) ) with Entrez.efetch(dbnuccore, idNM_001123.3, rettypegb, retmodetext) as handle: rec SeqIO.read(handle, genbank) gi rec.annotations.get(gi, n/a) cur.execute( INSERT OR REPLACE INTO seq_index VALUES (?,?,?,?,?,?), (rec.id, rec.id, gi, rec.name, rec.annotations.get(organism), len(rec.seq)) ) conn.commit() conn.close() print(已写入本地索引)这个示例把一条记录写进了seq_index表。INSERT OR REPLACE保证同一 Accession 重复拉取时直接覆盖len(rec.seq)返回的是序列实际碱基数可以顺便用于后续的质量监控。如果 BioPython 版本较新annotations里可能不再直接暴露gi字段旧脚本报KeyError时就去rec.annotations.keys()里查一下实际键名这个排错点我在避坑章说过。我现在的日常流程是先用一个大关键词跑esearch拿到候选 ID 列表一次性efetch回本地写入索引表后再用 SQL 做二次筛选。比如“找出所有长度大于 1000 bp 的水稻基因”“列出 5 号染色体上注释为 NBS-LRR 的序列”这些在 SQLite 里都是一条SELECT的事。数据库同步软件、向量数据库那套太重生物信息学检索的核心还是先稳住 Accession、GI 和注释三件套。从那以后我每次拿到一批序列都强制走一遍“Accession 校验 → 版本确认 → 写入本地索引 → 再进下游分析”这个习惯帮我躲了不少返工。希望帮到你。本文还有配套的精品资源点击获取
返回列表