2010-01-30
TogoWS REST API JSON 形式の利用例
TogoWS REST API は JSON 形式の出力形式に対応しています。これを利用するとかんたんにウェブページにデータを追加表示できます。この利用例では、HTML書類にレンダリング時にAjaxで取得したPubMedアブストラクトのデータを表示します。
REST API の JSON 形式
PubMed アブストラクトのタイトルの取得 URI は次のようになります。ti フィールドがタイトルです。
その返り値
["From genomics to chemical genomics: new developments in KEGG."]
この返り値JSONをJavaScriptで値としてつかうには eval を使用します。TogoWS REST API の JSON 形式を利用する際に配列の一個目の要素を取り出す必要があります。
var data = eval(ti_in_json)[0]
図はイメージ
次のようなウェブページを、TogoWS からデータ取得し作成できます。JavaScript による Ajax でデータは JSON 形式としてクロスドメインに取得されて、そのまま DOM 操作で表示しています。表示しているデータは、タイトル(ti)、著者(au)、書誌情報(so)、アブストラクト(ab)、MeSHターム(mh)です。
HTML ソース
Ajax に prototype.js をつかいます。
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"> <html><head> <title></title> <script src="http://genome.kazusa.or.jp/javascripts/prototype.js" type="text/javascript"></script> </head> <body> <div id='ti'></div> <div id='au'></div> <div id='so'></div> <hr/> <div id='ab'></div> <hr/> <div id='mh'></div> <hr/> <script type="text/javascript"> var ti = function(transport) { if (transport.responseText !== undefined) { $('ti').innerHTML = "<h1>" + eval(transport.responseText)[0] + '</h1>' } } var so = function(transport) { if (transport.responseText !== undefined) { $('so').innerHTML = eval(transport.responseText)[0] } } var au = function(transport) { if (transport.responseText !== undefined) { $('au').innerHTML = eval(transport.responseText)[0].replace(/\n/g, ', ') } } var ab = function(transport) { if (transport.responseText !== undefined) { $('ab').innerHTML = eval(transport.responseText)[0]; } } var mh = function(transport) { if (transport.responseText !== undefined) { var data = eval(transport.responseText)[0] data.each(function(e, i) { $('mh').innerHTML = $('mh').innerHTML + '<li>' + e + '</li>' }) } } function failure(transport) { alert(transport.responseText); } new Ajax.Request("http://togows.dbcls.jp/entry/ncbi-pubmed/16381885/ti.json", { onSuccess: ti, onFailure: failure}) new Ajax.Request("http://togows.dbcls.jp/entry/ncbi-pubmed/16381885/so.json", { onSuccess: so, onFailure: failure}) new Ajax.Request("http://togows.dbcls.jp/entry/ncbi-pubmed/16381885/ab.json", { onSuccess: ab, onFailure: failure}) new Ajax.Request("http://togows.dbcls.jp/entry/ncbi-pubmed/16381885/au.json", { onSuccess: au, onFailure: failure}) new Ajax.Request("http://togows.dbcls.jp/entry/ncbi-pubmed/16381885/mh.json", { onSuccess: mh, onFailure: failure}) </script> </body> </html>
まとめ
2010-01-06
インストールした 4store の動作確認をした。
SPARQLのつかえるスケーラブルRDFストア 4store をSnow LeopardのMacにインストールしてみた。 - ゲノム周辺 - lifesciencedbグループ でインストールした 4store の動作確認をなぞった。
はじめに http://4store.org/trac/wiki/GettingStarted でざっと全体の動作をみておく。4s-backend-setup、4s-backend、4s-httpd などコマンド名にオプション込なかんじ。http://4store.org/trac/wiki/Documentation の Usage の各項目をなぞる。
/Application/4store.app を起動すると、適切に環境設定された Terminal.app のウィンドウが一つでてくる。4store コマンド群は /Applications/4store.app/Contents/MacOS/bin/4s-backend にある。
コマンド群は 4s-からはじまっている
$ ls /Applications/4store.app/Contents/MacOS/bin/ 4s-backend* 4s-cluster-create* 4s-httpd* 4s-backend-copy* 4s-cluster-destroy* 4s-import* 4s-backend-destroy* 4s-cluster-file-backup* 4s-info* 4s-backend-info* 4s-cluster-info* 4s-query* 4s-backend-passwd* 4s-cluster-replication-disable* 4s-resolve* 4s-backend-setup* 4s-cluster-start* 4s-restore* 4s-bind* 4s-cluster-stop* 4s-reverse-bind* 4s-cluster-cache* 4s-delete-model* 4s-size* 4s-cluster-copy* 4s-dump* 4s-update*
データベースのセットアップは 4s-backend-setup
データベース名(Knowledge Base名; KB名)demo として作成。
$ 4s-backend-setup demo 4store[39388]: backend-setup.c:176 erased files for KB demo 4store[39388]: backend-setup.c:301 created RDF metadata for KB demo
データベースの実体は /var/lib/4store/demo に作成される。
$ ls /var/lib/4store/demo 0000/ 0001/ metadata.nt
クラスタの設定はこんなかんじ。
$ 4s-backend-setup --node 0 --cluster 1 --segments 4 demo 4store[39394]: backend-setup.c:176 erased files for KB demo 4store[39394]: backend-setup.c:301 created RDF metadata for KB demo
node 引数と cluster 引数、segments 引数は後ほどしらべる。
起動は 4s-backend
4s-backend demo
デーモンとして起動する。
データインポートは 4s-import
- http://4store.org/trac/wiki/ImportDataデータはRDFファイル単位。
ソース配布物のdataの中から一つインポートしてみる。
$ 4s-import -v demo data/tiger/tiger_features.rdf removing old data Reading <file:///Users/nakao/Applications/4store/4store/data/tiger/tiger_features.rdf>; Pass 1, processed 748 triples (748) Pass 2, processed 748 triples, 90250 triples/s Updating index Index update took 1.469478 seconds Imported 748 triples, average 505 triples/s
コマンドラインクエリインターフェイスは 4s-query
対話的に起動。
$ 4s-query demo4store> SELECT * WHERE {?s ?p ?o}
#EOQ
?s ?p ?o
<http://www.census.gov/tiger/2002/CFCC/D85>; <http://www.w3.org/2000/01/rdf-schema#subClassOf>; <http://www.census.gov/tiger/2002/CFCC/D8>;
<http://www.census.gov/tiger/2002/CFCC/F40>; <http://www.w3.org/2000/01/rdf-schema#subClassOf>; <http://www.census.gov/tiger/2002/CFCC/F4>;
<http://www.census.gov/tiger/2002/CFCC/E0>; <http://www.w3.org/2000/01/rdf-schema#subClassOf>; <http://www.census.gov/tiger/2002/CFCC/E>;
実行区切り文字列は #EOQ\n
$ 4s-query demo 'SELECT * WHERE { ?s ?p ?o } LIMIT 1'
<?xml version="1.0"?>
<sparql xmlns="http://www.w3.org/2005/sparql-results#">;
<head>
<variable name="s"/>
<variable name="p"/>
<variable name="o"/>
</head>
<results>
<result>
<binding name="s"><uri>http://www.census.gov/tiger/2002/CFCC/D85</uri></binding>;
<binding name="p"><uri>http://www.w3.org/2000/01/rdf-schema#subClassOf</uri></binding>;
<binding name="o"><uri>http://www.census.gov/tiger/2002/CFCC/D8</uri></binding>;
</result>
</results>
</sparql>
選べる出力形式。
JSON形式
$ 4s-query -f json demo 'SELECT * WHERE { ?s ?p ?o } LIMIT 1'
{"head":{"vars":["s","p","o"]},
"results": {
"bindings":[
{"s":{"type":"uri","value":"http://www.census.gov/tiger/2002/CFCC/D85";},
"p":{"type":"uri","value":"http://www.w3.org/2000/01/rdf-schema#subClassOf";},
"o":{"type":"uri","value":"http://www.census.gov/tiger/2002/CFCC/D8";}}
]
}}
SPARQL-RESULTS 形式
$ 4s-query -f sparql demo 'SELECT * WHERE { ?s ?p ?o } LIMIT 1'
<?xml version="1.0"?>
<sparql xmlns="http://www.w3.org/2005/sparql-results#">;
<head>
<variable name="s"/>
<variable name="p"/>
<variable name="o"/>
</head>
<results>
<result>
<binding name="s"><uri>http://www.census.gov/tiger/2002/CFCC/D85</uri></binding>;
<binding name="p"><uri>http://www.w3.org/2000/01/rdf-schema#subClassOf</uri></binding>;
<binding name="o"><uri>http://www.census.gov/tiger/2002/CFCC/D8</uri></binding>;
</result>
</results>
</sparql>
テキスト形式。
$ 4s-query -f text demo 'SELECT * WHERE { ?s ?p ?o } LIMIT 1'
?s ?p ?o
<http://www.census.gov/tiger/2002/CFCC/D85>; <http://www.w3.org/2000/01/rdf-schema#subClassOf>; <http://www.census.gov/tiger/2002/CFCC/D8>;
テストケース(Turtle)形式。
$ 4s-query -f testcase demo 'SELECT * WHERE { ?s ?p ?o } LIMIT 1'
@prefix rs: <http://www.w3.org/2001/sw/DataAccess/tests/result-set#>; .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>; .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#>; .
[] rdf:type rs:ResultSet ;
rs:resultVariable "s", "p", "o" ;
rs:solution [
rs:binding [ rs:variable "s" ;
rs:value <http://www.census.gov/tiger/2002/CFCC/D85> ] ;
rs:binding [ rs:variable "p" ;
rs:value <http://www.w3.org/2000/01/rdf-schema#subClassOf> ] ;
rs:binding [ rs:variable "o" ;
rs:value <http://www.census.gov/tiger/2002/CFCC/D8> ]
] .
SPARQL HTTPインターフェイスは 4s-httpd
8000ポートで起動
$ 4s-httpd -p 8000 demo
SPARQLエンドポイントは http://localhost:8000/sparql/ になる。
http://localhost:8000 にウェブブラウザでアクセス。
ステータスページ。
バックエンドサイズ情報。
テストクエリ。
クエリ結果
RESTful インターフェイス
PUT
$ curl -T file.rdf http://localhost:8000/sparql/file.rdf
DELETE
$ curl -X DELETE http://localhost:8000/sparql/file.rdf
注意する点として、グラフ単位(ファイル単位)でしか追加/削除できない。http://4store.org/trac/wiki/TODO
クライアントからの接続
php、phtyon、ruby、Javaクライアントがある。Perlさん。。。
$ gem build 4store-ruby.gemspec WARNING: no rubyforge_project specified Successfully built RubyGem Name: 4store-ruby Version: 0.0.3 File: 4store-ruby-0.0.3.gem $ sudo gem install 4store-ruby-0.0.3.gem
使ってみる。
>> require 'rubygems' => true >> gem '4store-ruby' => true >> FourStore => FourStore >> FourStore::Store => FourStore::Store >> FourStore::Store.new("http://localhost:8000/sparql/";) => #<FourStore::Store:0x10176a000 @endpoint=#<URI::HTTP:0x101769c90 URL:http://localhost:8000/sparql/>>; >> ep = FourStore::Store.new("http://localhost:8000/sparql/";) => #<FourStore::Store:0x101763890 @endpoint=#<URI::HTTP:0x101763548 URL:http://localhost:8000/sparql/>>; >> res = ep.select("SELECT * WHERE { ?s ?p ?o } LIMIT 10"); ?> " " => "\n" >> require 'pp' => true >> pp res [{"o"=>"http://www.census.gov/tiger/2002/CFCC/D8";, "p"=>"http://www.w3.org/2000/01/rdf-schema#subClassOf";, "s"=>"http://www.census.gov/tiger/2002/CFCC/D85";}, {"o"=>"http://www.census.gov/tiger/2002/CFCC/F4";, "p"=>"http://www.w3.org/2000/01/rdf-schema#subClassOf";, "s"=>"http://www.census.gov/tiger/2002/CFCC/F40";}, {"o"=>"http://www.census.gov/tiger/2002/CFCC/E";, "p"=>"http://www.w3.org/2000/01/rdf-schema#subClassOf";, "s"=>"http://www.census.gov/tiger/2002/CFCC/E0";}, {"o"=>"http://www.census.gov/tiger/2002/CFCC/B";, "p"=>"http://www.w3.org/2000/01/rdf-schema#subClassOf";, "s"=>"http://www.census.gov/tiger/2002/CFCC/B4";}, {"o"=>"http://www.census.gov/tiger/2002/CFCC/D2";, "p"=>"http://www.w3.org/2000/01/rdf-schema#subClassOf";, "s"=>"http://www.census.gov/tiger/2002/CFCC/D27";}, {"o"=>"http://www.census.gov/tiger/2002/CFCC/A";, "p"=>"http://www.w3.org/2000/01/rdf-schema#subClassOf";, "s"=>"http://www.census.gov/tiger/2002/CFCC/A5";}, {"o"=>"http://www.census.gov/tiger/2002/CFCC/A2";, "p"=>"http://www.w3.org/2000/01/rdf-schema#subClassOf";, "s"=>"http://www.census.gov/tiger/2002/CFCC/A21";}, {"o"=>"http://www.census.gov/tiger/2002/CFCC/H7";, "p"=>"http://www.w3.org/2000/01/rdf-schema#subClassOf";, "s"=>"http://www.census.gov/tiger/2002/CFCC/H70";}, {"o"=>"http://www.census.gov/tiger/2002/CFCC/B5";, "p"=>"http://www.w3.org/2000/01/rdf-schema#subClassOf";, "s"=>"http://www.census.gov/tiger/2002/CFCC/B52";}, {"o"=>"http://www.census.gov/tiger/2002/CFCC/D4";, "p"=>"http://www.w3.org/2000/01/rdf-schema#subClassOf";, "s"=>"http://www.census.gov/tiger/2002/CFCC/D43";}] => nil
メソッド一覧。
>> FourStore::Store.instance_methods - Object.methods => ["delete", "add", "set", "select", "load"]
ドキュメントが無いので、ソース読め、とのこと。
rubyクライアントはREXMLをつかっているのが気になるところ。大規模用途に備えて nokogiri で高速化出来るかな?
まとめ
2010-01-054store
SPARQLのつかえるスケーラブルRDFストア 4store をSnow LeopardのMacにインストールしてみた。
4store とは、RDFのクエリエンジンとデータベースストレージ。高パフォーマンス、スケール性、安定性が強みとのこと。ライセンスはGPLv3、ANSI C99でコードされているので、多くのUNIXライクプラットフォームで実行可能。Linux用につくられているがMac OS Xでもうごく。クラスタリングによって、インポート速度は秒速120kトリプル を達成し、比較的単純なクエリはミリセカンドで応答する。これはHTTP経由SPARQLプロトコルでも達成できる。セキュリティにも十分配慮がなされている。
スケール性について。たとえば、8GBメモリのマシン9台でクラスタリングすると15ギガトリプルを扱うことができる。ハッシュ値の衝突からの上限はおよそ50-70ギガトリプルと見積もられている。
これを Mac OS X 10.6 の MacPro にインストールしてみたい。
バイナリ配布はエラーになった。
インストールして実行してみる。
nmp:~ nakao$ 4s-backend-setup test dyld: Library not loaded: /usr/lib/libxml2.2.dylib Referenced from: /usr/lib/libxslt.1.dylib Reason: Incompatible library version: libxslt.1.dylib requires version 10.0.0 or later, but libxml2.2.dylib provides version 9.0.0 Trace/BPT trap
ライブラリのバージョンがあっていない。配布物は10.4当時を想定しているようだった。
ソースからビルドすることにした。
git clone git://github.com/garlik/4store.git cd 4store ./configure
いろいろ依存パッケージやライブラリがはいっていなかった。
依存パッケージなどは次の通り。
- pkg-config
- raptor
- Raptor is an open source C library that provides a set of parsers and serializers that generate Resource Description Framework (RDF) triples by parsing syntaxes or serializing the triples into a syntax. (RDFシリアル化やパースのためのCライブラリ)
- http://librdf.org/raptor/
- rasqal
- Rasqal is an open source C library that handles Resource Description Framework (RDF) query syntaxes, query construction and query execution returning result bindings. The supported query languages are SPARQL and RDQL.(SPARQLに対応したRDFクエリのCライブラリ)
- http://librdf.org/rasqal/
- glib2
- lib is a library which includes support routines for C, such as lists, trees, hashes, memory allocation, and many other things.
- http://www.gtk.org/
- libxml2
- Libxml is the XML C library developed for the Gnome project. XML itself is a metalanguage to design markup languages. Though the library is written in C, a variety of language bindings make it available in other environments.
- http://xmlsoft.org/
- pcre
- The PCRE library is a set of functions that implement regular expression pattern matching using the same syntax and semantics as Perl 5. PCRE has its own native API, as well as a set of wrapper functions that correspond to the POSIX regular expression API.
- http://www.pcre.org/
- ncurses
- The Ncurses (new curses) library is a free software emulation of curses in System V Release 4.0, and more. It uses Terminfo format, supports pads and color and multiple highlights and forms characters and function-key mapping, and has all the other SYSV-curses enhancements over BSD Curses.
- http://www.gnu.org/software/ncurses/ncurses.html
- readline
- The GNU Readline library provides a set of functions for use by applications that allow users to edit command lines as they are typed in. Both Emacs and vi editing modes are available. The Readline library includes additional functions to maintain a list of previously-entered command lines, to recall and perhaps reedit those lines, and perform csh-like history expansion on previous commands.
- http://cnswww.cns.cwru.edu/~chet/readline/rltop.html
- zlib
- zlib is designed to be a free, general-purpose, legally unencumbered, lossless data-compression library for use on virtually any computer hardware and operating system.
- http://www.zlib.net/
- avahi
- Avahi is a system which facilitates service discovery on a local network. This means that you can plug your laptop or computer into a network and instantly be able to view other people who you can chat with, find printers to print to or find files being shared. This kind of technology is already found in Mac OS X (branded Rendezvous, Bonjour and sometimes Zeroconf) and is very convenient. Avahi is mainly based on Lennart Poettering's flexmdns mDNS implementation for Linux which has been discontinued in favour of Avahi. (ランデブーのフリー版のようなもの)
- http://avahi.org/
- mDNS
- mDNS -- Multicast DNS (mDNS) & DNS Service Discovery (DNS-SD) Test Tool
- http://www.dns-sd.org/
Avahi と mDNS はどちらかがあればよい。
依存パッケージをMacPortsでインストールする。
raptor をインストールする。
mnmp:4store nakao$ sudo port install raptor ---> Computing dependencies for curl ---> Fetching curl ---> Attempting to fetch curl-7.19.7.tar.bz2 from http://www.execve.net/curl/ ---> Verifying checksum(s) for curl ---> Extracting curl ---> Configuring curl ---> Building curl ---> Staging curl into destroot ---> Deactivating curl @7.19.4_0 ---> Computing dependencies for curl ---> Installing curl @7.19.7_0 ---> Activating curl @7.19.7_0 ---> Cleaning curl ---> Computing dependencies for libxslt ---> Fetching libxslt ---> Attempting to fetch libxslt-1.1.26.tar.gz from http://distfiles.macports.org/libxslt ---> Verifying checksum(s) for libxslt ---> Extracting libxslt ---> Configuring libxslt ---> Building libxslt ---> Staging libxslt into destroot ---> Deactivating libxslt @1.1.24_2 ---> Computing dependencies for libxslt ---> Installing libxslt @1.1.26_0 ---> Activating libxslt @1.1.26_0 ---> Cleaning libxslt ---> Computing dependencies for raptor ---> Fetching raptor ---> Attempting to fetch raptor-1.4.19.tar.gz from http://download.librdf.org/source/ ---> Verifying checksum(s) for raptor ---> Extracting raptor ---> Configuring raptor ---> Building raptor ---> Staging raptor into destroot ---> Installing raptor @1.4.19_0 ---> Activating raptor @1.4.19_0 ---> Cleaning raptor mnmp:4store nakao$ ./configure [OK ] pkg-config installed [OK ] raptor installed [FAIL] no rasqal library
rasqal をインストールする。
mnmp:4store nakao$ sudo port install rasqal ---> Computing dependencies for rasqal ---> Fetching rasqal ---> Attempting to fetch rasqal-0.9.16.tar.gz from http://download.librdf.org/source/ ---> Verifying checksum(s) for rasqal ---> Extracting rasqal ---> Configuring rasqal ---> Building rasqal ---> Staging rasqal into destroot ---> Installing rasqal @0.9.16_0 ---> Activating rasqal @0.9.16_0 ---> Cleaning rasqal mnmp:4store nakao$ ./configure [OK ] pkg-config installed [OK ] raptor installed [OK ] rasqal installed [FAIL] no glib2 devel system
glib2をインストールする。
この間、とても書き切れないくらい操作して +universal でなみなみ更新
python25 をインストールする。
mnmp:4store nakao$ sudo port install python25
---> Computing dependencies for python25
---> Fetching python25
---> Verifying checksum(s) for python25
---> Extracting python25
---> Applying patches to python25
---> Configuring python25
---> Building python25
---> Staging python25 into destroot
---> Installing python25 @2.5.4_9+darwin+darwin_10+macosx
---> Activating python25 @2.5.4_9+darwin+darwin_10+macosx
To fully complete your installation and make python 2.5 the default, please run
sudo port install python_select
sudo python_select python25
---> Cleaning python25
4store のビルドとインストール
./configure make make test
make test でテスト成功にみえるが、エラーとして終了する。
sudo make install
動作確認
http://4store.org/trac/wiki/CreateDatabase を参照。
mnmp:benchmark nakao$ 4s-backend-setup demo 4store[39388]: backend-setup.c:176 erased files for KB demo 4store[39388]: backend-setup.c:301 created RDF metadata for KB demo
どうやら動くらしい。
パッケージ化した
make macdmg で 4store.app とその dmg パッケージを作成できる。
アプリをビルドしている app-aux/build-app.sh では /sw (Fink)を前提としているので、それを /opt/local (MacPorts)におきかえる。こうして作成したパッケージが別のMacでの動作を確認。
app-aux/build-app.sh の変更分は git でフォークした:http://github.com/nakao/4store
まとめ
- バイナリ配布物がSnow Leopardではうごかなかった。
- Snow Leopard, MacPorts 環境でビルドできた。
- パッケージを作成した。
- githubでMacPortsでパッケージ化するソースをフォークした。
2009-11-18
第8章 Overview of Toolkits の写経
http://lifesciencedb.g.hatena.ne.jp/nakao_mitsuteru/20091013/progsemweb の第4回目の前半の資料です。
紹介しているツール類
- Sesame
- Jena
- Redland
- Mulgara
- OpenLink Virtuoso
- Franz AllegroGraph (Commerical)
- Oracle (Commerical)
Sesame
http://lifesciencedb.g.hatena.ne.jp/nakao_mitsuteru/20091024/sesame のように簡単に導入できる。
Sesame Java API をつかう
Semame で RDFS 推論する
Sesame ウェブアプリケーションをインスタンスする
ワークベンチを起動する
データを追加する
SPARQL クエリる
REST APIる
SIMILE/Exhibit
RDF をレポート化する
検索して、フィルターして、うまくみる
Sesame にリンクする
時系列タイムライン
第8章のまとめ
第10章 Tying It All Together の写経
http://lifesciencedb.g.hatena.ne.jp/nakao_mitsuteru/20091013/progsemweb の第4回目の後半の資料です。
アプリケーションを構築するステップ:
- Sesame に初期データをロードする
- ウェブアプリケーションサーバを設定する
- オブジェクトを表示するためのHTMLテンプレートを作成する
- 公共データからデータセットを拡張する
- ほかのセマンティックアプリケーション向けにデータを再出版する
- 多数のデータセットを横断してクエリする
- 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 に多数トリプルがあればテスト成功。
変換した RDF を Sesame に直接インポートするコードがコメントアウトされていたので、環境に合わせてみて、解除してみた。
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
}
動作条件は次の二つ。
- http://localhost:8080/openrdf-sesame/repositories/joblistings/statements に RDF そのままを POST
- リクエストヘッダに content-type: application/rdf+xml
これを踏まえて 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
ポート番号を変更する。ConfigAPI - CherryPy - Trac を参照。
cherrypy.config.update({'server.socket_port': 8081})
cherrypy.quickstart(Main())
http://localhost:8081/ にアクセスして確認。
しかし、クリックすると pyton が Bus error で落ちた。
Sesame からデータを得る
参照サイト
- http://www.asahi-net.or.jp/%7Eax2s-kmtn/internet/rdf/rdf-sparql-xmlres.html
- http://www.openrdf.org/doc/sesame2/2.2/system/ch08.html#table-rdf-formats
- http://code.google.com/p/baetle/wiki/SesameHowto
データのとれるリクエスト例
$ 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" }
}
]
}
}
- json で取り出したい。
- Accept が無いとレスポンスが application/x-binary-rdf-results-table というバイナリ形式になっている。
- リクエストヘッダーに 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 は落ちる。とりあえずすすむ。
一般的なテンプレート
- http://semprog.com/psw/chapter10/templetes/viewgeneric.html
- http://localhost:8081/view?id=job:8301283
カンパニーデータを得る
Chunchbase
- http://api.crunchbase.com/v/1/company/metawebtechnologies.js -- REST API で JSON が返る
- http://semprog.com/psw/chapter10/crunchbase_data.py
改変して使用した
# Connecion to Sesame (略) endpoint='http://localhost:8080/openrdf-sesame/' con=connection(endpoint) (略) c=connection(endpoint) (略)
Yahoo! Finance
大企業の情報のソース。
- http://finance.yahoo.com/q/hp?YHOO&a=00&b=28&c=2008&=00&e=28&f=2009&g=m
- YAHOO! Inc. の 2008-01 から 2009-01 までの月間相場
- http://semprog.com/psw/chapter10/yahoo_finance_update.py
Freebase 接続と調和する
特化したビュー
他者へ出版する
RFDa
RDF/XML
データを拡張する
位置
地理、経済、人口
洗練されたクエリ
ジョブデータを可視化する
将来の拡張
第10章のまとめ
2009-11-16
第6章オントロジーの復習 Using Protege あたり
http://lifesciencedb.g.hatena.ne.jp/nakao_mitsuteru/20091013/progsemweb の http://lifesciencedb.g.hatena.ne.jp/nakao_mitsuteru/20091028/chap5chap6chap7 の Using Protege のあたりを復習する。
巨大な OWL オントロジーの開発を行うためのツール Protege は http://protege.stanford.edu/ から公開されている。
Protege をつかったオントロジー構築の参考サイト
ProgSemWeb はこのあたりの内容は駆け足すぎるので、ほかの参考資料をさがしてみた。
- 2009 Webインテリジェンス/Protege演習.ppt(PPT)-- カクテルオントロジーの作成演習
- http://ci.nii.ac.jp/naid/110004745134 Building OWL Ontologies Using the Ontology Editor Protege-OWL(<Special Issue>A Software Toolbox for Research Activity(4))]
- オントロジー構築ツールの比較資料
- WBSF v6.0.2 入門: 第1回 オントロジーの拡張
- オントロジー講習会第一回 モデリングツールprotégé (PPT)-- ピザオントロジーの作成演習
Protege 4.0 の起動
Create new OWL ontology を選んで進む
あたらしいオントロジーを作成する
オントロジーを編集する
Add + をクリック
オントロジーの説明に「テスト」と追記
Type が選択できる。XMLLiteral など選択可。Lang で ja が選択できない。
Entities タブ
Entities パネルではクラスとオブジェクトプロパティが一覧できる。
クラスを編集する
クラスは、主語と目的語になるオブジェクトのクラスです。
Description には、つぎのものが設定できる。
- Equivalent classes
- Superclasses
- Inferred anonymouse superclasses
- Members
- Disjoint classes (共通部分を持たないクラス)
オブジェクトプロパティを編集する
オブジェクトプロパティは、オブジェクトをRangeにする述語になるもの。つぎに、ドメインとレンジを指定する。ドメインは主語になれるオブジェクトのクラス。レンジは目的語になれるオブジェクトのクラス。
Charactoristics には、つぎのものが設定できる。
- Functional (目的語を一個だけもつ)_1
- Inverse functiona (主語を一個だけもつ)1_
- Transitive
- Symmetric
- Asymmetric
- Reflexive
- Inreflexive
Descriptions は、つぎのものが設定できる。
- Domains (主語になりえるオブジェクト)
- Ranges (目的語になりえるオブジェクト)
- Equivalent object properties
- Super properties
- Inverse properties (ステートメントの方向性が逆のプロパティ)
- Disjoint properties (共通部分を持たないプロパティ)
- Property chains
データプロパティを編集する
データプロパティは、リテラルをRangeにする述語になるもの。つぎに、ドメインとレンジを指定する。ドメインは主語になれるオブジェクトのクラス。レンジは目的語になれるリテラルのタイプ。
Charactoristics は、つぎのものが設定できる。
- Functional (目的語を一個だけもつ)
Descriptions は、つぎのものが設定できる。
- Domains (主語になりえるオブジェクト)
- Ranges (目的語になりえるリテラルの型)
- Equivalent object properties
- Super properties
- Disjoint properties (共通部分を持たないプロパティ)
インスタンスをつくる
オントロジーだけではなく、そのインスタンスをつくることもできる。インスタンスとオントロジーを行ったり来たりして開発プロセスを回すようだ。


















