第2回LinkedData勉強会に参加して、最近行った略語のアリーのRDF化およびSPARQLエンドポイントの構築について発表してきました。
トリプルストアにはVirtuosoを利用しました。OWLIM-SEも試しましたが、動作の安定性という点から前者を選択しています。
勉強会のページからも発表資料を閲覧出来ますが、こちらにも張っておきます。
第2回LinkedData勉強会に参加して、最近行った略語のアリーのRDF化およびSPARQLエンドポイントの構築について発表してきました。
トリプルストアにはVirtuosoを利用しました。OWLIM-SEも試しましたが、動作の安定性という点から前者を選択しています。
勉強会のページからも発表資料を閲覧出来ますが、こちらにも張っておきます。
RDFトリプルストアのVirtuosoをインストールして利用可能になるSPRQLエンドポイントに予め記入されているクエリとして以下のものがある。
SELECT DISTINCT ?C WHERE {[] a ?C}
意味のある結果が得られるためには検索対象に rdf:type (つまり a ) が使われているトリプルがある場合のみに限られるが、参考程度には使える。
例えば、様々なSPARQLエンドポイントの状態を一覧で得られるサイトのSPARQLエンドポイントで得られる結果は以下の二つのみ。
http://rdfs.org/ns/void#Dataset http://labs.mondeca.com/vocab/endpointStatus#EndpointStatus
http://xmlns.com/foaf/0.1/Organization http://xmlns.com/foaf/0.1/Person http://RDVocab.info/uri/schema/FRBRentitiesRDA/Family
因みにAllieのSPARQLエンドポイントでは以下の結果が得られる。
http://www.openlinksw.com/schemas/virtrdf#QuadMapFormat http://www.openlinksw.com/schemas/virtrdf#array-of-QuadMapFormat http://www.openlinksw.com/schemas/virtrdf#QuadMap http://www.openlinksw.com/schemas/virtrdf#QuadMapValue http://www.openlinksw.com/schemas/virtrdf#array-of-QuadMapColumn http://www.openlinksw.com/schemas/virtrdf#QuadMapColumn http://www.openlinksw.com/schemas/virtrdf#array-of-QuadMapATable http://www.openlinksw.com/schemas/virtrdf#QuadMapATable http://www.openlinksw.com/schemas/virtrdf#QuadMapFText http://www.openlinksw.com/schemas/virtrdf#array-of-string http://www.openlinksw.com/schemas/virtrdf#QuadStorage http://www.openlinksw.com/schemas/virtrdf#array-of-QuadMap http://www.w3.org/1999/02/22-rdf-syntax-ns#Property http://www.w3.org/2002/07/owl#Class http://www.w3.org/2002/07/owl#Ontology http://www.w3.org/2000/01/rdf-schema#Class http://www.w3.org/2002/07/owl#OntologyProperty http://www.w3.org/2002/07/owl#AnnotationProperty http://www.w3.org/2002/07/owl#Restriction http://www.w3.org/2002/07/owl#ObjectProperty http://www.w3.org/2002/07/owl#DatatypeProperty http://www.w3.org/2002/07/owl#InverseFunctionalProperty http://purl.org/allie/ontology/201102#PubMedID http://purl.org/allie/ontology/201102#ShortForm http://purl.org/allie/ontology/201102#Pair http://purl.org/allie/ontology/201102#PairList http://purl.org/allie/ontology/201102#PubMedIDList http://purl.org/allie/ontology/201102#ResearchArea http://purl.org/allie/ontology/201102#CooccurringShortFormList http://purl.org/allie/ontology/201102#LongForm http://purl.org/allie/ontology/201102#PairCluster
また、
select distinct ?P where {?P a owl:ObjectProperty}
や、
select distinct ?P where {?P a owl:DatatypeProperty}
とすれば術語の一覧が得られる。
VoID (Vocabulary of Interlinked Datasets) というLinked Dataのメタデータを記述する語彙があるが、余り使われていなさそう。
既存のSPARQLエンドポイントがあるので、そこで試しに下記のクエリ(VoID のリストを検索する)を試してみた。
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> PREFIX owl: <http://www.w3.org/2002/07/owl#> PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> PREFIX foaf: <http://xmlns.com/foaf/0.1/> PREFIX dcterms: <http://purl.org/dc/terms/> PREFIX scovo: <http://purl.org/NET/scovo#> PREFIX void: <http://rdfs.org/ns/void#> PREFIX akt: <http://www.aktors.org/ontology/portal#> SELECT DISTINCT ?title ?ex ?endpoint ?homepage WHERE { ?x a <http://rdfs.org/ns/void#Linkset> . ?ds void:subset ?x . ?ds rdfs:label ?title . ?ds void:sparqlEndpoint ?endpoint . OPTIONAL {?ds dcterms:description ?ex} OPTIONAL {?ds foaf:homepage ?homepage} }
得られる結果は36件。少ないなぁ。
Unix系のOSではおなじみのfindコマンドと同じ振る舞いを簡単にPerlで実現できるモジュールFile::Find。
普段findコマンドを駆使しているなら、find2perlコマンドを使って対応するPerlコードを自動生成させるのが吉。
モジュールのヘルプドキュメントにある通り、
find2perl / -name .nfs\* -mtime +7 \ -exec rm -f {} \; -o -fstype nfs -prune
と実行すると、
sub wanted { /^\.nfs.*\z/s && (($dev, $ino, $mode, $nlink, $uid, $gid) = lstat($_)) && int(-M _) > 7 && unlink($_) || ($nlink || (($dev, $ino, $mode, $nlink, $uid, $gid) = lstat($_))) && $dev < 0 && ($File::Find::prune = 1); }
と生成される。
時間(タイムスタンプ)情報付きのデータについて、指定した範囲でまとめた上で、各期間について頻度を取得するコマンドをメモ。
例えば、accessed_at という datetime 型の列があり、その時刻に value 列に納められる情報を取得したことを記録するログテーブル access_log を想定する。
そのとき、月ごとのアクセス数を取得するためには以下のようなコマンドを発行する。
SELECT COUNT(value),YEAR(accessed_at),MONTH(accessed_at) FROM access_log GROUP BY YEAR(accessed_at),MONTH(accessed_at);
以下のような結果が得られる。
+--------------+------------------+-------------------+ | COUNT(value) | YEAR(accessed_at) | MONTH(accessed_at) | +--------------+------------------+-------------------+ | 1893 | 2009 | 4 | | 2197 | 2009 | 5 | | 1617 | 2009 | 6 | | 2354 | 2009 | 7 | | 1836 | 2009 | 8 | | 1795 | 2009 | 9 | | 1930 | 2009 | 10 | | 1855 | 2009 | 11 | | 1757 | 2009 | 12 | | 2386 | 2010 | 1 | | 2844 | 2010 | 2 | | 2100 | 2010 | 3 | +--------------+------------------+-------------------+
すっかり遅くなってしまったけれど、ここに埋め込んでいくことに。
分子生物学会 (BMB2010) のポスター発表でも紹介しました。
mysql の関数で日付を扱う場合のメモ。
リファレンスマニュアルはコチラ。
日付の計算はいろいろと面倒だから、その辺はしっかりと関数で提供されている。
たとえば、今日の日付は CURRENT_DATE()、あるいは CURDATE() で得られる。
mysql> SELECT CURRENT_DATE();
+—————-+
| CURRENT_DATE() |
+—————-+
| 2010-11-08 |
+—————-+
1 row in set (0.00 sec)
そして、「昨日」は DATE_SUB() を利用して以下のように得られる。
mysql> SELECT DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY);
+——————————————+
| DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY) |
+——————————————+
| 2010-11-07 |
+——————————————+
1 row in set (0.00 sec)
「曜日」に関しては以下のような関数群が用意されている。
+——————–+
| DAYNAME(CURDATE()) |
+——————–+
| Monday |
+——————–+
1 row in set (0.00 sec)mysql> SELECT DAY(CURDATE());
+—————-+
| DAY(CURDATE()) |
+—————-+
| 8 |
+—————-+
1 row in set (0.00 sec)mysql> SELECT DAYOFWEEK(CURDATE());
+———————-+
| DAYOFWEEK(CURDATE()) |
+———————-+
| 2 |
+———————-+
1 row in set (0.00 sec)
今月は何日までだっけ? という時には LAST_DAY 関数。
mysql> SELECT LAST_DAY(CURDATE());
+———————+
| LAST_DAY(CURDATE()) |
+———————+
| 2010-11-30 |
+———————+
1 row in set (0.00 sec)
などなど。
今回は以前構築したセマンティック・メディアウィキ (Semantic Media Wiki, SMW、SMW+) に OpenID でログインできるように OpenID extension をインストール。
MediaWikiのバージョンは1.15.3。これに必要なOpenID extensionのバージョンは0.8.2らしい (DownloadページでMediaWikiのバージョンを指定すると自動的に適切なパッケージが得られる)。
これに必要な PHP ライブラリはOpenID Enabledなんだが、それが必要とするライブラリがいろいろとあり、その準備から始める必要があった。
UNI* 系OS利用者ならよく使うリダイレクション。
標準出力と標準エラー出力を共にリダイレクトする場合の記法を書いておく。
csh, tcsh, zsh
perl -e 'print "Hello World!\n";warn "Hi There!\n";' | & less
perl -e 'print "Hello World!\n";warn "Hi There!\n";' > & /dev/null
sh, bash
perl -e 'print "Hello World!\n";warn "Hi There!\n";' 2>&1 | less
perl -e 'print "Hello World!\n";warn "Hi There!\n";' > /dev/null 2>&1
perl -e 'print "Hello World!\n";warn "Hi There!\n";' >& /dev/null
OWL/RDFファイルを参照し、その内容を反映したサイトを自動構築するのに相応しい環境を検討した。
つまり、効率的に「セマンティックコンテンツ管理システム」を実現したい時に適切な環境を知りたかった。
この環境では、統一感があり、ページ間の繋がりが有機的なサイト構成を例えば Protege を利用して検討しOWLファイルとして生成すれば、それを反映したサイトがたちどころに出来上がることになる。
その結果、現時点でオープンソースシステムだけで実現しようとすると、メディアウィキ (MediaWiki) に セマンティック・メディアウィキ (Semantic MediaWiki) と SMW+ (Halo extension) を追加する方法以外には無いという結論に至った。本環境では日本語も問題なく扱えた。