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

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

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

メタボオントロジー概要

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

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

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


インストール
protegeを使うためにはjavaが必要ですが、Mac OSなどの一部の環境を除き、javaとセットでインストールも出来るオプションがあるので、自身の環境に合わせて選択します。ダウンロードサイトはここです。本稿では執筆時最新のProtege 4.1 (build 239)を用いています。コンパイル等の作業は不要なので、インストール自体は特に問題ないと思います。起動すると以下のようなウィンドウが表示されると思います。

Protege起動ウィンドウ

図1. Protegeを起動した際に表示されるウィンドウ。

ファイル名の指定
今回はゼロからオントロジーを作成するので、「Create new OWL ontology」を選択します。すると、Ontology IDを指定するウィンドウが表示されます。ここではhttp://example.org/BMIを作るので、図2のように記入します。

オントロジー生成画面

図2. これから作るオントロジーのURIを指定します。

「Continue」をクリックして進むと、今度はPhysical Locationを指定するページに切り替わります。なお、ここでは拡張子(.owlなど)を付けることが必須なので注意です。適宜指定して「Continue」をクリックします。するとOntology Formatを選択するページになります。ここでは「RDF/XML」とします。「Finish」をクリックしましょう。オントロジー編集の初期ウィンドウが表示されます(図3)。

編集初期ウィンドウ

図3. オントロジー編集用の初期ウィンドウ。

編集
最初にクラスを定義しましょう。ということで、まず、「Classes」タブを選択します(図4)。

Classesタブ

図4. Classesタブを選択します。

続いて左側の「Class hierarchy:」ペーン上部にある鉄アレイが直角に曲がったようなものの右上に+のあるアイコンをクリックします(図5)。これが「Add subclass」ボタンで、「Thing」クラスのサブクラス(下位クラス)を一つ定義するためのものです。なお、全てのクラスは「Thing」クラスの下位クラスになります。

下位クラスの追加

図5. 「Thing」クラスの下位クラスを追加します。

最初に「メタボ傾向生物」クラスを追加しましょう。アイコンをクリックすると現れるウィンドウで「Please enter a class name」と表示されるボックスに「メタボ傾向生物」と記入して「OK」をクリックします(図6)。

クラス名の定義

図6. 「メタボ傾向生物」クラスを定義します。

以降、同じ要領で全てのクラスを定義していきます。下位クラスを追加する他に、同じレベルのクラスを追加するボタンも用意されているので適宜利用しましょう。「メタボ傾向生物」の下位クラスに、「肥満度情報を持つメタボ傾向生物」、「人」、「犬」、「猫」をそれぞれ追加します。更に、「肥満度情報を持つメタボ傾向生物」の下位クラスに「肥満度情報を持つ人」、「肥満度情報を持つ犬」、「肥満度情報を持つ猫」を追加します。また、「Thing」クラスの下位クラスとして、「体重クラス」と「肥満度判定結果」を追加します。

ここでワンポイントアドバイス。クラス名の入力を誤ったり、より良い名前を思いついたときに修正したくなることもあるでしょう。こういう時はどうすれば良いのか? ダブルクリックしても、右クリックしてもダメです。まずは修正したいクラス名を選択(反転表示される)し、続いて、メニューの「Refactor」を選択し、そして「Rename entity…」を選ぶ必要があります(図7)。Protegeを使い始めて最初に経験する問題の一つかな、と思います。

クラス名の変更

図7. クラス名を変更する時は「Refactor」。

さて、クラスの追加が終わったら、Object Properties、Data Properties、Individualsについても、それぞれ「Classes」タブと同じ並びにある各タブを選択し、適宜定義します。一通りの定義が終わった状況での各カテゴリの左側のペーンは図8のようになっていると思います。なお、図8のイメージは、これ以降に行う作業がなされた後の状態なので、一部、本記事を読みながら作業を進められている方の表示とは異なることがあります。(例えば、一部のクラス名の左側にある●アイコンの中に横棒が表示されているのは、今後の作業結果によるものです。)

定義されたクラスやプロパティと定義済インスタンス

図8. クラスやプロパティあるいは適宜済インスタンスの一覧。

ラベルを付ける
これまで定義した各クラスやプロパティ、もしくはインスタンス(individual、個体)名は、OWLとしてはあくまでもグラフのノード識別子(URI)であり、それに対して我々人が読むための名称は、当該URIに対するラベル属性(rdfs:label)の値として与えます。RDFトリプルとして表現すると、これまで定義したクラスやプロパティ、インスタンスのノード識別子(URI)を主語とし、RDFスキーマで定義されるラベル属性(rdfs:label)を述語、そしてその目的語に我々が理解し易い名前をリテラルとして定義する形になります。Protegeにおいてこの作業は右上の「Annotations:」ペーンで行います。各クラスやインスタンスについて「Annotations」の右側にある+アイコンをクリックします(図9)。

ラベル追加

図9. ラベルを追加します。

クリックすると現れるウィンドウで、まず、左側のペーンで「label」を選択します。続いて右側の「Value」エリアに、例えば「メタボ傾向生物」と記入し、右下にある「Lang」に日本語であることを示す「ja」を書き込みます(Langにはenやdeなどが選べるようにプルダウンメニューがあるが、jaが無いので、直接書き込む)。なお、「Type」はそのままにしておきます(図10)。

ラベル属性追加ウィンドウ

図10. ラベル属性を、言語指定とともに追加します。

関係の定義
これまでで各クラスやプロパティ、インスタンスは定義されましたが、それらの使われ方については何も定義していません。つまり、図0でいえば、四角で示される各ノードとクラス間の階層関係のみが定義された状態で、それらとプロパティの間にどのような繋がりがあるのかについては何も無い状況です。そこで次はその関係を定義しましょう。「Classes」タブを選択し、「メタボ傾向生物」クラスを選択します。そして、右下の「Description: メタボ傾向生物」ペーン内にある「Equivalent classes」の表示横にある+アイコンをクリックします。当該クラスには「の体重は」と「の身長は」の二つのDatatypePropertyがそれぞれ浮動小数点として一つずつ付加されることから、現れたウィンドウの上にあるタブのうち、「Data restriction creator」を選択します(図11)。

プロパティに関する条件を追加

図11. 「メタボ傾向生物」に付与するプロパティに関する条件を追加します。

左の「Restricted property」ペーンで「の体重は」を選択し、右側の「Restriction filler」ペーンで「float」を選択します。また、下部にある「Restriction type」は「Exactly (exact cardinality)」で、「Cardinality」は1としておきます。これで、「メタボ傾向生物」クラスは「の体重は」プロパティの値として浮動小数点を一つ持つことを定義したことになります。同様に「の身長は」プロパティについても定義します。結果として「メタボ傾向生物」クラスの右下にある「Description」ペーンは図12のような表示がなされると思います。

メタボ傾向生物のプロパティ定義

図12. 「メタボ傾向生物」クラスのプロパティ定義。

さて、この時点で「メタボ傾向生物」の下位クラスは全て同じプロパティ定義がなされていることを「Description」ペーンの「Inherited anonymous classes」で確認出来ます(図13)。

下位クラスのプロパティ定義

図13. 上位クラスのプロパティに関する定義は下位クラスのそれに反映されます。「人」クラスは「メタボ傾向生物」の下位クラス。

「肥満度情報を持つメタボ傾向生物」については、更に「の肥満度は」プロパティも必要となりますから、同様に定義します。今度はObjectPropertyとして「肥満度判定結果」クラスを必要とするので、「Equivalent classes」横の+アイコンをクリックして現れるウィンドウの、「Object restriction creator」タブを選択し、「Restricted property」は「の肥満度は」、対応する「Restriction filler」は「肥満度判定結果」を、それぞれ選択します。「Restriction type」については先と同様に「Exactly (exact cardinality)」で「Cardinality」を1にします(図14)。

ObjectPropertyの追加

図14. 「肥満度情報を持つメタボ傾向生物」クラスにプロパティを追加します。

すると、下位クラスである「肥満度情報を持つ人」クラスにも同様のプロパティ定義が表示されているのが確認出来ます。つまり、「の体重は」、「の身長は」、「の肥満度は」の三つのプロパティ定義がなされています。

「肥満度判定結果」クラスのプロパティ定義も同様に行います。「のBMIは」は、「の体重は」や「の身長は」と同じDatatypePropertyで、「の体重クラスは」は「の肥満度は」と同じObjectPropertyです。ここまでで随分と関係性の定義もなされました。あともう少しです。

さて、「体重クラス」については、「低体重」、「標準」、「標準以上」、「肥満」の4つのインスタンスが含まれます。この定義はどのように行うのか、ですが、これまでのようにマウスでクリックするだけでは済まされません。まず、「体重クラス」を選択してから、「Description」ペーンの「Equivalent classes」横にある+アイコンをクリックするところまでは同じです。続いて、今回は「Class expression editor」タブをクリックします。そこには何も書かれていない白い空間だけが広がっています。ここでは、メンバをカンマで区切りながら列挙していく必要があるのです。そして最後に全体を中括弧で囲みます(図15)。

インスタンスメンバーの定義

図15. 「体重クラス」に含まれるインスタンスを列挙します。

以上でクラスに関する定義は終わりました。残るはプロパティに関する定義になります。ObjectProperty、DatatypeProperty共に、その主語になりうるクラス(Domain)、目的語になりうるクラス(Range)を定義することが出来ます。「食べる」プロパティの主語は「生物」クラス、目的語は「食べ物」クラスというようなイメージです。また、主語と目的語の関係について、例えば、主語が一つ決まれば、当該プロパティを用いた目的語は一つ決まる(Functional)、とか、反対に、目的語が一つ決まれば、それに対応する主語は自ずと決まる(Inverse functional)、といった定義を追加することが出来ます。(他には、XとYが述語Pで主語と目的語となり、YとZが同じく述語Pで主語と目的語となるとき、XとZが同じ述語Pで主語と目的語になることを示すTransitive、とか、主語と目的語を入れ替えても同じことを示すSymmetric、などなど。)

というわけで、「の肥満度は」プロパティの場合は、Domain、Rangeがそれぞれ「肥満度情報を持つメタボ傾向生物」、「肥満度判定結果」となり、「の体重クラスは」プロパティについては、Domain、Rangeはそれぞれ「肥満度判定結果」、「体重クラス」となります。DomainやRangeの定義は、クラスの時と同じで、各プロパティの「Description」ペーン内にある、「Domains (intersection)」あるいは「Ranges (intersection)」右横の+アイコンをクリックします。そして現れるウィンドウで、「Class hierarchy」タブを選択し、適宜クラスを選択します(図16)。また、両プロパティ共に主語が一つ決まれば、対応する目的語は一つだけ決まるので、「Functional」となります。これを定義するためには、クラスの定義ではなかった中央下にある「Characteristics」ペーン内の該当する項目をクリックすることで行います(図17)。

Domain定義

図16. 「の肥満度は」プロパティのDomainを定義します。

 

プロパティ定義でFunctional

図17. 「の肥満度は」プロパティに関する定義で、「Functional」を追加します。

DatatypePropertyである「の体重は」、「の身長は」、「のBMIは」も同様に定義でき、前者2プロパティのDomainは共に「メタボ傾向生物」でもう一つは「肥満度判定結果」になります。また、全てのRangeは「float」です。「の体重は」の例を図18に示します。DatatypePropertyのRangeについては、「Built in datatypes」と「Data range expression」が選べますが、今回は全て前者で行いました。より詳細に定義しようとすればまだまだ追加できるかと思いますが、今回はこの辺で終わりにしようと思います。Protegeを使ったオントロジー作成の概要が伝わっていれば嬉しい限りです。

DatatypePropertyの定義

図18. 「の体重は」プロパティについて定義します。

リリース
最後にセーブをしてowlファイルを生成します(図19)。もっとも以上の他にも、各クラスやプロパティについてcommentプロパティを用いて実際の使い方や意味などを利用者に対して自然言語で記述したり、バージョン情報や当該オントロジーに関する説明、利用ライセンスなどを加えておくのが良いと思います。

owlファイルの生成

図19. セーブしてowlファイルを生成します。

ここで作成したowlファイルはここからダウンロードできます。文字コードはUTF-8です。