IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope: Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  SOA and Web services  >

用于生物信息的 Web 服务,第 1 部分

一个用于把生物信息应用程序作为高吞吐量 Web 服务部署在 NC BioGrid 上的框架。

developerWorks
文档选项

未显示需要 JavaScript 的文档选项


级别: 初级

Chetna Warade (warade@us.ibm.com)IBM Healthcare & Life Sciences
Virinder Batra (batra@us.ibm.com)IBM Healthcare & Life Sciences
Rick Runyan (runyan@us.ibm.com)IBM Healthcare & Life Sciences

2004 年 6 月 01 日

这个系列描述了构建、部署和使用用于生物信息应用程序的高吞吐量 Web 服务的过程。它旨在指导基于 Open-Bioinformatics Foundations 软件工具包以及诸如 BioPerl、BioJava 和 BioPython 这样的程序包的软件开发。本文说明了如何部署服务以及给 BioPerl 模块提供文档样式的 Web 服务扩展的新实现,通过 BioPerl 模块,各种各样的现有应用程序将可以使用这样的服务。

用于生命科学的 Web 服务

这篇关于用于生命科学的 Web 服务的 IBM alphaWorks 文章包括一组 Web 服务示例,它提供了标准生命科学应用程序并展示了这种技术(参见 参考资料)。该项目是用 Java 编写的,并且主要用作以现有的生物信息应用程序为基础的包装器。它允许研究人员搜索 Web 服务和通过 XML 文档获得输出、以及查看整个请求过程中的中间步骤。

生物信息研究应用程序存在于用许多不同的语言完成的各个阶段。此外,从多个不同的应用程序中构建工作流需要在本地安装应用程序,手工复制输入和输出数据,频繁地修改源代码以适应输出和输入数据格式的改变。然而,当应用程序作为 Web 服务公开时,就可以相当简单地协调它们的执行。当服务可以通过产生和使用兼容的 XML 文档进行通信时,编排这些服务的过程就可以自动化。我们用于 Basic Local Alignment Search Tool (BLAST) 的概念验证示例 Web 服务是在 NC BioGrid 上托管的(请参见 参考资料)。

当考虑用于比较基因组学的工具时,效率、吞吐量和工作流是主要的问题。Web 服务具有解决这些问题的潜能,方法是支持未来的应用程序使用按需处理功能和最佳组合组件。大多数生物信息应用程序都是由非常长的工作流组成的,它们通常是并行的。然而,在大多数工作流中,只有小部分工作流可能是并行的,而工作流链的其余部分仅仅包括独立的可执行工作流,每个可执行工作流在完成时都会继续触发可执行工作流。我们的工作尝试通过 Web 服务和一些对现有标准生物信息库的扩展来委托部分工作流,使之能够与 NC BioGrid 的处理功能并行。因此,可以利用网格处理功能的工作流的任何部分都将提交给网格,而结果以能够集成到工作流的剩余部分的形式返回。

本文要求您具备下列技术的中级知识:

  • Perl 编程语言
  • BioPerl
  • 开放网格服务体系结构(Open Grid Services Architecture)
  • Web 服务
  • Web 服务描述语言(Web Services Description Language,WSDL)和生物信息应用程序
  • 资源如下:
    • BLAST
    • ClustalW
    • Phlyogenic trees
    • PubMed
    • GenBank

文档样式的服务

有几组重叠的数据类型定义(Data Type Definitions,DTD)可以用于描述生物信息实体,比如序列(Sequence)、基因(Gene)或 BLAST 输入和输出。文档样式的服务的价值在于,在研究团体建立规范形式的数据表示之前,可以通过 XSL 样式表转换文档/文字的消息来教使用完全不同的 DTD 的 Web 服务进行互操作。

虽然许多现有的 Web 服务基于远程过程调用(Remote Procedure Call,RPC),但是数目越来越多的 Web 服务正使用文档/文字的编码,并且通过交换 XML 文档进行通信。文档样式的 Web 服务之所以在生物信息中有用,是因为许多生物信息应用程序采用非常多的参数并且产生非常复杂的格式,RPC 变得让程序员感到头疼。

由 Web 服务服务器发布的 Web 服务描述语言(Web Services Description Language,WSDL)描述了类型(Type)元素中采用 XML Schema 定义(XML Schema Definition,XSD)表示的数据交换格式,而 Web 输入和输出是作为对 XSD Schema 中的元素的引用来描述的。

文档样式的 Web 允许程序员以三种方式进行解释:

  1. 产生和发送文字的 XML。
  2. 产生文档对象模型(Document Object Model,DOM)对象,并发送由 DOM 树产生的 XML。
  3. 产生正常对象并将这些对象序列化成 XML。

通过在文档样式的 Web 服务中使用用于数据交换的 DOM 模型,可以简单地产生文档,方法是实例化和组合许多对象。然而,对于更复杂的文档,构建 DOM 树所需的代码可能是难于处理的。

Apache Axis 可以从内嵌在 WSDL 中的 XSD Schema 构建一些 Java 对象。这些对象中包含 get 和 set 方法,允许程序员与它们交互并且能够将它们序列化到 XML 中。我们开发了一个类似的工具,可以用于从 WSDL 生成 Perl 对象。

为了使用这个工具构建对象,您必须在适当的 WSDL 中运行 WSDL2Perl,然后导入和实例化生成的对象。WSDL2Perl 生成存根来支持通过 Perl 对象实例化和调用 Web 服务。有两种可能的模式:可以在一种模式下使用和产生文字的 XML,而在另一种模式下使用和产生由 WSDL2Perl 从该 Schema 生成的对象。

WSDL2Perl:用于客户端绑定的开发人员工具

WSDL2Perl 是一个用于简化用 Perl 编程语言编写文档样式的 Web 服务的工具。该工具需要 SOAP::Lite V0.55 并且在相同的版本上进行测试。WSDL2Perl 仅支持客户端对象和存根生成。WSDL2Perl 允许调用在异类平台上开发和运行的应用程序(请参见 SOAP::Lite bug部分)。

WSDL2Perl 工具的基本调用看起来如下所示:


WSDL2Perl:从 WSDL 创建存根和 Perl 数据类型
     $ perl WSDL2Perl WSDL-file-URL
   

这个命令生成客户端绑定。通过这个工具创建的文件驻留在根据 targetNamespace 属性命名的目录中。对于类型部分中的每个条目,WSDL2Perl 工具都生成一个 Perl 对象。该工具为每个绑定生成一个存根类,并且为支持 SOAP 传输协议的每个服务生成一个 SOAP 实现。

从 WSDL 类型生成的 Perl 对象是根据 WSDL 类型命名的。该对象是一个 Perl 模块,因而具有扩展名 .pm(如 perlObjectName.pm)。例如,给定 清单 2中的 WSDL,WSDL2Perl 就会生成 清单 3中的 Perl 模块:


清单 2:类型
 <xsd:complexType name="phone">
   <xsd:all>
     <xsd:element name="areaCode" type="xsd:int"/>
     <xsd:element name="exchange" type="xsd:string"/>
     <xsd:element name="number" type="xsd:string"/>
   </xsd:all>
 </xsd:complexType>
   


清单 3:生成的 Perl 模块

 #!perl -w
use strict;
package Phone;
sub new{
my $proto = shift;
my $class = ref($proto) || $proto;
my $self = {};
my $self->{AREACODE} = undef;
my $self->{EXCHANGE} = undef;
my $self->{NUMBER} = undef;
bless($self,$class);
return $self;
}
sub areaCode{
my $self = shift;
	if(@_) {
	$self->{AREACODE} = shift;
	}
return $self->{AREACODE};
}
sub exchange{
my $self = shift;
	if(@_) {
	$self->{EXCHANGE} = shift;
	}
return $self->{EXCHANGE};
}
sub number{
my $self = shift;
	if(@_) {
	$self->{NUMBER} = shift;
	}
return $self->{NUMBER};
}
1;
   

PortTypes 和绑定

在 Java 中,服务定义接口(Service Definition Interface,SDI)是从 WSDL 的 portType 中派生的接口。这是用于访问服务中的操作的接口。我们可以有一个 portType 和两个绑定,即 RPC 和文档样式。由于文档/文字改变了该接口的外观,我们不能将单个接口用于这两个接口,所以我们用两个接口—一个名为 pt 而另一个名为 bDoc—和两个存根—bRPCStub(它实现 pt)和 bDocStub(它实现 bDoc)结尾。这种惯例不适用于 WSDL2Perl,因为它仅用于简化文档样式的 Web 服务,而 SOAP::Lite 包支持容易地使用和访问 RPC Web 服务。

当存根方法实现 SDI 时,方法名与绑定名是相同的。该存根将其方法调用转换成 SOAP 调用。存根用作远程服务的代理;存根的行为完全就像远程服务是在本地对象中实现的一样。换句话说,用户不需要处理端点 URL、名称空间或参数数组,它们通过 Service 对象和 Call 方法参与动态调用。存根对用户隐藏了所有的工作。所有的存根都包含在根据端口命名的包中。


清单 4:示例
#!perl -w
package GridBlastSoap;
use strict;
use SOAP::Lite;
my $soap;
my $uri;
my $proxy;
sub new{
my $proto = shift;
my $class = ref($proto) || $proto;
$uri = shift;
$proxy = shift;
my $self = {};
bless($self,$class);
return $self;
}
sub Call{
my $result;
my $onaction = $_[2];
$soap = SOAP::Lite->new(uri=>"$uri",
              proxy=>"$proxy",
              on_action=>(sub{$onaction}),
              readable=>"1");
if($_[1]){
       		$result = $soap->call($_[0] => $_[1]);
}
else{
       		$result = $soap->call($_[0]);
}
if($result->fault){
      		print "GridBlastSoap: Fault ".$result->faultcode." has occurred ".
      		$result->faultstring;
}
return $result;
}

客户端程序通常不直接实例化存根。它改为实例化服务并调用 get 方法来返回存根。服务是从 WSDL 文件中的服务语句派生的。WSDL2Perl 从服务语句生成一个对象。例如,给定 清单 5中的 WSDL,WSDL2Perl 会生成根据服务命名的对象,如 清单 6中所示:


清单 5:服务
<service name="GridBlast">
      <documentation>The first Web Service for a grid enabled BLAST brought to 
you by IBM and NC State Unv.</documentation>
        <port name="GridBlastSoap" binding="t:GridBlastSoap">
           <soap:address location=
           "http://bluejay001.ncbiogrid.org/cgi-bin/GridBlast.cgi"/>
        </port>
</service>


清单 6:根据服务命名的对象

#!perl -w
use strict;
package GridBlast;
use GridBlastSoap;
my $uri = "http://bluejay001.ncbiogrid.org/";
my $proxy = "http://bluejay001.ncbiogrid.org/cgi-bin/GridBlast.cgi";
sub getGridBlastSoap{
my $soapservice;
   
     if($_[1]){
        $soapservice =GridBlastSoap->new($uri,$_[1]);
     }else{
        $soapservice =GridBlastSoap->new($uri,$proxy);
     }
     return $soapservice;
 }

生成的 Perl 对象为 WSDL 的 Service 元素中列出的每个端口定义一个 get 方法。在默认情况下,Service 对象将使存根指向 WSDL 文件中描述的端点 URL,但是用户可以指定一个不同的 URL,方法是将所期望的 URL 作为参数传送到 get 方法。

对标准生物信息库 (BioPerl) 的扩展

最流行的用于生物信息应用程序的开放源代码平台是由 Open Bioinformatics Foundation 发布的库。这些库中最大的是 BioPerl。BioPerl 有七个模块,其中的每个模块可以用于在 Perl 中创建应用程序工作流。通过使用 BioPerl 库,可以将一些预构建的软件对象用于应用程序。大多数标准分析工具(如 BLAST 和 ClustalW)都已经包括在 BioPerl 库中,这样所有的终端用户都需要做的就是简单地在工作流中包括这些库,并且进行必要的功能调用。例如,为了执行 BLAST(著名的标准同源搜索应用程序),有两个不同的模块在 BioPerl 库中:StandAloneBlast 和 RemoteBlast。StandAloneBlast 假定用户在他们的的主机上有可执行程序,并且将参数传送给可执行程序,可执行程序以人可读的格式返回结果。RemoteBlast 在 National Center for Biotechnology Information (NCBI) 网站通过 http 对 BLAST 可执行程序进行功能调用,这样,用户就不必在他们的主机上安装两个真正的模块。

我们对 BioPerl 库的扩展就是 WebServiceBlast 模块,它允许用户通过 Web 服务利用网格的远程处理能力。这个模块有与 RemoteBlast 模块相同的签名,并且以类似的格式返回同源搜索工具(称为 BLAST)的结果。因此,这个扩展并没有作任何假定,并且没有对现有的 BioPerl 模块进行任何修改。BioPerl 库的 SearchIO 模块可以容易地解析结果 BLAST 输出文件。因此,想要利用网格处理能力的生物学家只需调用 WebServiceBlast 就可以了,而不用调用 RemoteBlast 模块。

WebServiceBlast 模块对象是从 Bio::Root::Root 和 Bio::Root:: 继承的。BioPerl 库中包括的模块有:

  • Bio::Root::Root
  • Bio::Root::IO
  • Bio::SeqIO
  • Bio::Tools::BPlite
  • Bio::SearchIO.

IO::String 和 SOAP::Lite 是 CPAN 库中其他的两个必需的模块。

WebServiceBlast 模块的主要功能是根据用户参数创建 XML 文档。WebServiceBlast 允许通过 WSDL2Perl 工作生成的 Perl 的对象来调用 Web 服务。结果 BLAST 输出报告以 XML 格式返回到工作流。该模块还允许用户传送他们包含基因序列的输入文件的名称,这样,输入序列就自动保存到 XML 文档中。在用户需要提交多个序列以充分利用网格的处理能力的情况下,WebServiceBlast 只创建一个 XML 文档。这个文档包含每个提交的序列的所有必要信息,例如序列标识标记、序列描述、长度和核苷酸链。

在 NC BioGrid 中,当 BLAST 执行完成时,WebServiceBlast 模块会自动地将结果保存到主机上所期望的目录中,并且给 XML BLAST 提供输出报告。BioPerl 的 SearchIO 模块可以简单地解析这些报告。下面是客户端代码的示例,它对 WebServiceBlast 模块进行调用。


清单 7:运行 WebServiceBlast
 use Bio::Perl;
use Bio::Tools::Run::WebServiceBlast;
use Bio::SearchIO;
my $prog='blastn';
my $db='swissprot';
my $e_val='1e-10';
my $MATRIX='BLOSUM62';
#Object construction from WebServiceBlast module
my @params=('-prog'=>$prog, '-data'=>$db,
'-expect'=>$e_val, '-readmethod'=>'Blast', '-matrix'=>'BLOSUM62');
my $factory=Bio::Tools::Run::WebServiceBlast->new(@params);
#Function call to NC BioGrid via Web Services
                   
my $res=$factory->submit_blast("sample.fasta");
#Preparation of output files
push @outfile, "/home/maltuna/ncgridtools/Bioperl/bioperl-1.2.1/out1";
push @outfile, "/home/maltuna/ncgridtools/Bioperl/bioperl-1.2.1/out2";
$factory->save_output($res, @outfile);
#An example of how to parse blast output reports in XML format in 
#SearchIO module of BioPerl library 
my $searchio = new Bio::SearchIO (-format => 'blastxml',
                                 -file   => @outfile[0]);
my  $result = $searchio->next_result;
   

SOAP::Lite bug

SOAPAction 头条目是 Web 服务指示要调用的方法的名称的线索。SOAP 规范除了规定 SOAPAction HTTP 头是一个 URI 之外,并没有指定它的格式,这样 SOAP::Lite 和 .NET 就有不同的默认格式。在默认情况下,SOAP::Lite 创建看起来像 [URI]#[method] 一样的 SOAPAction 头。基于 CGI 的 SOAP 期望看起来像 [URI]#[method] 一样的 SOAPAction 头;然而,.NET 需要 SOAPAction 头看起来像 [URI]/[method] 一样。我们用特定的 SOAP 操作的的属性 soapAction 来覆盖 on_action() 的缺省 SOAP::Lite 实现。





回页首


总结

文档样式的 Web 服务为更大的应用程序互操作性和性能创造了条件,不过,在使用这样的服务时,复杂性和存储要求会做一些牺牲。Apache AXIS 已经增加了对 Java 应用程序中的文档样式服务的支持。Microsoft 将文档样式用于 .NET 服务,而 OGSA 中的 Grid Services 的规范强制要求使用文档样式的服务。文档样式的 Web 服务在此是作为 Perl 语言的扩展而提供的,通过使用这些扩展并将 BioPer 扩展为使用文档样式的服务,这个项目为实现这些技术的互操作铺平了道路。

致谢

本文描述了 Extreme Blue 组于 2003 年夏天共同完成的工作,工作地点在 NC State University 的 Fungal Genomics Lab 和 North Carolina Biogrid。我们的小组建立了一个框架,可以用于把生物信息应用程序作为高吞吐量 Web 部署在 North Carolina BioGrid 上。内部组员包括:Mine Altunay( maltuna@unity.ncsu.edu)、Daniel Colonnese( dcolonn@ncsu.edu)、Chetna Warade( warade@us.ibm.com)、和 Lindsay Wilber( WilberL04@darden.virginia.edu)。小组还得到了 IBM Life Sciences 部的成员的指导,其中包括 Virinder Batra( batra@us.ibm.com)、Madhu Gombar( mgombar@us.ibm.com)、Rick Runyan( runyan@us.ibm.com)、Prasad Vadlamudi( prasadv@us.ibm.com)和 Doug Brown( debrown@unity.ncsu.edu)。



参考资料



作者简介

Chetna Warade:自从 1999 年以来,Chetna Warade 已经研究过从系统编程到生物信息等各种各样的项目。她在软件体系结构和开发、系统编程和各种新兴的技术(比如 Web 服务、生命科学和新一代 Internet 技术)方面有浓厚的兴趣和极好的天赋。您可以通过 warade@us.ibm.com与 Chetna 联系。


Virinder Batra:Virinder 是 IBM Healthcare & Life Sciences 组的高级工程师,他在 Web、数据库技术和网格计算、以及用于卫生保健和生命科学的信息技术等的交叉学科方面有浓厚的兴趣。他于 1989 年加入 IBM,在承担现在的工作之前,他在 Network Management 和 Websphere Application Server 部门领导过多种产品开发工作。他拥有几项软件专利,并撰写了多篇技术论文。Virinder 从北卡罗来纳教堂山大学(The University of North Carolina at Chapel Hill)获得了 MBA 学位,并从弗吉尼亚理工学院(Virginia Tech)获得了计算机科学理学硕士学位,他在印度获得了电子工程本科学位。您可以通过 batra@us.ibm.com与 Virinder 联系。


Rick Runyan:Rick 是 IBM Healthcare & Life Sciences 组的一名成员。您可以通过 runyan@us.ibm.com与 Rick 联系。




对本文的评价










回页首


IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款