TogoGenomeRDFDownload

提供:TogoWiki

移動: 案内, 検索

目次

RefSeq の RDF データの生物系統ダウンロード

要望:RefSeq をコンバートしたデータから Cyanobacteria (1117) だけのサブセットをとりたい

http://togogenome.org/rdf/togogenome/refseq/release67/prokaryotes.ttl/

指定された taxid の subClassOf を SPARQL 検索し、該当 taxid のファイルがあれば cat して返すような CGI を作れば良さそう

  • Nginx は CGI をサポートしていないみたいなので fcgi にするかアプリを作るしかない
  • Rack/Sinatra + Unicorn でサーバをたてることに
% gem install sinatra
% gem install unicorn

Sinatra アプリの開発

  get '/download/refseq/:taxid' do
    parent = params[:taxid].to_i
    result = ""
    turtle = ""
    sparql = SPARQL_TEMP.sub('@@TAXID@@', parent.to_s)
    SPARQL_SERV.query(sparql, :format => 'json') { |x|
      result << x
    }
    flag = true
    data = ""
    json = JSON.parse(result)
    json["results"]["bindings"].each do |x|
      taxid = x["taxid"]["value"][/\d+$/]
      Dir.glob("#{REFSEQ_PATH}/#{taxid}/**/*.ttl").each do |file|
        File.open(file).each do |line|
          if line[/^@/]
            data += line if flag
          else
            data += line
          end
        end
        flag = false
      end
    end
    data
  end

Sinatra::Streaming

デフォルトではデータはすべてバッファリングされるので巨大データのダウンロードには Sinatra Streaming を使う必要がある。

% gem install sinatra-contrib

基本的には stream { |out| out << data } でよいみたい。rackup では使えないようなので Unicorn で起動する。

require 'rubygems'
require 'sinatra'
require 'sinatra/base'
require 'sinatra/streaming'  # gem install sinatra-contrib
require 'rack'
require 'json'
load 'sparql.rb'

class Download < Sinatra::Base

  SPARQL_HOST = "http://togogenome.org/sparql"
  SPARQL_SERV = SPARQL.new(SPARQL_HOST)
  # GRAPH <http://togogenome.org/graph/taxonomy> {
  SPARQL_TEMP = <<-SPARQL
    SELECT *
    WHERE {
      GRAPH <http://togogenome.org/graph/taxonomy/> {
        ?taxid rdfs:subClassOf* <http://identifiers.org/taxonomy/@@TAXID@@> .
      }
    }
  SPARQL

  REFSEQ_PATH = "/data/store/rdf/togogenome/refseq/current/prokaryotes.ttl"

  get '/download/refseq/:taxid' do
    parent = params[:taxid][/\d+$/].to_i
    result = ""
    turtle = ""
    sparql = SPARQL_TEMP.sub('@@TAXID@@', parent.to_s)
    SPARQL_SERV.query(sparql, :format => 'json') { |x|
      result << x
    }
    stream do |out|
      flag = true
      json = JSON.parse(result)
      json["results"]["bindings"].each do |x|
        taxid = x["taxid"]["value"][/\d+$/]
        Dir.glob("#{REFSEQ_PATH}/#{taxid}/**/*.ttl").each do |file|
          if flag
            out << `cat #{file}`
            flag = false
          else
            out << `grep -v '^@' #{file}`
          end
          out.flush
        end
      end
    end
  end
end

run Download

Unicorn の設定ファイル

unicorn.conf の設定例

worker_processes 2
#listen '/data/store/download/tmp/unicorn.sock'
listen 20999
stderr_path File.expand_path('log/unicorn.err', File.dirname(__FILE__))
stdout_path File.expand_path('log/unicorn.log', File.dirname(__FILE__))
preload_app true

デーモンとして起動する(終了は kill)

% unicorn -d unicorn.con -D

Nginx の設定

Unicorn なので UNIX ソケットを使う方法もあるが、ここでは↑でポート指定した HTTP にアクセスする。

    location /download {
        proxy_pass http://localhost:20999;
    }

完成 → http://togogenome.org/download/refseq/1117

個人用ツール