Hatena::Groupkdri

KazusaAPI開発日誌 このページをアンテナに追加 RSSフィード

2008-04-13DAS Registray

DAS REGISTRATION サーバのウェブサービスAPIを Ruby と BioRuby からつかってみる

|  DAS REGISTRATION サーバのウェブサービスAPIを Ruby と BioRuby からつかってみる - KazusaAPI開発日誌 を含むブックマーク はてなブックマーク -  DAS REGISTRATION サーバのウェブサービスAPIを Ruby と BioRuby からつかってみる - KazusaAPI開発日誌  DAS REGISTRATION サーバのウェブサービスAPIを Ruby と BioRuby からつかってみる - KazusaAPI開発日誌 のブックマークコメント

目次

DAS Registryは DAS データソースサーバ)の登録と発見のための登録サービスです。ウェブブラウザで人がサービス発見をするだけではなくて、クライアントアプリケーションからウェブサービス API を通してサービス発見をすることができます。

DAS Registry @ Wellcome Trust Sanger Instituteを参考にして、提供されている機能を眺めながら、Ruby から利用してみます。

screenshot


DAS Registryは、登録データへのアクセスのために二種類のウェブサービスを用意しています:

  1. http - XML ウェブサービスREST
  2. SOAP ウェブサービス

http - XML ウェブサービス(DAS スタイル

REST 的に URL を GET すると、XMLリソースが返ってくるウェブサービスです。登録データを一覧したり、条件でとりだすための4つのメソッドが用意されている:

  1. sources -- 登録データソースの一覧
  2. organism -- 登録生物種の一覧
  3. coordinatesystem -- 登録データソースの座標系の一覧
  4. lastModified -- 最終更新

これらのメソッドをつかうと、DAS Registry @ Wellcome Trust Sanger Institute のページと同等のページが作成できる。


sources

登録データソースの取得のためのメソッド。引数で問い合わせの条件付けができる。返り値はDTD無しのXMLで返ってくる。

$ curl http://www.dasregistry.org/das1/sources/ 
<SOURCES> 
  <SOURCE uri="DS_109" title="uniprot aristotle" doc_href="http://www.ebi.ac.uk/uniprot-das/" description="This datasource (aristotle) is a legacy  datasource that comprises the new  'uniprot', 'ipi' and 'uniparc'  datasources that are available from the  http://www.ebi.ac.uk/das-srv/uniprot/das  server.  Despite being a legacy dsn,  there are no plans to remove this DAS  datasource from service."> 
    <MAINTAINER email="pjones_AT_ebi.ac.uk" /> 
    <VERSION uri="DS_109" created="2005-03-21T16:26:03+0000"> 
      <COORDINATES uri="http://www.dasregistry.org/dasregistry/coordsys/CS_DS93" source="Protein Sequence" authority="UniParc" test_range="UPI00000017EA">UniParc,Protein Sequence</COORDINATES> 
      <COORDINATES uri="http://www.dasregistry.org/dasregistry/coordsys/CS_DS35" source="Protein Sequence" authority="IPI" test_range="IPI00000021">IPI,Protein Sequence</COORDINATES> 
      <COORDINATES uri="http://www.dasregistry.org/dasregistry/coordsys/CS_DS6" source="Protein Sequence" authority="UniProt" test_range="P00280">UniProt,Protein Sequence</COORDINATES> 
      <CAPABILITY type="das1:sequence" query_uri="http://www.ebi.ac.uk/das-srv/uniprot/das/aristotle/sequence" /> 
      <CAPABILITY type="das1:types" query_uri="http://www.ebi.ac.uk/das-srv/uniprot/das/aristotle/types" /> 
      <CAPABILITY type="das1:features" query_uri="http://www.ebi.ac.uk/das-srv/uniprot/das/aristotle/features" /> 
      <CAPABILITY type="das1:entry_points" query_uri="http://www.ebi.ac.uk/das-srv/uniprot/das/aristotle/entry_points" /> 
      <CAPABILITY type="das1:stylesheet" query_uri="http://www.ebi.ac.uk/das-srv/uniprot/das/aristotle/stylesheet" /> 
      <PROP name="label" value="Predicted" /> 
      <PROP name="label" value="Manually curated" /> 
      <PROP name="label" value="ENSEMBL" /> 
      <PROP name="leaseTime" value="2008-04-13T08:00:01+0000" /> 
      <PROP name="projectHome" value="http://www.biosapiens.info" /> 
      <PROP name="projectIcon" value="http://www.dasregistry.org/ProjectIcon?id=74" /> 
      <PROP name="projectDesc" value="BioSapiens is a Network of Excellence, funded by the European Union's 6th Framework Programme, and made up of bioinformatics researchers from 25 institutions based in 14 countries throughout Europe.



The objective of the BioSapiens is to provide a large" /> 
      <PROP name="projectName" value="BioSapiens" /> 
    </VERSION> 
  </SOURCE> 
[以下省略]

データソースを指定して取得。ここでは、データソース unique ID DS_109 を指定します。

$ curl http://www.dasregistry.org/das1/sources/DS_109

返り値は、http://www.dasregistry.org/showdetails.jsp?auto_id=DS_109の内容と同じ物が XML で返ります。

これを Ruby で扱ってみます。適当XPath で値を取り出します。

>> require 'open-uri'
=> true
>> require 'rexml/document'
=> true
>> url = "http://www.dasregistry.org/das1/sources/DS_109"
>> xml = REXML::Document.new(open(url).read)
>> coordinates = xml.get_elements('//COORDINATES')[0].text
=> "UniProt,Protein Sequence"
>> xml.get_elements('//COORDINATES')[0].attributes.key
=> ["uri", "test_range", "authority", "source"]
>> REXML::XPath.match(xml, '//COORDINATES')[0].attributes["uri"]
=> 'http://www.dasregistry.org/dasregistry/coordsys/CS_DS93'
>> REXML::XPath.match(xml, '//COORDINATES')[0].attributes["test_range"]
=> 'UPI00000017EA', 
>> REXML::XPath.match(xml, '//COORDINATES')[0].attributes["authority"]
=> 'UniParc'
>> REXML::XPath.match(xml, '//COORDINATES')[0].attributes["source"]
=> 'Protein Sequence'

sources メソッドは、オプション引数をとることができます。引数の種類は、DAS Registry @ Wellcome Trust Sanger Institute の検索の絞り込みでつかっているものと同等です。

これらのオプション引数に使える文字については、残りのメソッドで知ることができます。


organism

登録データソース生物種の一覧です。NCBI Taxonomy ID や一般名などが含まれます。

$ curl http://www.dasregistry.org/das1/organism
<?xml version='1.0' encoding='UTF-8' ?>
<ORGANISMS>
  <ORGANISM uri="http://www.ncbi.nlm.nih.gov/Taxonomy/Browser/wwwtax.cgi?id=9606" 
 scientificName="Homo sapiens" 
           name="homo sapiens" 
          taxid="9606" />
[以下省略]

Ruby で扱ってみます。

>> require 'open-uri'
>> require 'rexml/document'
>> url = "http://www.dasregistry.org/das1/organism"
>> xml = REXML::Document.new(open(url).read)
>> REXML::XPath.match(xml, "//ORGANISM").size
=> 41
>> REXML::XPath.match(xml, "//ORGANISM[@taxid='9606']").size
=> 1
>> REXML::XPath.match(xml, "//ORGANISM[@taxid='9606']").first.attributes['name']
=> "homo sapiens"

coordinatesystem

登録データソースの座標系の一覧です。

$ curl http://www.dasregistry.org/das1/coordinatesystem
<?xml version='1.0' encoding='UTF-8' ?>
<DASCOORDINATESYSTEM>
  <COORDINATES uri="http://www.dasregistry.org/dasregistry/coordsys/CS_DS62" 
             taxid="9785" 
            source="Chromosome" 
         authority="BROADE" 
        test_range="" 
           version="1">BROADE_1,Chromosome,Loxodonta africana</COORDINATES>
[以下省略]

この uri 属性値のリンク先(http://www.dasregistry.org/coordsys/CS_DS62リダイレクトされている)は、上記の内容を人がブラウザで見るような形で提供している XHTML 書類です。また、この uriユニークuri になっています。

Ruby であつかってみる。

>> require 'open-uri'
>> require 'rexml/document'
>> url = "http://www.dasregistry.org/das1/coordinatesystem"
>> xml = REXML::Document.new(open(url).read)
>> coords = xml.get_elements("//COORDINATES")
...
>> coords.size
=> 100
>> coords.find_all {|x| x.attibutes['taxid'] == '9609' }.size
=> 12
>> REXML::XPath.match(xml, "//CORDINATES[@taxid='9606']").size
=> 12

lastModified

登録データの最終更新時間を取得することができます。HTTP ヘッダで取得できます。

$ curl -I http://www.dasregistry.org/das1/lastModified
HTTP/1.1 200 OK
Date: Sun, 13 Apr 2008 11:00:52 GMT
Server: Resin/3.0.24
ETag: "AAAARk+SVM4"
Last-Modified: Fri, 11 Apr 2008 16:20:03 GMT
Content-Encoding: ISO-8859-1
Content-Type: text/xml

HTTP ヘッダだけでなく、XML 文章としても取得できるようです。

$ curl http://www.dasregistry.org/das1/lastModified
<?xml version='1.0' encoding='UTF-8' ?>
<LASTMODIFIED time="2008-04-11T16:20:03+0000" />

Ruby であつかってみる。

>> require 'open-uri'
=> true
>> require 'rexml/document'
=> true
>> url = "http://www.dasregistry.org/das1/lastModified"
>> xml = REXML::Document.new(open(url).read)
>> Time.parse(xml.get_elements("//LASTMODIFIED")[0].attributes['time'])
=> Sat Apr 12 01:20:03 +0900 2008


SOAP ウェブサービス

DAS Registry は SOAP によるウェブサービスも提供している。


WSDL

BioJava と Perl SOAP::Liteによる利用サンプルプログラムDAS Registry @ Wellcome Trust Sanger Instituteにある。


メソッド一覧

SOPA ウェブサービスRuby で利用してみる。

require 'soap/wsdlDriver'

wsdl = 'http://www.dasregistry.org/services/das:das_directory?wsdl'
serv = SOAP::WSDLDriverFactory.new(wsdl).create_driver
serv.generate_explicit_type = true

p serv.methods(false)

つぎのように、メソッド名のArrayが返ってくる。

["getDasSource", "getOrganismsByName", "requestKey", "getAllCoordinateSystems", 
 "registerService", "getCoordSysByType", "getCoordSysTypes", "listServices", 
 "findService", "getAllLabels", "validate", "renewLease", "getAllCapabilities", 
 "keywordSearch", "removeService", "getValidationMessage"]

listServices

登録サービスリストを返す listServices メソッドを実行してみる。

result = serv.listServices

エラーが返ってきた。

SOAP::EncodingStyle::Handler::EncodingStyleError: unknown type '{http://schemas.xmlsoap.org/soap/encoding/}string'
        from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/soap/encodingstyle/soapHandler.rb:371:in `decode_definedtype'
        from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/soap/encodingstyle/soapHandler.rb:366:in `decode_tag_by_wsdl'
        from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/soap/encodingstyle/soapHandler.rb:156:in `decode_tag'
        from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/soap/parser.rb:179:in `decode_tag'
        from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/soap/parser.rb:130:in `start_element'
        from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/xsd/xmlparser/parser.rb:67:in `start_element'
        from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/xsd/xmlparser/rexmlparser.rb:34:in `tag_start'
        from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/rexml/parsers/streamparser.rb:24:in `parse'
        from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/rexml/document.rb:199:in `parse_stream'
        from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/xsd/xmlparser/rexmlparser.rb:27:in `do_parse'
        from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/soap/parser.rb:92:in `parse'
        from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/soap/processor.rb:39:in `unmarshal'
        from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/soap/rpc/proxy.rb:236:in `unmarshal'
        from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/soap/rpc/proxy.rb:175:in `route'
        from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/soap/wsdlDriver.rb:339:in `rpc_call'
        from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/soap/wsdlDriver.rb:543:in `listServices'

型の問題のようである。


BioRuby で対応するとしたらこうしてみたい

以上をふまえて、Class の設計を考えてみたい。たとえば、つぎのようなコードでつかえるとよい。

require 'bio'
reg = Bio::DAS::Registry.new
sources = reg.sources(:organism => '9606', 
                      :capability => 'features', 
                      :type => 'Chromosome')
sources.each do |source|
  source.uri
  source.doc_href
  source.description
  source.maintainer.email
  source.version.uri
  source.version.created
  source.coordinates[0]
  source.coordinates[0].uri
  source.coordinates[0].source
  source.coordinates[0].authority
  source.coordinates[0].test_range
  source.capability[0].type
  source.capability[0].query_uri
  source.prop[0].name
  source.prop[0].value
  source.prop['label']
  source.features(:segment => 'Chr1:1,1000')
end


まとめ

  1. DAS Registry は二つのウェブサービスを提供している。
  2. クライアントデータソース発見に通常使うのは sources メソッドである。
  3. SOAP サービスRuby の soap4r では使えなかった。
  4. REST 的なウェブサービスポータブル
  5. Bio::DAS::Registry はまだない。
トラックバック - http://kdri.g.hatena.ne.jp/nakao_mitsuteru/20080413