介绍
本章提供了几个示例,说明如何使用电子实用程序构建有用的应用程序。这些示例使用Perl创建E-utility管道,并假设安装了LWP::Simple模块。本模块包括得到支持HTTP GET请求的函数。一个示例(应用程序4)使用HTTPPOST请求,并且需要LWP::UserAgent模块。在Perl中,标量变量名称前面是“$”符号,数组名称前面是一个“@”。在一些情况下,结果将存储在这些变量中,以便在随后的E-utility调用中使用。这里的代码示例是可以复制到文本编辑器并直接执行的工作程序。等效的HTTP请求可以用许多现代编程语言构造;所需要的只是创建和发布HTTP请求的能力。
基本管道
所有E-utility应用程序都由一系列调用组成,我们称之为管道。最简单的E-utility管道由两个调用组成,任何任意管道都可以从这些基本构建块组装而成。许多管道都以ESummary(检索DocSums)或EFetch(检索完整记录)结尾。注释指示代码中任何一个调用都需要的部分。
E搜索–E摘要/E提取
输入:Entrez文本查询
E总结输出:XML文档摘要
EFetch输出:格式化数据记录(例如摘要、FASTA)
使用LWP::Simple;
#下载在MeSH中为哮喘和哮喘编入索引的PubMed记录
#《白三烯》也于2009年出版。
$db=“已发布”;
$query=“哮喘[mesh]+AND+白三烯[mesh]+AND+2009[pdat]”;
#汇编搜索URL
$base='https://eutils.ncbi.nlm.nih.gov/enterz/eutils/';
$url=$base。“esearch.fcgi?db=$db&term=$query&usehistory=y”;
#发布搜索URL
$output=获取($url);
#解析WebEnv和QueryKey
$web=$1,如果($output=~/<WebEnv>(\S+)<\/WebEnv>/);
如果($output=~/<QueryKey>(\d+)<\/QueryKey>/),$key=$1;
###为ESearch-ESummary包含此代码
#汇编摘要URL
$url=$base。“esummary.fcgi?db=$db&query_key=$key&WebEnv=$web”;
#发布摘要URL
$docsums=获取($url);
打印“$docsums”;
###为ESearch-EFetch包含此代码
#组装efetch URL
$url=$base。“efetch.fcgi?db=$db&query_key=$key&WebEnv=$web”;
$url.=“&rettype=abstract&retmode=text”;
#发布efetch URL
$data=获取($url);
打印“$data”;
E成本–E摘要/E蚀刻
输入:Entrez UID列表(整数标识符,例如PMID、GI、Gene ID)
E总结输出:XML文档摘要
EFetch输出:格式化数据记录(例如摘要、FASTA)
使用LWP::Simple;
#下载与GI编号列表相对应的蛋白质记录。
$db=“蛋白质”;
$id_list='1946809225097886262855898295071996678417';
#组装epost URL
$base='https://eutils.ncbi.nlm.nih.gov/enterz/eutils/';
$url=$base。“epost.fcgi?db=$db&id=$id_list”;
#发布报告URL
$output=获取($url);
#解析WebEnv和QueryKey
$web=$1,如果($output=~/<WebEnv>(\S+)<\/WebEnv>/);
如果($output=~/<QueryKey>(\d+)<\/QueryKey>/),$key=$1;
###为EPost-ESummary包含此代码
#汇编摘要URL
$url=$base。“esummary.fcgi?db=$db&query_key=$key&WebEnv=$web”;
#发布摘要URL
$docsums=获取($url);
打印“$docsums”;
###为EPost-EFetch包含此代码
#组装efetch URL
$url=$base。“efetch.fcgi?db=$db&query_key=$key&WebEnv=$web”;
$url.=“&rettype=fasta&retmode=text”;
#发布efetc URL
$data=获取($url);
打印“$data”;
注:
要在单个URL中发布大量(数百个以上)UID,请对EPost调用使用HTTP post方法(请参阅
应用程序4).
ELink–E摘要/Efetch
输入:数据库A中的Entrez UID列表(整数标识符,例如PMID、GI、Gene ID)
E总结输出:数据库B中的链接XML文档摘要
EFetch输出:数据库B中的格式化数据记录(如摘要、FASTA)
使用LWP::Simple;
#下载与对应于列表的一组蛋白质相关的基因记录
#GI编号。
$db1=“蛋白质”;#&数据库来自
$db2=“基因”;#&数据库
$linkname='蛋白基因';#所需链接和链接名
#以$db1输入UID(蛋白质GI)
$id_list='1946809225097862628558982995071996678417';
#组装链接URL
$base='https://eutils.ncbi.nlm.nih.gov/enterz/eutils/';
$url=$base。“elink.fcgi?dbfrom=$db1&db=$db2&id=$id_list”;
$url.=“&linkname=$linkname&cmd=neighbor_history”;
#发布链接URL
$output=获取($url);
#解析WebEnv和QueryKey
$web=$1,如果($output=~/<WebEnv>(\S+)<\/WebEnv>/);
如果($output=~/<QueryKey>(\d+)<\/QueryKey>/),$key=$1;
###为ELink-ESummary包含此代码
#汇编摘要URL
$url=$base。“esummary.fcgi?db=$db&query_key=$key&WebEnv=$web”;
#发布摘要URL
$docsums=获取($url);
打印“$docsums”;
###为ELink-EFetch包含此代码
#组装efetc URL
$url=$base。“efetch.fcgi?db=$db2&query_key=$key&WebEnv=$web”;
$url.=“&rettype=xml&retmode=xml”;
#发布efetch URL
$data=获取($url);
打印“$data”;
笔记:
要在一个URL中向ELink提交大量(数百个以上)UID,请对ELink调用使用HTTP POST方法(请参阅应用程序4)。&linkname参数用于强制ELink只返回一组链接(一个&query_key),以简化解析。如果需要多个链接,则必须更改上述代码以解析ELink XML输出中的多个&query_key值。此代码以“批处理”模式使用ELink,因为只返回一组基因ID,并且蛋白质GI和基因ID之间的一对一对应关系丢失。要保留此一对一通信,请参阅
应用程序4
如下所示。
E搜索–ELink–E摘要/E提取
输入:数据库A中的Entrez文本查询
E总结输出:数据库B中的链接XML文档摘要
EFetch输出:数据库B中的格式化数据记录(如摘要、FASTA)
使用LWP::Simple;
#下载链接到已发表摘要的蛋白质FASTA记录
#2009年在MeSH中对哮喘和
#白三烯。
$db1='pubmed';
$db2=“蛋白质”;
$linkname='pubmed_protein';
$query=“哮喘[mesh]+AND+白三烯[mesh]+AND+2009[pdat]”;
#汇编搜索URL
$base='https://eutils.ncbi.nlm.nih.gov/enterz/eutils/';
$url=$base。“esearch.fcgi?db=$db1&term=$query&usehistory=y”;
#发布搜索URL
$output=获取($url);
#解析WebEnv和QueryKey
$web1=$1,如果($output=~/<WebEnv>(\S+)<\/WebEnv>/);
$key1=$1如果($output=~/<QueryKey>(\d+)<\/QueryKey>/);
#组装链接URL
$base='https://eutils.ncbi.nlm.nih.gov/enterz/eutils/';
$url=$base。“elink.fcgi?dbfrom=$db1&db=$db2”;
$url.=“&query_key=$key1&WebEnv=$web1”;
$url.=“&linkname=$linkname&cmd=neighbor_history”;
打印“$url\n”;
#发布链接URL
$output=获取($url);
打印“$output\n”;
#解析WebEnv和QueryKey
$web2=$1,如果($output=~/<WebEnv>(\S+)<\/WebEnv>/);
$key2=$1如果($output=~/<QueryKey>(\d+)<\/QueryKey>/);
###为ESearch-ELink-ESummary包含此代码
#汇编摘要URL
$url=$base。“esummary.fcgi?db=$db2&query_key=$key2&WebEnv=$web2”;
#发布摘要URL
$docsums=获取($url);
打印“$docsums”;
###为ESearch-ELink-EFetch包含此代码
#组装efetch URL
$url=$base。“efetch.fcgi?db=$db2&query_key=$key2&WebEnv=$web2”;
$url.=“&rettype=fasta&retmode=text”;
#发布efetch URL
$data=获取($url);
打印“$data”;
笔记:
&linkname参数用于强制ELink仅返回一组链接(一个&query_key)以简化解析。如果需要多个链接,则必须更改上述代码以解析ELink XML输出中的多个&query_key值。此代码在“批处理”模式下使用ELink,因为只返回一组PubMed ID,PubMed-ID及其相关PubMed-DD之间的一对一通信丢失。要保留此一对一通信,请参阅
应用程序4
如下所示。
EPost–ELink–E摘要/E蚀刻
输入:数据库A中的Entrez UID列表(整数标识符,例如PMID、GI、Gene ID)
E总结输出:数据库B中的链接XML文档摘要
EFetch输出:来自数据库B的格式化数据记录(例如摘要、FASTA)
使用LWP::Simple;
#下载与一组蛋白质相关的基因记录
#蛋白质GI编号列表。
$db1=“蛋白质”;#&数据库来自
$db2=“基因”;#&数据库
$linkname='蛋白质基因';
#以$db1输入UID(蛋白质GI)
$id_list='1946809225097886262855898295071996678417';
#组装epost URL
$base='https://eutils.ncbi.nlm.nih.gov/enterz/eutils/';
$url=$base。“epost.fcgi?db=$db1&id=$id_list”;
#发布报告URL
$output=获取($url);
#解析WebEnv和QueryKey
$web1=$1,如果($output=~/<WebEnv>(\S+)<\/WebEnv>/);
$key1=$1如果($output=~/<QueryKey>(\d+)<\/QueryKey>/);
#组装链接URL
$base='https://eutils.ncbi.nlm.nih.gov/enterz/eutils/';
$url=$base。“elink.fcgi?dbfrom=$db1&db=$db2&query_key=$key1”;
$url.=“&WebEnv=$web1&linkname=$linkname&cmd=neighbor_history”;
#发布链接URL
$output=获取($url);
#解析WebEnv和QueryKey
$web2=$1,如果($output=~/<WebEnv>(\S+)<\/WebEnv>/);
$key2=$1如果($output=~/<QueryKey>(\d+)<\/QueryKey>/);
###为ESearch-ELink-ESummary包含此代码
#汇编摘要URL
$url=$base。“esummary.fcgi?db=$db2&query_key=$key2&WebEnv=$web2”;
#发布摘要URL
$docsums=获取($url);
打印“$docsums”;
###为ESearch-ELink-EFetch包含此代码
#组装efetch URL
$url=$base。“efetch.fcgi?db=$db2&query_key=$key2&WebEnv=$web2”;
$url.=“&rettype=xml&retmode=xml”;
#发布efetch URL
$data=获取($url);
打印“$data”;
笔记:
要在单个URL中发布大量(数百个以上)UID,请对EPost调用使用HTTP post方法(请参阅下面的应用程序4)。&linkname参数用于强制ELink仅返回一组链接(一个&query_key)以简化解析。如果需要多个链接,则必须更改上述代码以解析ELink XML输出中的多个&query_key值。该代码在“批处理”模式下使用ELink,因为只返回一组基因ID,并且丢失了蛋白质GIs和基因ID之间的一一对应关系。要保留此一对一通信,请参阅
应用程序4
如下所示。
EPost–E搜索
输入:Entrez UID列表(整数标识符,例如PMID、GI、Gene ID)
输出:历史记录集,由与Entrez文本查询匹配的已发布UID子集组成
使用LWP::Simple;
#给定一组蛋白质GI编号,此脚本创建
#包含输入集成员的历史集
#对应于人类蛋白质。
#(这些蛋白质中哪些来自人类?)
$db=“蛋白质”;
$query=“人类[orgn]”;
$id_list='1946809225097886262855898295071996678417';
#组装epost URL
$base='https://eutils.ncbi.nlm.nih.gov/enterz/eutils/';
$url=$base。“epost.fcgi?db=$db&id=$id_list”;
#发布报告URL
$output=获取($url);
#解析WebEnv和QueryKey
$web=$1,如果($output=~/<WebEnv>(\S+)<\/WebEnv>/);
如果($output=~/<QueryKey>(\d+)<\/QueryKey>/),$key=$1;
#汇编搜索URL
$term=“%23$key+AND+$query”;
#%23将“#”放在查询键之前
$url=$base。“esearch.fcgi?db=$db&term=$term”;
$url.=“&WebEnv=$web&usehistory=y”;
#搜索后URL
$limited=get($url);
打印“$limited\n”;
#输出仍保留在历史服务器上(&query_key,&WebEnv)
#使用上述ESummary或EFetch检索它们
注:
要在单个URL中发布大量(数百个以上)UID,请对EPost调用使用HTTP post方法(请参阅
应用程序4).
ELink–E搜索
输入:数据库A中的Entrez UID列表(整数标识符,例如PMID、GI、Gene ID)
输出:历史记录集,由数据库B中与Entrez文本查询匹配的链接UID子集组成
使用LWP::Simple;
#给定一组蛋白质GI编号,此脚本创建一个
#包含链接到输入成员的基因ID的历史集
#也位于人类X染色体上。
#(哪些输入蛋白是由人类基因编码的
#X染色体?)
$db1=“蛋白质”;#&数据库来自
$db2=“基因”;#&数据库
$linkname='蛋白基因';#所需链接和链接名
$query='human[orgn]+AND+x[chr]';
#以$db1输入UID(蛋白质GI)
$id_list=“1485969744254418218793717945573776678417”;
#组装链接URL
$base='https://eutils.ncbi.nlm.nih.gov/enterz/eutils/';
$url=$base。“elink.fcgi?dbfrom=$db1&db=$db2&id=$id_list”;
$url.=“&linkname=$linkname&cmd=neighbor_history”;
#发布链接URL
$output=获取($url);
#解析WebEnv和QueryKey
$web=$1,如果($output=~/<WebEnv>(\S+)<\/WebEnv>/);
如果($output=~/<QueryKey>(\d+)<\/QueryKey>/),$key=$1;
#汇编搜索URL
$term=“%23$key+AND+$query”;#%23将“#”放在查询键之前
$url=$base。“esearch.fcgi?db=$db2&term=$term&WebEnv=$web&usehistory=y”;
#搜索后URL
$limited=get($url);
打印“$limited\n”;
#输出仍保留在历史服务器上(&query_key,&WebEnv)
#与前面的示例一样,使用ESummary或EFetch检索它们
注:
要在一个URL中向ELink提交大量(数百个以上)UID,请对ELink调用使用HTTP POST方法(请参阅
应用程序4). &linkname参数用于强制ELink仅返回一组链接(一个&query_key)以简化解析。如果需要多个链接,则必须更改上述代码以解析ELink XML输出中的多个&query_key值。此代码以“批处理”模式使用ELink,因为只返回一组基因ID,并且蛋白质GI和基因ID之间的一对一对应关系丢失。要保留此一对一通信,请参阅
应用程序4
如下所示。
应用1:将GI编号转换为登录编号
目标:从核苷酸GI编号列表开始,准备一组相应的登录编号。
解决方案:将EFetch与retttype=acc一起使用(&R)
输入:$gi_list–以逗号分隔的gi编号列表
输出:加入编号列表。
使用LWP::Simple;
$gi_list=“24475906224465210509786259507198”;
#组装URL
$base='https://eutils.ncbi.nlm.nih.gov/enterz/eutils/';
$url=$base。“efetch.fcgi?db=nucleotide&id=$gi_list&rettype=acc”;
#发布URL
$output=获取($url);
打印“$output”;
笔记:
输入的顺序与$GI_list中GI编号的顺序相同。
应用2:将加入号转换为数据
目标:从蛋白质登录号列表开始,以FASTA格式返回序列。
解决方案:创建一个由项目组成的字符串,项目之间用“OR”分隔,其中每个项目都是后跟“[accn]”的登录号。
示例:accn1[accn]+OR+accn2[accn]+OR+accn3[accn2]+OR+…
在ESearch中将此字符串作为术语提交,然后使用EFetch检索FASTA数据(&T)。
输入:$acc_list–以逗号分隔的加入列表
输出:FASTA数据
使用LWP::Simple;
$acc_list='NM_009417号,NM_000547,NM_001003009,NM_019353号';
@acc_array=拆分(/,/,$acc_list);
#将[accn]字段附加到每个登录
对于($i=0;$i<@acc_array;$i++){
$acc_array[$i].=“[accn]”;
}
#用OR连接加入项
$query=联接('+OR+',@acc_array);
#汇编搜索URL
$base='https://eutils.ncbi.nlm.nih.gov/enterz/eutils/';
$url=$base。“esearch.fcgi?db=nuccore&term=$query&usehistory=y”;
#发布搜索URL
$output=获取($url);
#解析WebEnv和QueryKey
$web=$1,如果($output=~/<WebEnv>(\S+)<\/WebEnv>/);
如果($output=~/<QueryKey>(\d+)<\/QueryKey>/),$key=$1;
#组装efetch URL
$url=$base。“efetch.fcgi?db=nuccore&query_key=$key&WebEnv=$web”;
$url.=“&rettype=fasta&retmode=text”;
#发布efetch URL
$fasta=获取($url);
打印“$fasta”;
笔记:
对于大量访问,请使用HTTP POST提交搜索请求(请参阅
应用程序4),请参阅
应用程序3
用于批量下载大型集。
应用程序3:检索大型数据集
目标:下载FASTA格式的所有黑猩猩mRNA序列(>50000个序列)。
解决方案:首先使用ESearch检索这些序列的GI编号并将其发布到历史服务器上,然后使用多个EFetch调用检索500个批次的数据。
输入:$query–黑猩猩[orgn]+AND+生物醇+mrna[prop]
输出:一个名为“himpe.fna”的文件包含FASTA数据。
使用LWP::Simple;
$query=“黑猩猩[orgn]+AND+biomol+mrna[prop]”;
#汇编搜索URL
$base='https://eutils.ncbi.nlm.nih.gov/enterz/eutils/';
$url=$base。“esearch.fcgi?db=nucleotide&term=$query&usehistory=y”;
#发布搜索URL
$output=获取($url);
#解析WebEnv、QueryKey和Count(检索到的记录数)
$web=$1,如果($output=~/<WebEnv>(\S+)<\/WebEnv>/);
如果($output=~/<QueryKey>(\d+)<\/QueryKey>/),$key=$1;
如果($output=~/<count>(\d+)<\/count>/),$count=$1;
#打开输出文件进行写入
open(OUT,“>himple.fna”)||die“无法打开文件!\n”;
#以500个批次检索数据
$retmax=500;
for($retstart=0;$retstart<$count;$rettart+=$retmax){
$efetch_url=$base。“efetch.fcgi?db=nucleotide&WebEnv=$web”;
$efetch_url.=“&query_key=$key&retstart=$retstart”;
$efetch_url.=“&retmax=$retmax&rettype=fasta&retmode=text”;
$efetch_out=获取($efetch _url);
打印输出“$efetch_OUT”;
}
收尾;
应用程序4:为大型数据集的每个成员查找唯一的链接记录集
目标:分别下载人类20号染色体上每个当前基因的SNP编号(标识符)。
解决方案:首先使用ESearch检索基因的基因ID,然后组装ELink URL,其中每个基因ID作为单独的&ID参数提交。
输入:$query–人类[orgn]+AND+20[chr]+AND+活动[prop]
输出:一个名为“snp_table”的文件,每行包含基因id,后跟一个冒号(“:”),后跟以逗号分隔的链接snp编号列表。
使用LWP::Simple;
使用LWP::UserAgent;
$query='human[orgn]+AND+20[chr]+AND+alive[prop]';
$db1=“基因”;
$db2='snp';
$linkname='gene_snp';
#汇编搜索URL
$base='https://eutils.ncbi.nlm.nih.gov/enterz/eutils/';
$url=$base。“esearch.fcgi?db=$db1&term=$query&usehistory=y&retmax=5000”;
#发布搜索URL
$output=获取($url);
#解析检索到的ID
while($output=~/<Id>(\d+?)<\/Id>/sg){
推送(@ids,1美元);
}
#将链接URL组装为HTTP POST调用
$url=$base。“elink.fcgi”;
$url_params=“dbfrom=$db1&db=$db2&linkname=$linkname”;
foreach$id(@ids){
$url_params.=“&id=$id”;
}
#创建HTTP用户代理
$ua=新LWP::UserAgent;
$ua->代理(“elink/1.0”.$ua->agent);
#创建HTTP请求对象
$req=新HTTP::请求POST=>“$url”;
$req->content_type('应用程序/x-www-form-urlencoded');
$req->内容(“$url_params”);
#发布HTTP请求
$response=$ua->请求($req);
$output=$response->content;
open(OUT,“>snp_table”)||die“无法打开文件!\n”;
while($output=~/<LinkSet>(.*?)<\/LinkSet>/sg){
$linkset=$1;
if($linkset=~/<IdList>(.*?)<\/IdList>/sg){
$input=$1;
$input_id=$1,如果($input=~/<id>(\d+)<\/id>/sg);
}
而($linkset=~/<Link>(.*?)<\/Link>/sg){
$link=$1;
如果($link=~/<Id>(\d+)<\/Id>/),则推送(@output,$1);
}
打印输出“$input_id:”。join(',',@output)。“\n”;
}
收尾;
笔记:
本例使用HTTP POST请求进行elink调用,因为Gene ID的数量超过500。ESearch调用中的&retmax参数设置为5000,因为这是对在一个请求中发送到ELink的ID数量的合理限制(如果发送5000个ID,则实际上执行了5000个ELink操作)。如果需要链接5000多条记录,请将&retstart添加到ESearch调用中,并对每批5000个ID重复整个过程,对每批递增&retstart。