オントロジーことはじめ（概念入門）

## はじめに
最近「情報の表現」について学んでいます。
この「情報の表現」を学ぶ過程で「オントロジー」という技術に触れる機会がありました。
このオントロジーは、とても汎用的な技術である反面とっつきづらく、基本的な考え方が理解できないと学習が難しいと感じました。

そこで今回は、これからオントロジーを学ぼうとする方に向けて、まず抑えておくべきことを紹介します。


## オントロジーとは
オントロジーとは、古くは「セマンティックWeb」、現在では「自然言語処理」の研究分野で情報の意味を定義するための概念・仕組みです。技術書では「語彙」とも表記しているものもあります。

概念と言われると難しいので、ちょっとした例を使って概念を紹介します。
「好き」という言葉があります。「好き」は1つの言葉ですが、好きの前に続く言葉によって、人は「好き」の持つさまざまな「意味」を理解します。
例えば、好きの前に「食べ物」を付けると、その人の「好き」とは対象の「好物」を表していると理解します。好きの前に「人名」を付けると、対象への「好意」「恋愛感情」を表していると理解します。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/43330/c4a4489a-0c8d-0677-bd51-26c2047e36db.png)


人は、このように1つの言葉に対し、前後の言葉（＝関連する情報）から「言葉（＝情報）の意味」を理解できます。人が自然に行っている「言葉の意味を理解する」という行動、これをコンピュータが理解できるようにしよう、という取り組みがあり、体系立てた枠組みこそがオントロジーなのです。

## オントロジーを使う意味
繰り返しますが、オントロジーとは「情報の意味を定義するための概念・仕組み」です。
オントロジーの目指す目的は、「人が情報の意味を理解する」という行動を、コンピュータで実現するためのものです。
ここで、「さぁ、オントロジーを学ぶぞ！」となってはいけません。相手は「概念」というふわふわしたものです。オントロジーを理解する近道は、オントロジーを取り巻く「情報」「情報の構造」「オントロジーの位置づけ」「オントロジーの表現方法」を理解することです。まずは、そこから説明を始めましょう。

### 情報
突然ですが質問です。「情報（＝データ）」とは何でしょう？
・・・超概念過ぎてよくわかりませんね。
もう一段掘り下げた質問にすると、「オントロジーが扱う情報」とは何でしょう？これならいかがでしょうか？

先ほどの「好き」の例を思い出してください。
「好きという言葉」、これそのものが「情報」です。
そして、「好き」という情報に、「食べ物」という情報を加えることで「好物」という「意味」が生まれました。
このように複数の「情報」が「意味（＝関連）」によって結びついている情報のことを**Linked Data（以下、LD）**と呼びます。LDのうち、オープンに公開されている情報を**Linked Open Data**と呼ばれ、セマンティックWebの領域で活用されてきました。

### 情報の形式
「情報」は様々な形式で表現されます。プレーンテキスト、CSV、XML、JSON、バイナリ（DBMS、Excelのような特定ソフトウェアフォーマットなど）・・・様々ありますが、オントロジーを適用するデータは、**RDFスキーマで定義されたXML形式（以下、RDFドキュメント）**で表現されます。
RDFスキーマの説明は膨大なので、ここでの説明は割愛します。詳細は、[W3Cの公式サイト](https://www.w3.org/RDF/)、[解説サイト](https://qiita.com/maoringo/items/4742b5cd01c9e698260d)を参照ください。


### オントロジーの位置づけ
「好き」の例で紹介した通り、オントロジーは情報と情報の繋がりと繋がりの意味を定義するという役割を担います。RDFスキーマで記載された情報の中に、オントロジーを表現する定義をRDFドキュメント内に定義します。
RDFドキュメントにオントロジーを定義することで、RDFドキュメントに情報を記載する場合は、具体的にどのような情報を記載する必要があるかを明確にします。
例えば、「料理」の情報をRDFドキュメントで定義する際に、「料理の情報には”レシピ”、”材料”の情報を必ず含める」ということをオントロジーで定義しておけば、料理の情報には必ずレシピと材料の情報が含まれていることを保証できます。


### オントロジーの表現方法
RDFドキュメント内でオントロジーを表現するには、[RDFS](https://www.w3.org/2001/sw/wiki/RDFS)、[OWLウェブ・オントロジー言語（以下、OWL）](http://www.asahi-net.or.jp/~ax2s-kmtn/internet/rec-owl-features-20040210.html#s1.2)といった言語が用いられます。RDFドキュメント内に、後述する意味リンクの情報を各言語で記述することでLDを表現したRDFドキュメントが完成します。以下、OWLによるオントロジーの定義例です。

```xml:OWLでオントロジーを定義したRDFドキュメントの例
<rdf:RDF
	xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
	xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
	xmlns:owl="http://www.w3.org/2002/07/owl#"
	xmlns:dc="http://purl.org/dc/elements/1.1/">

	<!-- OWL Header Example -->
	<owl:Ontology rdf:about="http://www.linkeddatatools.com/plants">
		<dc:title>The LinkedDataTools.com Example Plant Ontology</dc:title>
		<dc:description>An example ontology written for the LinkedDataTools.com RDFS & OWL introduction tutorial</dc:description>
	</owl:Ontology>

	<!-- OWL Class Definition Example -->
	<owl:Class rdf:about="http://www.linkeddatatools.com/plants#planttype">
		<rdfs:label>The plant type</rdfs:label>
		<rdfs:comment>The class of plant types.</rdfs:comment>
	</owl:Class>
</rdf:RDF>
```

※参考 http://www.linkeddatatools.com/introducing-rdfs-owl

例中の`<owl:Ontology>`が、オントロジー定義を示しており、`<owl:Class>`がオントロジーによるLDの定義を表しています。
`Class`と記載されているので勘の良い方はお気づきかもしれませんが、オントロジーの定義はオブジェクト指向のクラス定義に非常に似ています。

### まずはここまでをおさらい
上記の説明を鳥瞰図にすると次のように表現できます。以降のオントロジーの本質である「情報の繋がり」を理解する上での前提事項です。まずはここをしっかり押さえましょう。
![4.png](https://qiita-image-store.s3.amazonaws.com/0/43330/5b35888d-ecb4-2351-b831-ee67d80c598f.png)


## オントロジーが表現する「繋がり（＝意味）」の定義
オントロジーが情報と情報の繋がりを「意味リンク」と呼びます。意味リンクには、「全体-部分リンク」「属性リンク」「継承」「関係リンク」の4つに分けられます。以降、それぞれの特徴を説明します。

### 全体-部分リンク
「全体-部分リンク」とは、「情報Bは情報Aの一部である」という繋がり定義します。オントロジーで全体-部分リンク表す場合は「partOf」と表現します。
具体例を挙げると、「自転車」は「ハンドル」「タイヤ」「サドル」に対して、「全体（自転車）と一部（ハンドル、タイヤ、サドル）」の関係である、と言えます。更にいうと、ハンドル、サドルは1つ、タイヤは2つである必要があります。ハンドルが2つあったら自転車とは言えませんよね。（そういう特殊自転車もなくはないですが・・・）

![2.png](https://qiita-image-store.s3.amazonaws.com/0/43330/d56be6d9-bd11-6090-5e9c-9e2dc9906563.png)


このように全体-部分リンクは、情報の「全体-部分」と「部分の個数」の繋がりを定義できます。定義の意味するところが"制約"に近いことから、それぞれを「クラス制約」と「個数制約」と呼びます。

### 属性リンク
「属性リンク」とは、情報の属性（プロパティ）を意味する情報との繋がりを定義します。例えば、「人」の持つ特徴的な数値として「身長」が挙げられますが、この「身長」情報と「人」情報のつながりが属性リンクです。

### 継承
オントロジーは、情報の親／子関係を表現できます。RDFドキュメントの例でも触れましたが、オブジェクト指向の継承と同じ概念と理解いただいてもよいと思います。そして、オントロジーの「継承」の特徴は、次のようにオブジェクト指向と近いものです。

- 子は親の情報（＝設定値）を引き継ぐ
- 多重継承ができる。（継承した全てのクラスの定義を漏れなく引き継ぐ）

継承の関係は、「subClassOf」と表現します。「子 is a 親」という関係です。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/43330/1d515e0a-509d-6ca9-61d3-aedd8d2e49e3.png)


### 関係リンク
「関係リンク」は、上記以外の汎用的な繋がりを表現する方法です。
　「AさんとBさんは友人です（友人関係）」
　「Cさんは〇〇株式会社の社員です（雇用関係）」
　「DさんとEさんの出身地は横浜です（人と地域の関係）」
これらは全て「関係リンク」です。継承の関係をオブジェクト指向のクラスで例えましたが、関係リンクはグラフデータベースのエッジと同じ概念だと言えます。関係リンクは「rel」と表現します。


## おわりに
最後まで読んでいただきありがとうございます。
オントロジーの概念がおわかりいただけたでしょうか？
冒頭の繰り返しになりますが、オントロジーは「情報の意味を定義するための概念」であり、その適用範囲は広義なものです。更にオントロジーだけではなく、LDやRDFといった周辺技術の関連性を理解してないと学習初期で混乱することになります。本記事がこれからオントロジーを学ぼうとする方の一助になれば幸いです。

次回から、実際にRDF/OWLを使ってオントロジーを定義する方法、ツールの使い方、情報の操作（登録、検索など）について説明していきたいと思います。