Author Archives: yayamamo - Page 3

既存DBをRDF化してSPARQLエンドポイントを立ち上げました

第2回LinkedData勉強会に参加して、最近行った略語のアリーのRDF化およびSPARQLエンドポイントの構築について発表してきました。

トリプルストアにはVirtuosoを利用しました。OWLIM-SEも試しましたが、動作の安定性という点から前者を選択しています。

勉強会のページからも発表資料を閲覧出来ますが、こちらにも張っておきます。

SPARQLクエリで検索対象データの特徴を取得

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

思ったよりも少なかった。また、最近SPARQLエンドポイントを立ち上げた国立国会図書館においては以下の通り。
http://xmlns.com/foaf/0.1/Organization
http://xmlns.com/foaf/0.1/Person
http://RDVocab.info/uri/schema/FRBRentitiesRDA/Family

こちらもシンプル。オントロジーも併せて検索対象にしておいて頂けると、クエリを組み立てる際に非常に役立つと思う。

因みにAllieSPARQLエンドポイントでは以下の結果が得られる。

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

openlinksw.comドメインを持つクラスはVirtuoso固有にビルトインされているクラスで、その他、owlやrdf、rdfsに含まれるクラスとともに、Allieで用いられているクラスのリストが列挙されている。

また、

select distinct ?P where {?P a owl:ObjectProperty}

や、

select distinct ?P where {?P a owl:DatatypeProperty}

とすれば術語の一覧が得られる。

SPARQL and VoID

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件。少ないなぁ。

PerlモジュールFile::Findを使うならfind2perlも忘れずに

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);
    }

と生成される。

MySQLで期間ごとに集計したヒストグラムを取得

時間(タイムスタンプ)情報付きのデータについて、指定した範囲でまとめた上で、各期間について頻度を取得するコマンドをメモ。
例えば、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 で日付計算

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)

などなど。

OpenID で Semantic MediaWiki にログイン

今回は以前構築したセマンティック・メディアウィキ (Semantic Media Wiki, SMWSMW+) に OpenID でログインできるように OpenID extension をインストール。

MediaWikiのバージョンは1.15.3。これに必要なOpenID extensionのバージョンは0.8.2らしい (DownloadページでMediaWikiのバージョンを指定すると自動的に適切なパッケージが得られる)。

これに必要な PHP ライブラリはOpenID Enabledなんだが、それが必要とするライブラリがいろいろとあり、その準備から始める必要があった。

OpenID Enabled

Read more »

標準エラー出力のリダイレクト

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

Semantic MediaWikiとSMW+のセットアップ

背景

OWL/RDFファイルを参照し、その内容を反映したサイトを自動構築するのに相応しい環境を検討した。
つまり、効率的に「セマンティックコンテンツ管理システム」を実現したい時に適切な環境を知りたかった。
この環境では、統一感があり、ページ間の繋がりが有機的なサイト構成を例えば Protege を利用して検討しOWLファイルとして生成すれば、それを反映したサイトがたちどころに出来上がることになる。
その結果、現時点でオープンソースシステムだけで実現しようとすると、メディアウィキ (MediaWiki)セマンティック・メディアウィキ (Semantic MediaWiki)SMW+ (Halo extension) を追加する方法以外には無いという結論に至った。本環境では日本語も問題なく扱えた。

インストール

Read more »