はじめに
生命科学のコンピュータによる解析では、R言語が広く使われています。Bioconductorプロジェクトが、品質の高いパッケージ群を支えています。Bioconductorでは、基本的なデータ構造について共通のものを利用することで、一貫したシステムを作り上げています。たとえば、ゲノム範囲を扱うパッケージでGenomicRangesというものがあり、これがBioconductorで最も利用されるパッケージの一つになっています。しかし、他の言語でバイオインフォマティックスを行おうと考えている場合、こういった基盤となるパッケージやライブラリが存在しなくて苦労することがあります。
- Bioconductor Top75 - もっとも利用されているパッケージ75種類。
Bioconductorを構成するパッケージの中にはデータベースを扱うカテゴリーがあります。これらはAnnotationDataという分類になっています。
AnnotationDbi
R言語のことはあまりよくわかっていないので詳しく調査できていませんが、これらのデータベースを扱うパッケージはAnnotationDbiに依存しています。ここでは一例としてorg.Hs.eg.dbを他の言語(ここではRuby言語)から利用することを考えていきます。
org.Hs.eg.dbの中にはsqlite形式のファイルが梱包されている
まず、パッケージをBioconductorのページからダウンロードします。ページの一番最後にリンクがあります。
これらを展開します。すると、
.
├── DESCRIPTION
├── inst
│ └── extdata
│ └── org.Hs.eg.sqlite
├── man
│ ├── org.Hs.eg_dbconn.Rd
--中略---
├── NAMESPACE
├── R
│ └── zzz.R
└── tests
├── runalltests.R
└── unit
└── test.R
薄い階層のディレクトリに少数のファイルしかありません。(manはマニュアルですので一旦は無視して良いでしょう。)
ここで注目するべきは、inst/extdata/org.Hs.eg.sqlite
です。つまりsqlite形式のデータベースが、直接パッケージの中に組み込まれているのです。sqliteは軽量データベースであり、プログラミング言語には依存しません。そのため、このsqlite形式のデータベースをR以外の言語で呼び出すことによって、他の言語でもR言語の利便性を享受することができそうです。
注意が必要なのはライセンスです。プログラムのライセンスはArtistic-2.0となっています。Artistic-2.0というのはPerl界隈でよく使われるライセンスのようで、GPLに近いライセンスとのことです。しかし、これがデータベースにおいても適応されるものなのかはよくわかりませんでした。道義的には、Bioconductorのチームの方がコストをかけてメンテナンスしているものを、おいそれと他の言語のパッケージに組み込んで配布することははばかられる気がします。たとえば、PythonでBioconductorのsqlite形式のファイルを転用するパッケージがないか探してみましたが、Githubを適当なキーワードで検索した程度では見つかりませんでした。なので、現時点では、あくまで個人でR言語のパッケージを解凍して、その中のsqlite形式のファイルの利用するにとどめた方がよいかもしれません。
RubyからSqlite形式のファイルを呼び出す
さて、データベースを呼び出して、オブジェクトとして利用するのはRuby言語の得意分野であると言われています。Active Recoredが有名です。私は使い方をよく知らないのですが、設定をせずにすぐに利用するためにはActive Recordは規約に従ったsqlite形式のファイルを使う必要があったような気がしました。Rのsqlite形式のファイルは必ずしもRailsの規約に従っているわけではないと思うし、こういったデータベースの利用は主に読み込み専用で、自分でレコードを追加することはまずないと思うので、Active RecoredではなくSequelを利用します。Sequelは、Rubyのコミッターとしても高名なJeremy Evansさんの作成しているRuby向けのデータベースツールキットです。
次のようにしてSqlite形式のファイルを、読み込んで、検索することができます。
require 'sequal'
db = Sequel.sqlite('org.Hs.eg.sqlite')
db.class # Sequel::SQLite::Database
db.tables # テーブル一覧が表示される
db[:alias].first
# => {:_id=>1, :alias_symbol=>"A1B"}
db[:alias].take(10)
db[:alias].where(alias_symbol: "HBA1").all
# => [{:_id=>2473, :alias_symbol=>"HBA1"}]
db[:alias].join(:gene_info, _id: :_id).where(alias_symbol: "HBA1").first
# {:_id=>2473,
# :alias_symbol=>"HBA1",
# :gene_name=>"hemoglobin subunit alpha 1",
# :symbol=>"HBA1"}
db[:alias].join(:genes, _id: :_id).where(alias_symbol: "HBA1").all
# => [{:_id=>2473, :alias_symbol=>"HBA1", :gene_id=>"3039"}]
ご覧のように非常にシンプルな記法でやりたいことが実現できそうです。
遺伝子IDの変換
たとえば、遺伝子IDの変換のようなことはjoin
構文を使えば比較的簡単に行うことができます。
entrez_id = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
entrez_id.map do |id|
db[:genes].join(:ensembl, _id: :_id).where(gene_id: id).all
end
# =>
# [[{:_id=>1, :gene_id=>"1", :ensembl_id=>"ENSG00000121410"}],
# [{:_id=>2, :gene_id=>"2", :ensembl_id=>"ENSG00000175899"}],
# [{:_id=>3, :gene_id=>"3", :ensembl_id=>"ENSG00000256069"}],
# [],
# [],
# [],
# [],
# [],
# [{:_id=>4, :gene_id=>"9", :ensembl_id=>"ENSG00000171428"}],
# [{:_id=>5, :gene_id=>"10", :ensembl_id=>"ENSG00000156006"}]]
少々冗長(_id: :_id
のあたり)な気もしますが、Ruby言語に慣れた人にとっては許容できる範囲だと思います。(Sequelはバイオインフォ用のライブラリではなく、汎用のツールなので仕方がないと思います。)
しかし、上のようなことを必要になる都度行うのは面倒なので、配布用ではなく、自分用にGem化してみることにしました。
(その結果、sqliteを含むRubyのGEMの作成には非常に時間がかかることが判明しました。理由は調査できていません。)
Ruby以外の言語でもできるはず…
上記のようにRuby言語で、RのBioconductorのパッケージを利用しましたが、Sqlite形式のファイルはRuby言語ではなく他の言語でも利用できるはずです。なので、バイオインフォマティックス用のパッケージが発達していないマイナーな言語でバイオインフォマティックスをやろうとしている方がいましたら、参考になるはずです。ただし、ライセンスの問題には十分注意する必要があります。
この記事は以上です。