Tag Archives: セマンティックウェブ

オントロジーエディタprotégéを使う

2013年10月8日に行われた第7回LinkedData勉強会にて「オントロジーエディタprotégéを使う」と題してprotégéの使い方を簡単に紹介しました。時間がおしていたことなどから非常に駆け足の説明となり、分かりにくい点が多々あったと思います。その後、スライドを見るだけでもなるべく分かるようにするために若干加筆修正をしてslideshareにアップしました。


protégé全体の説明を詳細にすることは困難なので、ひとまず、起動して何をしていいのか分からない、という状況にならないような紹介にしようと思いました。非常に簡単な事例を除いて、最初から思い描いていた通りのオントロジーを構築することはほぼ無理なので、実際の作業としては、オントロジーを作る → それを利用したデータセットを構築する → アプリケーションなどから利用する → 問題を見つける → オントロジーを更新する、の繰り返しが何度か続くことになると思います。なお、今回の資料では推論について全く触れていません。これはprotégéを使い始めるにあたり、推論の知識は必ずしも必要ではないとの判断からです。

また、プロパティの特徴としてFunctional以外については説明を省略しています。これについては、W3CのOWLリファレンスを参照して頂ければと思います。日本語訳もあります。本リファレンスは文字通りOWLについて、プロパティの特徴だけでなく、OWLについて全般的に書かれており、勉強会で紹介したprotégéがOWL2オントロジーをサポートし、Protege-OWLと呼ばれていることも併せて、protégéの提供する編集機能がOWLの仕様と非常によく対応づけられていることが分かります。protégéを利用する際にはこちらを参照するとその操作方法について理解が深まると思います。

参考資料として、スライド中で紹介したもののほかに、古いものもありますが、開発元のサイトに載せられている文書も読んでみると良いと思います。

とはいえ、オントロジーを作るという課題は資料を読むだけでなく、実際に自分で手を動かしてみないと理解しにくいものなのでしょうね。

なお、protégéのダウンロードはここから出来ます。

トリプルストア内の情報を得るサンプルクエリ集

CodeMirrorを使って幾つかのSPARQLクエリのサンプルを列挙してみることにした。

グラフ一覧と各グラフに含まれるトリプル数を取得する
実際にインスタンスをもつクラス一覧と、クラス定義があればその情報も含め、各クラスに含まれるインスタンス数を取得する

トリプルには重複が含まれていることがあるので、念のために distinct を入れている。また、Virtuoso関連クラスを除外するためのフィルタを加えている。

実際に述語としてトリプルを構成する述語一覧と、そのクラス定義があればその情報も含め、各述語が含まれるトリプル数を取得する

なお、ここで使用している distinct * のカウントはVirtuosoでは受け付けられないことが判明したので注意。今後発表されるバージョンでは使えるようになるかもしれない。


今回、相当数のトリプルを検索するSPARQLクエリを様々なエンドポイントに対して試してみたが、実際の結果が得られることは皆無であった。
より検索範囲の小さなものであれば問題無いだろうが、検索対象のデータベースの特徴をある程度ここに掲載したような方法で取得できる統計データなどとともに概観できたほうがより効率的な検索が出来るようになると思う。その他に各クラスの取る代表的な述語や各述語に対する主語や目的語のクラスなども簡単に分かるようになっていると助かる。というのもデータベース提供者以外はそこにあるデータの特徴や構造を通常よく知らないわけなので、どのようなクラスがあり、そこにどれだけのインスタンスがあるかという情報は貴重な参考情報になるからだ。もっともオントロジーがしっかり定義されていたり、voIDなどのデータが用意されていれば、分かることも多いが。また、データ提供者側においても生成されたデータが期待通りになっているのかを確認するため、あるいは、voIDなどのメタデータの生成も含め、得られた情報を予めエンドポイントに表示するためなどの目的で使うと有益だろう。
同様の統計データを取得するSPARQLクエリ集としてこちらのサイトがある。

SPARQL editor test

CodeMirrorを使ったSPARQLクエリのハイライト表示を試すついでに、実際にSPARQLエンドポイントに投げられるようにしてみた。ソースコードは下にある通りで、とても簡単にブログやサイトに埋め込めることから、サンプルクエリを提示する時に使うのも良いと思う。

Endpoint:

<link rel="stylesheet" href="http://codemirror.net/lib/codemirror.css">
<script src="http://codemirror.net/lib/codemirror.js"></script>
<script src="http://codemirror.net/addon/edit/matchbrackets.js"></script>
<script src="http://codemirror.net/mode/sparql/sparql.js"></script>
<style>.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>

<form>Endpoint:<input type="text" size="50" id="epuri"></input><br />
<textarea id="code" name="code"></textarea>
<button type="button" onclick="iq();"><b>Issue Query</b></button></form>
<script>
var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
mode: "application/x-sparql-query",
tabMode: "indent",
matchBrackets: true
});
var iq=function(){
  window.location.assign(document.getElementById("epuri").value+"?query="+encodeURIComponent(editor.getValue()));
}
</script>

セマンティックWebコンファレンス2013での発表

先日、2013年3月7日(木)に開催されましたセマンティックWebコンファレンス2013にて発表する機会を頂きました。関係者の皆様、どうもありがとうございます。
コンファレンスのページからでもPDFファイルとして発表資料を取得できますが、slideshareにもアップしましたのでこちらに告知します。引き続きLODが普及し、様々な知識の再利用性が高まるよう、出来ることを行っていきたいとお思います。

発表時間としてはギリギリだったので、詳しく説明しませんでしたが、LODを基盤として知のReduce、Reuse、Recycleが進むことを願っています。
これは、すなわち、LODの普及に伴い、車輪の再発明を減らし(Reduce)、先人の知恵を再利用し(Reuse)、それに基づく新しい知識を生み出す(Recycle)ことが以前よりも増して効率的に実現されれば、という私の考えです。


SPARQLを使い込む 補足

第5回LinkedData勉強会が先日開かれて「SPARQLを使い込む」と題した発表をさせていただきました。


ここでは発表中に口頭でのみお伝えした点やお伝えしきれなかった点について補足しておきます。
SERVICEキーワードを利用したfederated queriesではリモートのSPARQLエンドポイントに対して容易に大量のデータを返す様なクエリを発行出来てしまいます。従ってこの便利な機能を使う際には、実際にリモートに投げられるクエリを想定して行うのが良いと思います。
クエリの構造として同じスコープにある変数の場合、実際にクエリに書かれている順番にバインドされていくわけではないので、リモートに投げられる時点で、記述したクエリの変数のいずれかがバインドされていることを想定することが出来ません。従って、探索空間が非常に広くなりえることに注意が必要と思います。

SELECT * WHERE {
  ?s ?p ex:obj1213 .
  SERVICE  {
    ?s xe:pred22 ?o .
  }
}

このような場合で、仮に ex:obj1213 を目的語にもつ主語が一つしかなかったとしても、リモートに投げられるクエリには ?s に当該主語がバインドされているとは限らないので、xe:pred22 を述語にもつ全ての主語と目的語の組を探すことになり得ます。

それから、SPARQL1.1で加わった機能のうち、発表中に触れなかった主な項目としてデータベースの更新系があります。CRUDの、Create / Update / Delete が出来るようになっています (参考)。その他、クエリに関しては、以下の機能が1.1になり新たに加わっています (参考)。

このうち、まず、Aggregatesについては、数値処理の集合演算であるCOUNTSUMなどを除いて紹介していませんが、これらに加え、SQLでお馴染みのGROUP BYHAVINGが使えるようになっています。
また、一つのクエリ表現で複数の述語にマッチさせられる表記法法、Property Pathsについて全く触れておりません。これについては去年の第2回LinkedData勉強会で加藤さんがSPARQLの基礎と題して説明されていますのでご参照願います。
その他、CONSTRUCTの短縮表現についても扱っていません。これはCONSTRUCT WHEREと記述するもので、CONSTRUCTキーワード後のグラフパターンを省略出来る表現方法です。これは、WHERE直後のグラフパターンが単純であるときに使えます。つまり、FILTERキーワードや複雑なグラフパターンが含まれてなく、そのパターンがそのままトリプルとして取り出せる様なクエリであることが条件になります。詳細は上記リンク先をご確認ください。

2011年分子生物学会発表スライド補足

年会一般口頭発表(Towards Database Integration Through RDF & Linked Data)で紹介したRDF/Linked Dataを通したデータベース統合について8分では伝えきれないこともあったのでここに記しておく。


Read more »

N-TriplesのUnicode表現(\uxxxx)をデコードする

DBpediaをN-Triples形式で取得したらrdfs:labelプロパティの値として言語指定@enでUnicodeが含まれていた。その表現方法は現時点で未決定(下記リンク2のIssues参照)であるが、少なくとも取得ファイルでは\uで始まるエスケープ表現を用いていた。これはN3形式の踏襲で、すなわちそれは、Python Stringsを土台としている。そして更にJSONのStrings表現とも共通しているが、条件として表現対象の文字がBasic Multilingual Plane(0000からFFFF)に含まれている場合に限られる。その他の場合、Python StringsやJSONでは、\uxxxxを繰り返すのに対し(例、U+1D11Eは”\uD834\uDD1E”)、N3やN-Triplesでは\U(大文字のU)から始まる表現(\U00xxxxxx)を採用している。
さて、このようなエスケープ表現を含む文字列をデコードする方法だが、今回はjavaを用いたので、JenaとSesameについて調査した。その結果、Jenaは明示的にエスケープ表現を含む文字列をデコードするメソッドは公開されていないようだ。Sesameについてはとても簡単で、そのものズバリ、unescapeStringメソッドがNTriplesUtilクラスに用意されている。もちろん、RDFデータを読み書きする限りでは、エスケープ表現を含む文字列をそのまま独立して扱うことは稀だろうけれど、今回のように、rdfs:labelプロパティの値だけを抽出したデータを対象として処理するときには便利。因みに、JenaとSesameを比較しているページがあったので参考としてリンクを張っておく。

  1. DBpedia Downloads
  2. N-Triples (1)
  3. N-Triples (2)
  4. Notation 3
  5. Python strings
  6. JSON
  7. Jena
  8. Sesame
  9. unescapeString
  10. Jena vs Sesame

Protegeを使ってオントロジーを作る

protegeのバージョンアップに伴い、本記事の記述は古くなってしまいました。新規バージョンの利用方法については、こちらを参考にしてください。 2013年10月15日

今回はオントロジー編集ツールとして広く使われているProtegeを用いてオントロジーを作ります。オントロジーの作り方を記録するだけでなく、Protegeの使い方をまとめておく目的もあります。例として、以前にセマンティックウェブ的なウェブサービス提供方法の一つであるSADIに則ったウェブサービスをPerlを用いて構築する際に用いたメタボオントロジーを取り上げます。定義するオントロジーのイメージは図0のような感じです。参考文献はW3CのOWL仕様書になります。

メタボオントロジー概要

図0. メタボオントロジーの概要。

以下のような順序で進みます。編集には、「ラベルをつける」、「関係の定義」も含まれます。

  1. protegeのインストール
  2. ファイル名の設定
  3. 編集
  4. リリース

Read more »

SADIを使ってSW的なウェブサービスを構築する

SADIはSemantic Automated Discovery and Integrationの略で、セマンティックウェブ的な枠組みを利用し、オンラインでアクセス可能なウェブサービスやデータベース(オンライン資源)を統一した方法で活用出来るように提案されているサービス提供形式の一つです。具体的にいうと、オンライン資源へのアクセスはHTTP、入出力のデータフォーマットはRDF、入出力の型の定義はOWLで、という具合です。SADIに沿って構築されたオンライン資源のエンドポイントにHTTP GETすると、入出力の型や処理内容がRDF形式で得られ、処理させたいデータを同エンドポイントにHTTP POSTすると、実際の処理が行われ、結果が得られます。また、入力データと出力データの関係が陽に分かるように、両者のRDFにおける主語は同じでなければならない、という規定があります。つまり、例えば「山本の身長と体重はそれぞれ170cm、60Kgである」というRDFを入力データとしてBMI (Body mass index)計算サービスエンドポイント(ここでは仮に http://example.org/getBMI とします)に与えると、「山本のBMIは20.76である」、「山本の体重クラスは標準である」というRDFが出力として得られるということを述べています。この場合、いずれも主語は山本になります。

今回はSADIのPerlモジュールを使い、略語を与えると対応する展開形のリストが得られるAllieサービスを試しにSADI対応させてみたので、その際に得られた知識をここに記します。なお、SADIに対応させるために入出力データの型をOWLで定義しますが、そのためにはオントロジーエディタのProtegeを使うと便利です。というのも、Protege用のSADIプラグインが配布されていて、サービスをSADI対応させる際に必要な作業を支援する機能が利用出来るからです。例えば、ブラウザなどを使うことなく、構築したエンドポイントを簡単に試せる機能が提供されています。本プラグインの利用方法についてはこちらを参考にしてください。今回は本ページからリンクが張られているこちらを参考にして作業しました。

SADIのPerlモジュールをインストール
Read more »

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 »