Hatena::Grouplifesciencedb

ゲノム周辺 このページをアンテナに追加 RSSフィード

2009-11-18

第10章 Tying It All Together の写経

|  第10章 Tying It All Together の写経 - ゲノム周辺 を含むブックマーク はてなブックマーク -  第10章 Tying It All Together の写経 - ゲノム周辺  第10章 Tying It All Together の写経 - ゲノム周辺 のブックマークコメント

http://lifesciencedb.g.hatena.ne.jp/nakao_mitsuteru/20091013/progsemweb の第4回目の後半の資料です。

アプリケーションを構築するステップ:

  1. Sesame に初期データをロードする
  2. ウェブアプリケーションサーバを設定する
  3. オブジェクトを表示するためのHTMLテンプレートを作成する
  4. 公共データからデータセットを拡張する
  5. ほかのセマンティックアプリケーション向けにデータを再出版する
  6. 多数のデータセットを横断してクエリする
  7. Exhibit をつかって可視化する

本のコードとサンプルコードが大分違うので気をつけたい。

おもむろにSesameをうごかすtomcatを起動しておく。

nakao@ortho:/Library/WebServer/tomcat
$ ./bin/startup.sh
Using CATALINA_BASE:   /Library/WebServer/tomcat
Using CATALINA_HOME:   /Library/WebServer/tomcat
Using CATALINA_TMPDIR: /Library/WebServer/tomcat/temp
Using JRE_HOME:       /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home

仕事リストデータ

http://semprog.com/psw/chapter10/joblist.csv

RDFへ変換する

ジョブスキーマhttp://www.medev.ac.uk/interoperability/rss/1.0/modules/jobs/

http://semprog.com/psw/chapter10/convert_jobs.py

依存パッケージ simplejson をインストールしておく。

sudo easy_install simplejson

変換してみる

$ python convert_jobs.py
<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF
   xmlns:company="http://purl.org/rss/1.0/modules/company/"
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:jobboard="http://semprog.com/schemas/jobboard#"
   xmlns:jobs="http://www.medev.ac.uk/interoperability/rss/1.0/modules/jobs/rss1.0jobsmodule#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
>
  <rdf:Description rdf:nodeID="dlFohHIo4">
(後略)

出力をファイルに保存

$ python convert_jobs.py > job_listings.rdf

Sesame にデータをロードする

pysesame.py による Sesame サーバの動作確認

http://localhost:8080/openrdf-workbench/repositories/Movies/export にデータをインポートするテスト。

python pysesame.py

http://localhost:8080/openrdf-workbench/repositories/Movies/export に多数トリプルがあればテスト成功。

変換した RDFSesame に直接インポートするコードがコメントアウトされていたので、環境に合わせてみて、解除してみた。

56: c = pysesame.connection('http://localhost:8080/openrdf-sesame/')
57: c.use_repository('joblistings')
58: print c.postdata(data)
python convert_jobs.py    
(中略)
<addinfourl at 4314047984 whose fp = <socket._fileobject object at 0x101211aa0>>

データがはいっていなかったので、http://localhost:8080/openrdf-workbench/ で joblistings レポジトリを新規追加して再度実行するも、動作せず。

Chapter 8. HTTP communication protocol for Sesame 2.0 をみつつ動く状態を Ruby で確認した。 

server = 'localhost'
port = 8080
path = "/openrdf-sesame/repositories/joblistings/statements"
rdf = File.open("job_listings.rdf").read
require 'net/http'
Net::HTTP.start(server, port) {|http|
  response = http.post(path, rdf, "content-type" => 'application/rdf+xml')
  p response.body
}

動作条件は次の二つ。

これを踏まえて pysesame.py の postdata メソッドを変更。

(略)
from urllib2 import urlopen,Request
(略)
    def postdata(self,data):
        host = self.baseurl+'/repositories/'+self.repository+'/statements'
        req = Request(host, data, {'content-type': 'application/rdf+xml'})
        res = urlopen(req)
        return res
(略)

ウェブサイトサーブする

CherryPy
easy_install charrypy
(中略)
Installed /Library/Python/2.6/site-packages/CherryPy-3.1.2-py2.6.egg
Processing dependencies for cherrypy
Finished processing dependencies for cherrypy
Mako ページテンプレート
easy_install mako

一般的なビューア

ウェブアプリの起動

pytohn job_site.py

ポート番号を変更する。Page not found · GitHub Pages を参照。

cherrypy.config.update({'server.socket_port': 8081}) 
cherrypy.quickstart(Main())

http://localhost:8081/アクセスして確認。

しかし、クリックすると pyton が Bus error で落ちた。

http://img.skitch.com/20091118-kbk74d1p3i3qs5mnm7egxegban.jpg


Sesame からデータを得る

参照サイト

データのとれるリクエスト例

$ curl -H 'Accept:application/sparql-results+json' "http://localhost:8080/openrdf-sesame/repositories/joblistings?query=SELECT+%3Fpred+%3Fobj+where+%7B%3Chttp%3A%2F%2Fsemprog.com%2Fschemas%2Fjobboard%23tumblr%3E+%3Fpred+%3Fobj+.%7D" 
{
	"head": {
		"vars": [ "pred", "obj" ]
	}, 
	"results": {
		"bindings": [
			{
				"pred": { "type": "uri", "value": "http:\/\/www.w3.org\/2000\/01\/rdf-schema#seeAlso" }, 
				"obj": { "type": "literal", "value": "http:\/\/api.crunchbase.com\/v\/1\/company\/tumblr.js" }
			}, 
			{
				"pred": { "type": "uri", "value": "http:\/\/purl.org\/rss\/1.0\/modules\/company\/name" }, 
				"obj": { "type": "literal", "value": "Tumblr" }
			}, 
			{
				"pred": { "type": "uri", "value": "http:\/\/www.w3.org\/1999\/02\/22-rdf-syntax-ns#type" }, 
				"obj": { "type": "uri", "value": "http:\/\/www.medev.ac.uk\/interoperability\/rss\/1.0\/modules\/jobs\/rss1.0jobsmodule#Organization" }
			}
		]
	}
}
  1. json で取り出したい。
  2. Accept が無いとレスポンスが application/x-binary-rdf-results-table というバイナリ形式になっている。
  3. リクエストヘッダーに Accept:application/sparql-results+json

これを踏まえて pysesame.py の __getsparql__ メソッドを変更。

(略)
    def __getsparql__(self, method):
        url = self.baseurl+method
        req = Request(url, None, {'accept': 'application/sparql-results+json'})
        data = urlopen(req).read()
(略)

実働コード query_jobs.py

from rdflib import Namespace, BNode, Literal, RDF, URIRef
from pysesame import connection
from urllib import quote_plus

con=connection('http://localhost:8080/openrdf-sesame/')
con.use_repository('joblistings')
print con
DC = Namespace("http://purl.org/dc/elements/1.1/")
JB = Namespace("http://semprog.com/schemas/jobboard#")
COMPANY = Namespace("http://purl.org/rss/1.0/modules/company/")
namefields=set([str(DC['title']),str(COMPANY['name'])])

id = 'http://semprog.com/schemas/jobboard#tumblr'
print id

sa = con.query('select ?pred ?obj where {<%s> ?pred  ?obj .}' % id)
oa = con.query('select ?pred ?sub where {?sub ?pred  <%s> .}' % id)

print sa
print oa

このコードは動くのに、jobs_site.py は落ちる。とりあえずすすむ。


一般的なテンプレート

カンパニーデータを得る

Chunchbase

スタートアップ企業のデータベース

改変して使用した

# Connecion to Sesame
(略)
endpoint='http://localhost:8080/openrdf-sesame/'
con=connection(endpoint)
(略)
c=connection(endpoint)
(略)
Yahoo! Finance

大企業の情報のソース。

Freebase 接続と調和する


特化したビュー

他者へ出版する

RFDa
RDF/XML

データを拡張する

位置
地理、経済、人口

洗練されたクエリ

ジョブデータを可視化する

将来の拡張

第10章のまとめ

  1. 実際にありそうな状況のアプリケーションの開発を実習である。
  2. データを徐々に拡張しつつアプリの開発をすすめている。この開発スタイルがRDFをつかったアプリの特徴かもしれない。
  3. Java プログラミングに慣れていないのでつらい。
トラックバック - http://lifesciencedb.g.hatena.ne.jp/nakao_mitsuteru/20091118