【注意】 このドキュメントは、W3CのOWL 2 Web Ontology Language Primer W3C Recommendation 27 October 2009の和訳です。
このドキュメントの正式版はW3Cのサイト上にある英語版であり、このドキュメントには翻訳に起因する誤りがありえます。誤訳、誤植などのご指摘は、訳者までお願い致します。
First Update: 2011年3月5日
このドキュメントに対する正誤表を参照してください。いくつかの規範的な修正が含まれているかもしれません。
このドキュメントは、規範以外の形式でも入手できます: PDFバージョン。
翻訳版も参照してください。
Copyright © 2009 W3C® (MIT, ERCIM, Keio), All Rights Reserved. W3C liability, trademark and document use rules apply.
OWL 2ウェブ・オントロジー言語(非公式にはOWL 2)は、形式的に定義された意味を有するセマンティック・ウェブのためのオントロジー言語です。OWL 2オントロジーは、クラス、プロパティー、個体、データ値を提供し、セマンティック・ウェブ・ドキュメントとして蓄積されます。OWL 2オントロジーは、RDFで記述された情報と共に使用でき、OWL 2オントロジー自身は、主にRDFドキュメントの形式で交換が行われます。OWL 2ドキュメント概要は、OWL 2の全般的な状況を説明しており、他のOWL 2ドキュメントの前に読むべきです。
この入門では、他の分野からやって来る人々に対するオリエンテーション、OWL 2を用いて最初にシンプルな情報を表し、その後により複雑な情報を表す方法を示した実例、OWL 2でオントロジーを管理する方法、最後に、OWL 2の様々なサブ言語の違いなどを解説することにより、OWL 2を分かりやすく紹介しています。
この項は、このドキュメントの公開時のステータスについて記述しています。他のドキュメントがこのドキュメントに取って代わることがありえます。現行のW3Cの刊行物およびこの技術報告の最新の改訂版のリストは、http://www.w3.org/TR/のW3C技術報告インデックスにあります。
OWL 2は、XMLスキーマ定義言語(XML Schema Definition Language)(XSD)で定義されたデータ型を用いるように定義されています。この文書の執筆時点では、XSDの最新のW3C勧告はバージョン1.0であり、バージョン1.1の勧告に向けて進行中です。OWL 2は、XSD 1.1の新しいデータ型や、より明確な説明を用いるように作られていますが、現在は、これらの利用は部分的に保留されています。具体的には、2.3項の適合性で詳細に述べるように、XSD 1.1がW3C勧告になるまでは、それに基づくOWL 2の要素は任意であると考えるべきです。XSD 1.1がW3C勧告として公表されたときに、これらの要素は任意ではなくなり、規定に従い、必須であると見なすべきです。
開発者やユーザは、当面、XSD 1.1勧告候補に従うことをお勧めします。スキーマ・ワーキンググループとOWLワーキンググループの議論を踏まえると、XSD 1.1が勧告になった際にも、実装上の変更は必要なさそうです。
public-owl-comments@w3.org(公開アーカイブ)にコメントをお送りください。このドキュメントに対するOWLワーキンググループの作業は完了していますが、コメントは正誤表や今後の改定で扱われることがあります。開発者間の公開討論は、public-owl-dev@w3.org(公開アーカイブ)で歓迎します。
このドキュメントは、W3Cメンバー、ソフトウェア開発者、他のW3Cグループ、および他の利害関係者によりレビューされ、W3C勧告として管理者の協賛を得ました。これは確定済みドキュメントであり、参考資料として用いたり、別のドキュメントで引用することができます。勧告の作成におけるW3C の役割は、仕様に注意を引き付け、広範囲な開発を促進することです。これによってウェブの機能性および相互運用性が増強されます。
このドキュメントは、2004年2月5日のW3C特許方針の下で活動しているグループによって作成されました。このドキュメントには、参考情報のみが含まれています。W3Cは、このグループの成果物に関連するあらゆる特許の開示の公開リストを維持し、このページには特許の開示に関する指示も含まれています。
目次 |
W3C OWL 2ウェブ・オントロジー言語(OWL)は、事物、事物の集合、事物間の関係に関する豊かで複合的な知識を表現するように設計されたセマンティック・ウェブ言語です。OWLは、知識の一貫性を検証したり、暗黙知を明確化するために、OWLで表現した知識をコンピュータ・プログラムで推論可能とするコンピュータ論理言語です。オントロジーとして知られるOWLドキュメントは、WWWで公表され、他のOWLオントロジーを参照したり、他のOWLオントロジーから参照することができます。OWLは、RDF[RDF Concepts]と[SPARQL]を含むW3Cの一連のセマンティック・ウェブ技術の一部です。
この入門の主な目標は、OWLの長所や短所に関する見識を深められるようにすることです。入門は、OWLのほとんどの言語機能を実際の例を用いて紹介することを中心としています。入門の例の大部分は、オントロジーの例(全例は付録にある)から抽出したものです。このオントロジーの例は、OWLの主要な言語機能に分かりやすく触れられるように作成したものであり、本質的に、オントロジーの模範例を目指したものではありません。
このドキュメントは、OWL 2に関する初歩的な理解を得ることを目標としています。特に、このテーマになじみのない人々にとって分かりやすいものとなることを目指しています。したがって、2項において、OWL 2の性質に関し、何らかのハイレベルな紹介を行うことから始め、その後に3項において、非常に基本的な知識表現の概念をいくつか示し、それらがOWL 2で用いる用語とどの様に関連しているかを説明します。知識表現および推理について良く知っている読者は、OWL 2の用語について知るために、この項にざっと目を通すだけでよいかもしれません。
4~8項では、OWLが備えているほとんどの言語機能に関する非常に基本的な説明から始め、より洗練された説明へと進む形で、説明します。4項においてOWL 2の基本モデル化機能を示して論じた後に、5項において複合的なクラスについて紹介します。6項では、プロパティーの高度なモデル化機能を扱います。7項では、データ型に関連する高度なモデル化に焦点をあてます。8項の、主にオントロジーの管理目的で用いる付加的な論理機能で締めくくります。
9項では、OWL 2 DLとOWL 2 Fullの相違点とOWLの2つのセマンティック表示について扱い、10項では、プロファイルと呼ばれる、OWL 2の扱いやすい3つのサブ言語について説明します。OWL 2に対するツールのサポートについては、11項と12項で扱い、このOWL 2に関する非公式な説明の後に読むべき文書について助言します。
最後に、13項では、このドキュメントで用いている全てのオントロジーの例をリストアップしています。
OWL 2言語機能の包括的なリストに関しては、構文と例に関する適切なドキュメントの該当箇所にリンクしているOWL 2クィック・リファレンス・ガイド[OWL 2 Quick Guide]を参照してください。
OWL 1について既に知っている読者は、OWL 2の新機能と原理[OWL 2 New Features and Rationale]にある、OWL 2の変更点に関する包括的な概要説明をご覧ください。
OWLはセマンティック・ウェブ用の言語であるため、OWLでは、名前は、国際化資源識別子(IRI)[RFC 3987]を用います。IRIは長いため、OWLでの記述においては、しばしば省略形を用います。そのような省略がどのように機能するかは、OWLオントロジーのコード化に使用できる構文の形式によって異なりますが、それに関する詳細を知らなくても、このドキュメントの例は、概ね理解できます。8.2項では、適切な名前空間の宣言と関連するメカニズムについてさらに詳細に示しています。
OWLでは、様々な目的に役立つ様々な構文が利用できます。関数型構文[OWL 2 Specification]は、仕様が簡単になり、APIや推論システムなどのOWL 2におけるツール実装の基礎となるように設計されています。OWLのRDF/XML構文は、OWL構成子用に特定の翻訳を行っただけのRDF/XMLです[OWL 2 RDF Mapping]。これは、すべてのOWL 2ツールにサポートが義務付けられている唯一の構文です。マンチェスター構文[OWL 2 Manchester Syntax]は、論理学者ではない人がより簡単に読めるように作られたOWL構文です。OWL XML構文は、XMLスキーマで定義されたOWL用XML構文です[OWL 2 XML]。OWLの異る構文間の翻訳が可能なツールもあります。多くの構文形式では、OWL言語構成子はIRIでも表され、省略形を用いるためには、例示の通り、いくつかの宣言が必要となりえます。先と同様に、必要な詳細は8.2項にあります。
付録の例とオントロジーの例は、4つの異なる構文のいずれかであると見なすことができ、ここでは、RDF/XML[RDF Syntax]と、RDFベースの構文のTurtle[RDF Turtle Syntax]シリアル化の両方を提供しています。下のボタンで、ドキュメント中に表示される構文を制御できます。
OWL 2は、オントロジーを表現するための言語です。オントロジーという用語には、コンピュータ・サイエンスの内外において複雑な歴史がありますが、ここでは、ある種のコンピュータ上のアーティファクト、すなわち、プログラム、XMLスキーマやウェブ・ページのような、一般にドキュメントとして表示されるものを指すために使用します。オントロジーは、世界のある部分(通常、オントロジーの関心領域や主題と呼ばれる)に関する正確な記述表現です。正確な記述は、いくつかの目的を満たします。最も注目すべきは、人間のコミュニケーション上の誤解を防止し、ソフトウェアが確実に一律の予測可能な動作を行い、他のソフトウェアとうまく連携することです。
関心領域について正確に記述するためには、中心となる用語(しばしば語彙と呼ばれる)を考え出し、その意味を定めることが有益です。自然言語による簡潔な定義のほかに、用語が他の用語とどのような相関関係にあるかを述べることによって、その用語の意味に特性を与えることができます。用語は、そのような相関関係の情報と共に語彙を提供することで、典型的なOWL 2ドキュメントの最も重要な部分を構成します。オントロジーには、この用語の知識(terminological knowledge)のほかに、一般的な概念ではなく、考えられる領域の具体的対象を扱う、いわゆる言明的知識(assertional knowledge)も含まれます。
OWL 2はプログラミング言語ではありません。OWL 2は宣言的、すなわち、状況を論理的に述べます。そして、その状況に関する詳細を推論するために、適切なツール(推論システムという)を使用できます。これらの推論がアルゴリズム的にどのように実現されるかは、OWLドキュメントには含まれておらず、特定の実装に依存します。それでもなお、そのような質問に対する正しい答えは、形式意味論(それは、ダイレクト・セマンティクス[OWL 2 Direct Semantics]とRDFベースのセマンティクス[OWL 2 RDF-Based Semantics]という2つのバージョンになる)であらかじめ決まっています。これらのセマンティクスに準拠した実装のみが、OWL 2に適合していると見なされるでしょう([OWL 2 Conformance]を参照)。OWL 2ドキュメントの作成作業は、宣言的な性質を有するため、プログラミングとは概念的に異なります。さらに、どちらの場合も、複雑な形式的ドキュメントが作成されるため、方法論的で共同的な面、モジュール化、パターンのような、ソフトウェア工学の概念の一部をオントロジー工学に受け渡すことができます。
OWL 2は、構文上の適合性を目指したスキーマ言語ではありません。XMLとは違って、OWL 2は、ドキュメントをどのように構文的に構造化すべきかを規定するための高度な手段を提供しません。特に、ある情報(ある人の社会保険番号のような)を構文的に必ず存在させる方法はありません。ユーザがこのような誤解を持つ可能性がある特徴がOWLにはあるということを覚えておくべきです。
OWL 2は、データベースのフレームワークではありません。確かに、OWL 2ドキュメントは情報を蓄積するため、データベースと言えます。さらに、言明情報とデータベース・コンテンツとの類似性や用語情報とデータベース・スキーマとの類似性も指摘できます。しかし、通常は、根本的な前提(技術的には、使用するセマンティクス)に決定的な違いがあります。データベースでは、ある事実が存在していなければ、通常、「偽」とみなされます(いわゆる、閉世界仮説)が、OWL 2ドキュメントの場合は、開世界仮説に従い、それが存在していない(しかし「真」かもしれない)だけでありえます。さらに、前記の通り、データベース・スキーマには、規定の制約付きセマンティクスが備えられていることが多いです。しかし、データベースは、技術的に、多くのオントロジー指向のシステムに実行可能なバックボーンを与えます。
OWL 2は、関心領域に関する知識を、組織化、交換、推論するように設計された知識表現言語です。OWL 2において知識がどのように表現されるかを理解するために、いくつかの根本的な観念を最初に説明すべきでしょう。これらの基本概念は次の通りです。
OWL 2は知識の捕捉を目的としていますが、OWLが表現できる「知識」は、当然ながら、人間の知識のあらゆる側面を反映しているわけではありません。OWLは、人間の知識のある部分に関する強力な汎用モデル化言語であると考えることができます。モデル化作業の結果は、オントロジーと呼ばれます。オントロジーは、知識表現において「モデル」という用語がかなり異なる意味で用いられることが多いため、混乱を避けるために用いられている用語です。
ところで、知識を明確に組織化するためには、知識はステートメントや命題と呼ばれる基本的な断片から構成されることが多いと想定すると良いです。「雨が降っている」や「すべての人間の命には限りがある」といったステートメントは、このような基本的命題の典型例です。実際、あらゆるOWL 2オントロジーは本質的に、このような基本的な「知識の断片」の単なる集合です。オントロジーで出されるステートメントは、OWL 2では公理と呼ばれ、オントロジーは公理が真であると言明します。一般に、ある状況が与えられた場合、OWLステートメントは、真か偽かのいずれかでありえます。以下で詳細を説明するように、この点で、エンティティーや式と異なっています。
人間が考えるときには、自分達の知識から結論を導き出します。OWLの重要な機能は、人間の知能のこの特徴を、それが表現できる知識の形式で捕捉するということです。しかし、ステートメントが他のステートメントの結果であるとは、概して何を意味するのでしょうか?本質的に、それは、このステートメントは、他のステートメントが真であれば常に真であるということを意味します。OWLの用語では、Aのすべてのステートメントが真である状況において、aも真である場合、ステートメントAはステートメントaを含意すると言います。さらに、ステートメントの集合は、整合性がある(すなわち、その集合の中のすべてのステートメントを合わせて真であるような状況がありえる)ことも、矛盾している(そのような状況がない)こともありえます。OWLの形式意味論は、実質的に、特定のOWLステートメントが、どのようなありえる「状況」に対して真であるかを定めます。
自動的に結果を算出できるOWLツール(推論システム)があります。オントロジー上の公理の相互作用は、非常に微妙であり、人が理解するのは難しい場合があります。これは、OWL 2の長所でもあり短所でもあります。OWL 2ツールは、人が気付かない情報を発見できるため、長所と言えます。これにより、知識工学者はより直接的にモデル化を行うことができ、システムはモデル化に関する有益なフィードバックや批評を提供することができるようになります。様々に組み合わせられた様々な構成子の実際の効果を人間が即座に見通すことは比較的難しいため、弱点と言えます。ツールのサポートにより状況は改善しますが、知識設計の成功には、さらにいくらかの訓練と経験が必要なことが多いです。
OWLのステートメントをよく見ると、ステートメントが「単体」であることは稀であり、明示的に表現できる何らかの内部構造を有していることが多いことがわかります。通常、世界のオブジェクトを参照し、例えば、カテゴリー分け(「メアリーは女性である」のような)を行ったり、その関係について何かを述べる(「ジョンとメアリーは結婚している」)ことによって記述します。オブジェクト(ジョン、メアリー)であれ、カテゴリー(女性)であれ、関係(結婚している)であれ、ステートメントのあらゆる原子的構成要素をエンティティーと呼びます。OWL 2では、オブジェクトを個体として、カテゴリーをクラスとして、関係をプロパティーとして表します。OWL 2のプロパティーは、さらに細分化されています。オブジェクト・プロパティーは、オブジェクトをオブジェクトに関連付け(例えば、ある人をその配偶者に関連付ける)、データ型プロパティーはデータ値をオブジェクトに割り当てます(例えば、人に年齢を割り当てる)。アノテーション・プロパティーは、関心領域ではなく、オントロジー自身(の一部)に関する情報(公理の作者と作成日のような)をコード化するために用います。
OWLの主要機能として、いわゆるコンストラクタを用いて、エンティティー名を結合して式にすることができます。簡単な例としては、女性の教授というクラスを記述するために、「女性」と「教授」という原子クラスを結合できます。後者は、OWLクラスの式で記述し、それをステートメントや他の式に利用できます。この意味において、式は、その構造により定義された新たなエンティティーとみなすことができます。OWLでは、エンティティーの種類ごとにコンストラクタは大きく異なっています。クラス用の表現言語は非常に豊かで洗練されていますが、プロパティー用の表現言語はあまりそうではありません。これらの違いには、歴史的かつ技術的な理由があります。
一般的な考察の後に、ここでは、OWL 2でのモデル化に関して詳細に扱います。次の項では、OWL 2が提供する重要なモデル化機能を、例とその利用方法に関して、一般的なコメントを示しながら紹介しています。基本的にあらゆるモデル言語で利用できる基本機能から始め、より高度なコンストラクタへと進みます。
ここでは、特定の家族に関する情報を提示しています。この例は、OWLを用いるべき領域を代表するものではなく、さらに、OWLを用いた良いモデル化の規範例でも、かなり複雑で、変わりやすく、文化に依存した、家族に関する領域を正く表現したものでもありません。むしろ、OWLの様々な機能を、かなり簡潔に示そうとしたものです。
ここで話題にする人々を紹介することから始めます。それは、次の通りに行うことができます。
ClassAssertion( :Person :Mary )
<Person rdf:about="Mary"/>
:Mary rdf:type :Person .
Individual: Mary Types: Person
<ClassAssertion> <Class IRI="Person"/> <NamedIndividual IRI="Mary"/> </ClassAssertion>
このステートメントは、メアリー(Mary)という個体に関して述べており、この個体が人(Person)であると述べています。より技術的には、人であることは、メアリーがあらゆる人のクラスに属している(または「メンバーである」や、より技術的には「インスタンスである」)と述べることによって表されます。一般に、クラスは、共通点がある個体をグルーピングし、それを参照するために用います。したがって、本来、クラスは個体の集合を表します。モデル化においては、クラスは、人という概念や女性(Woman)という概念などの、人間の思考の概念から成るオブジェクトの集合を示すために用いられることが多いです。その結果、同種類のステートメントを用い、彼女が女性のクラスのインスタンスであると表現することによって、メアリーが女性であると示すことができます。
ClassAssertion( :Woman :Mary )
<Woman rdf:about="Mary"/>
:Mary rdf:type :Woman .
Individual: Mary Types: Woman
<ClassAssertion> <Class IRI="Woman"/> <NamedIndividual IRI="Mary"/> </ClassAssertion>
これにより、クラスのメンバーシップが排他的でないことも明確になります。個体のグルーピングにはさまざまな基準(性別、年齢、靴のサイズなどの)がありえるため、1つの個体は、恐らく、同時に複数のクラスに属しているでしょう。
前項で、あらゆる人のクラスとあらゆる女性のクラスという、2つのクラスについて話しました。人間の読者にとっては、これらの2つのクラスが特別な関係にあることは明確です。つまり、人は女性より一般的であり、ある個体が女性であることを知っていれば、その個体は常に人であるに違いないということは明確です。しかし、この対応関係は、「人」と「女性」というラベルからは得られるものではなく、世界や用語の用法に関する人間の予備知識の一部です。したがって、システムが望ましい結果を得られるようにするためには、この対応関係に関する知識を持っていなければなりません。 OWL 2では、いわゆるサブクラス公理によってこれを実現します。
SubClassOf( :Woman :Person )
<owl:Class rdf:about="Woman"> <rdfs:subClassOf rdf:resource="Person"/> </owl:Class>
:Woman rdfs:subClassOf :Person .
Class: Woman SubClassOf: Person
<SubClassOf> <Class IRI="Woman"/> <Class IRI="Person"/> </SubClassOf>
この公理がオントロジーに存在していることにより、女性というクラスのインスタンス(人というクラスのインスタンスでもある)として指定したすべての個体に対して推論を行う推論システムが可能になります。大ざっぱに言えば、「あらゆるAがBである」という表現が意味をなし、正しい場合には、2つのクラスAとBのサブクラス関係を指定できます。
オントロジーのモデル化では、そのような相互依存性を散発的に宣言するためだけでなく、関心領域のあらゆるクラスの汎化関係を定めることによって、クラスの階層全体をモデル化するために、サブクラスのステートメントを用いるのが一般です。あらゆる母(Mother)が女性であるということも述べたいと仮定してください。
SubClassOf( :Mother :Woman )
<owl:Class rdf:about="Mother"> <rdfs:subClassOf rdf:resource="Woman"/> </owl:Class>
:Mother rdfs:subClassOf :Woman .
Class: Mother SubClassOf: Woman
<SubClassOf> <Class IRI="Mother"/> <Class IRI="Woman"/> </SubClassOf>
推論システムは、母であると分類されているあらゆる一つの個体が、女性(それゆえに、人)でもあるということだけでなく、母は人のサブクラスでなければならない(我々の直観通りに)ということも導き出せます。技術的には、これは、クラスとのサブクラス関係が推移的であるということを意味します。一方で、反射的でもあります。これは、あらゆるクラスがそれ自身のサブクラスであることを意味し、明らかにすべての人は人であるため、直感的でもあります。
我々の語彙の複数のクラスは、事実上、同じ集合を指す可能性があり、OWLは、それらが意味的に同等であると見なすメカニズムを備えています。例えば、「人」と「人間」という用語を同じ意味で用い、それは、人というクラスのあらゆるインスタンスが人間というクラスのインスタンスでもあり、その逆もまた同様であることを意味します。全く同じ個体を含む場合には、2つのクラスは同等であると見なされます。次の例は、人というクラスが人間(Human)というクラスと同等であると述べています。
EquivalentClasses( :Person :Human )
<owl:Class rdf:about="Person"> <owl:equivalentClass rdf:resource="Human"/> </owl:Class>
:Person owl:equivalentClass :Human .
Class: Person EquivalentTo: Human
<EquivalentClasses> <Class IRI="Person"/> <Class IRI="Human"/> </EquivalentClasses>
人と人間が同等であると述べることは、人は人間のサブクラスであり、人間は人のサブクラスでもあると述べることと完全に同じです。
4.1項で、個体は複数のクラスのインスタンスになりえることを述べました。しかし、あるクラスのメンバーシップが別のクラスのメンバーシップを明らかに排除する場合があります。例えば、男性と女性のクラスの例では、両方のクラスのインスタンスである個体が存在することを排除できます(例示を目的としているため、ここでは、生物学的に不明確な事例を無視します)。クラス間のこの「不一致関係」は、素である(クラス)と呼びます。先と同様に、2つのクラスが素であるという情報は、我々の予備知識の一部であり、推論システムがそれを利用するためには、明示しておく必要があります。これは、次のように実現します。
DisjointClasses( :Woman :Man )
<owl:AllDisjointClasses> <owl:members rdf:parseType="Collection"> <owl:Class rdf:about="Woman"/> <owl:Class rdf:about="Man"/> </owl:members> </owl:AllDisjointClasses>
[] rdf:type owl:AllDisjointClasses ; owl:members ( :Woman :Man ) .
DisjointClasses: Woman, Man
<DisjointClasses> <Class IRI="Woman"/> <Class IRI="Man"/> </DisjointClasses>
実際には、素のステートメントは、忘れらたり無視されることが多いです。その理由は、議論の余地がありますが、他の証拠がなければ、直観的にクラスは素であると見なされるためかもしれません。素のステートメントを省略すると、多くの潜在的に有益な結果を失う可能性があります。ここの例では、メアリーが男性でないと推論するために、素の公理が必要であることに注意してください。さらに、上記の公理に対し、推論システムは、母というクラスと男性というクラスが素であることを推論できます。
以前の項では、一つの個体、そのクラスのメンバーシップ、そして、インスタンスに基づいて複数のクラスを互いに関連付ける方法を説明しました。しかし、しばしば、オントロジーは、個体を他の個体に関連付ける方法を指定するためのものでもあります。家族について記述する場合には、これらの関係は重要です。 メアリーがジョンの妻であることを示すことから始めます。
ObjectPropertyAssertion( :hasWife :John :Mary )
<rdf:Description rdf:about="John"> <hasWife rdf:resource="Mary"/> </rdf:Description>
:John :hasWife :Mary .
Individual: John Facts: hasWife Mary
<ObjectPropertyAssertion> <ObjectProperty IRI="hasWife"/> <NamedIndividual IRI="John"/> <NamedIndividual IRI="Mary"/> </ObjectPropertyAssertion>
ここで、個体がどのような方法で関連付けられているかを記述しているエンティティー(例えば、ここの例では、hasWife(妻を持つ))は、プロパティーと呼ばれます。
個体が記述されている順序が重要であることに注意してください。「メアリーはジョンの妻である」は、真でありえますが、「ジョンはメアリーの妻である」は全く真ではありません。実際、これは、モデル化にありがちなエラーの原因で、一つの直感的な解釈のみが認められたプロパティー名を用いることによって避けることができます。名詞(「妻」(wife)など)の場合、そのような一意の名前は「of」や「has」を付与した構造(wifeOfやhasWife)でありえます。動詞(「愛する」(to love)など)の場合には、活用形(愛する(loves))や「by」を付与した受動態(lovedBy)により、予期せぬ解釈を防げるでしょう。
2つの個体がプロパティーによって結合されていないと述べることもできます。例えば、次は、メアリーがビルの妻でないと述べています。
NegativeObjectPropertyAssertion( :hasWife :Bill :Mary )
<owl:NegativePropertyAssertion> <owl:sourceIndividual rdf:resource="Bill"/> <owl:assertionProperty rdf:resource="hasWife"/> <owl:targetIndividual rdf:resource="Mary"/> </owl:NegativePropertyAssertion>
[] rdf:type owl:NegativePropertyAssertion ; owl:sourceIndividual :Bill ; owl:assertionProperty :hasWife ; owl:targetIndividual :Mary .
Individual: Bill Facts: not hasWife Mary
<NegativeObjectPropertyAssertion> <ObjectProperty IRI="hasWife"/> <NamedIndividual IRI="Bill"/> <NamedIndividual IRI="Mary"/> </NegativeObjectPropertyAssertion>
否定のプロパティー言明は、真でないことが分かっているステートメントを行う唯一の機会を提供してくれます。何かを述べるまでは何でもありえるというのが既定の姿勢であるOWLにおいては、この種の情報は特に重要です。
4.2項では、1つのクラスのメンバーシップが別のメンバーシップを含むと記述することが有益であると論じました。基本的に、プロパティーの場合も同じ状況は起こりえます。例えば、BがAの妻であることが分かっている場合には、Bは常にAの配偶者でもあることは明らかです(その逆は真でないことに注意)。OWLでは、このステートメントを次の通りに記述します。
SubObjectPropertyOf( :hasWife :hasSpouse )
<owl:ObjectProperty rdf:about="hasWife"> <rdfs:subPropertyOf rdf:resource="hasSpouse"/> </owl:ObjectProperty>
:hasWife rdfs:subPropertyOf :hasSpouse .
ObjectProperty: hasWife SubPropertyOf: hasSpouse
<SubObjectPropertyOf> <ObjectProperty IRI="hasWife"/> <ObjectProperty IRI="hasSpouse"/> </SubObjectPropertyOf>
プロパティー同等には、構文の省略形もあり、その点で、クラスの同等性と類似しています。
しばしば、2つの個体が特定のプロパティーによって互いに関連付けられているという情報によって、個体自身に関する更なる結論を出すことが可能になります。特に、クラスのメンバーシップを推論することができます。例えば、BがAの妻であるというステートメントは、明らかにBが女性でAが男性であることを含意します。そのため、ある意味で、2つの個体が特定のプロパティーで関連付けられているというステートメントは、これらの個体に関する暗黙の追加情報を含んでいます。ここの例では、この追加情報は、クラスのメンバーシップで表現できます。OWLはこの対応関係を記述する方法を提供します。
ObjectPropertyDomain( :hasWife :Man ) ObjectPropertyRange( :hasWife :Woman )
<owl:ObjectProperty rdf:about="hasWife"> <rdfs:domain rdf:resource="Man"/> <rdfs:range rdf:resource="Woman"/> </owl:ObjectProperty>
:hasWife rdfs:domain :Man ; rdfs:range :Woman .
ObjectProperty: hasWife Domain: Man Range: Woman
<ObjectPropertyDomain> <ObjectProperty IRI="hasWife"/> <Class IRI="Man"/> </ObjectPropertyDomain> <ObjectPropertyRange> <ObjectProperty IRI="hasWife"/> <Class IRI="Woman"/> </ObjectPropertyRange>
これらの2つの公理が存在していて、例えば、サーシャはhasWifeというプロパティーでヒラリーと関連付られているという情報があれば、推論システムは、サーシャが男性であり、ヒラリーが女性であると推論できるでしょう。
今までに提供した情報から、ジョンとメアリーは、それぞれ男性と女性という素のクラスのインスタントであることが分かっているため、彼らが同じ個体でないと推論できることに注意してください。しかし、別の家族の情報、例えばビルを追加して、彼が男性であると示せば、今までのところ、ジョンとビルが同じでないことを意味することは何も述べられていません。OWLは、異なる名前が異なる個体の名前であるとは想定しません。(この、必須の「単一名仮定」の欠如は、同じ個体を参照している名前が様々なタイミングで様々な組織によって知らないうちに作られるセマンティック・ウェブのアプリケーションに特に適しています。) したがって、ジョンとビルが同じ個体であるという選択肢を排除したい場合は、次の通り、それを明示的に指定しなければなりません。
DifferentIndividuals( :John :Bill )
<rdf:Description rdf:about="John"> <owl:differentFrom rdf:resource="Bill"/> </rdf:Description>
:John owl:differentFrom :Bill .
Individual: John DifferentFrom: Bill
<DifferentIndividuals> <NamedIndividual IRI="John"/> <NamedIndividual IRI="Bill"/> </DifferentIndividuals>
2つの名前が同じ個体を参照している(意味している)と述べることも可能です。例えば、ジェームズとジムが同じ個体であると述べることができます。
SameIndividual( :James :Jim )
<rdf:Description rdf:about="James"> <owl:sameAs rdf:resource="Jim"/> </rdf:Description>
:James owl:sameAs :Jim.
Individual: James SameAs: Jim
<SameIndividual> <NamedIndividual IRI="James"/> <NamedIndividual IRI="Jim"/> </SameIndividual>
これにより、推論システムは、ジェームズという個体に関して付与される情報が、ジムという個体にも成り立つと推論することが可能になります。
これまで、クラスのメンバーシップ、および、他の個体との関連性によって、どのように個体を記述できるかを見てきました。しかし、多くの場合、個体はデータ値で記述されます。ある人の生年月日、年齢、Eメールアドレスなどを考えてみてください。この目的ために、OWLは別のプロパティー、いわゆるデータ型プロパティーを提供します。これらのプロパティーは、個体を(他の個体ではなく)データ値に関連付けます。そして、XMLスキーマ・データ型[XML Schema Datatypes]の多くを使用できます。 下記は、データ型プロパティーの使用例です。ジョンの年齢が51歳であると述べています。
DataPropertyAssertion( :hasAge :John "51"^^xsd:integer )
<Person rdf:about="John"> <hasAge rdf:datatype="http://www.w3.org/2001/XMLSchema#integer">51</hasAge> </Person>
:John :hasAge 51 .
Individual: John Facts: hasAge "51"^^xsd:integer
<DataPropertyAssertion> <DataProperty IRI="hasAge"/> <NamedIndividual IRI="John"/> <Literal datatypeIRI="http://www.w3.org/2001/XMLSchema#integer">51</Literal> </DataPropertyAssertion>
同様に、ジャックの年齢は、53歳ではないと述べることができます。
NegativeDataPropertyAssertion( :hasAge :Jack "53"^^xsd:integer )
<owl:NegativePropertyAssertion> <owl:sourceIndividual rdf:resource="Jack"/> <owl:assertionProperty rdf:resource="hasAge"/> <owl:targetValue rdf:datatype="http://www.w3.org/2001/XMLSchema#integer"> 53 </owl:targetValue> </owl:NegativePropertyAssertion>
[] rdf:type owl:NegativePropertyAssertion ; owl:sourceIndividual :Jack ; owl:assertionProperty :hasAge ; owl:targetValue 53 .
Individual: Jack Facts: not hasAge "53"^^xsd:integer
<NegativeDataPropertyAssertion> <DataProperty IRI="hasAge"/> <NamedIndividual IRI="Jack"/> <Literal datatypeIRI="http://www.w3.org/2001/XMLSchema#integer">53</Literal> </NegativeDataPropertyAssertion>
定義域と値域は、オブジェクト・プロパティーと同じように、データ型プロパティーに対しても記述できます。しかし、その場合、値域はクラスではなくデータ型でしょう。下記は、hasAgeというプロパティーは、人を負でない整数に関連付けるためだけに用いられると述べています。
DataPropertyDomain( :hasAge :Person ) DataPropertyRange( :hasAge xsd:nonNegativeInteger )
<owl:DatatypeProperty rdf:about="hasAge"> <rdfs:domain rdf:resource="Person"/> <rdfs:range rdfs:Datatype="http://www.w3.org/2001/XMLSchema#nonNegativeInteger"/> </owl:DatatypeProperty>
:hasAge rdfs:domain :Person ; rdfs:range xsd:nonNegativeInteger .
DataProperty: hasAge Domain: Person Range: xsd:nonNegativeInteger
<DataPropertyDomain> <DataProperty IRI="hasAge"/> <Class IRI="Person"/> </DataPropertyDomain> <DataPropertyRange> <DataProperty IRI="hasAge"/> <Datatype IRI="http://www.w3.org/2001/XMLSchema#nonNegativeInteger"/> </DataPropertyRange>
この段階で、プロパティーの定義域と値域を用いるときに発生しやすい、ありがちなミスを指摘したいと思います。つい先ほど示した例では、hasAgeというプロパティーが、人を負でない整数に関連付けるためだけに用いられると述べましたが、フェリックスが猫(Cat)というクラスに属しているという情報と、フェリックスの年齢が9歳である(Felix hasAge 9)という情報も指定すると想定してください。これらの情報を結合した場合、フェリックスが人というクラスにも属していると推論される可能性がありますが、これは、たぶん意図しないものです。これは、モデル化にありがちなエラーです。定義域(または、値域)のステートメントは、知識に対する制約ではありませんが、推論システムが更なる知識を推論できることに注意してください。例にあるとおり、年齢が人にのみ付与されると述べた場合、年齢を付与したものはすべて自動的に人になります。
前項では、クラスを、名前を持った「曖昧な」ものとして扱いました。個体に特性を付与するためにクラスを使用し、サブクラスや素のステートメントでクラスを他のクラスに関連付けました。
ここでは、名前付きクラス、プロパティー、個体を、新しいクラスを定義するための構成要素としてどのように使用できるかについて説明します。
今までに説明した言語要素によって、簡単なオントロジーをモデル化できます。より複雑な知識を表すために、OWLは論理的なクラスのコンストラクタを提供します。特に、OWLは、言語要素に論理積(AND)、論理和(OR)、論理否定(NOT)を提供します。対応するOWLの用語((クラス)積集合、和集合、補集合)は、集合論から借りたものです。これらのコンストラクタは、原子クラス(すなわち、名前付きクラス)を複合クラスに結合します。
2つのクラスの積集合は、両方のクラスのインスタンスである個体で厳密に構成されます。次の例では、母というクラスが、女性と親(Parent)の両方のインスタンスであるオブジェクトで厳密に構成されていると述べています。
EquivalentClasses( :Mother ObjectIntersectionOf( :Woman :Parent ) )
<owl:Class rdf:about="Mother"> <owl:equivalentClass> <owl:Class> <owl:intersectionOf rdf:parseType="Collection"> <owl:Class rdf:about="Woman"/> <owl:Class rdf:about="Parent"/> </owl:intersectionOf> </owl:Class> </owl:equivalentClass> </owl:Class>
:Mother owl:equivalentClass [ rdf:type owl:Class ; owl:intersectionOf ( :Woman :Parent ) ] .
Class: Mother EquivalentTo: Woman and Parent
<EquivalentClasses> <Class IRI="Mother"/> <ObjectIntersectionOf> <Class IRI="Woman"/> <Class IRI="Parent"/> </ObjectIntersectionOf> </EquivalentClasses>
これから得られる推論の例は、母というクラスのすべてのインスタンスは、親というクラスにも属しているということを意味します。
2つのクラスの和集合には、少なくともこれらのクラスのうちの1つに含まれているすべての個体が含まれます。したがって、すべての両親のクラスは、母と父のクラスの和集合であると見なすことができます。
EquivalentClasses( :Parent ObjectUnionOf( :Mother :Father ) )
<owl:Class rdf:about="Parent"> <owl:equivalentClass> <owl:Class> <owl:unionOf rdf:parseType="Collection"> <owl:Class rdf:about="Mother"/> <owl:Class rdf:about="Father"/> </owl:unionOf> </owl:Class> </owl:equivalentClass> </owl:Class>
:Parent owl:equivalentClass [ rdf:type owl:Class ; owl:unionOf ( :Mother :Father ) ] .
Class: Parent EquivalentTo: Mother or Father
<EquivalentClasses> <Class IRI="Parent"/> <ObjectUnionOf> <Class IRI="Mother"/> <Class IRI="Father"/> </ObjectUnionOf> </EquivalentClasses>
クラスの補集合は、論理否定に相当し、クラス自体のメンバーでないオブジェクトで厳密に構成されます。下記の、子供のいない人の定義は、クラスの補集合を用いており、クラスのコンストラクタを入れ子にできることを示しています。
EquivalentClasses( :ChildlessPerson ObjectIntersectionOf( :Person ObjectComplementOf( :Parent ) ) )
<owl:Class rdf:about="ChildlessPerson"> <owl:equivalentClass> <owl:Class> <owl:intersectionOf rdf:parseType="Collection"> <owl:Class rdf:about="Person"/> <owl:Class> <owl:complementOf rdf:resource="Parent"/> </owl:Class> </owl:intersectionOf> </owl:Class> </owl:equivalentClass> </owl:Class>
:ChildlessPerson owl:equivalentClass [ rdf:type owl:Class ; owl:intersectionOf ( :Person [ owl:complementOf :Parent ] ) ] .
Class: ChildlessPerson EquivalentTo: Person and not Parent
<EquivalentClasses> <Class IRI="ChildlessPerson"/> <ObjectIntersectionOf> <Class IRI="Person"/> <ObjectComplementOf> <Class IRI="Parent"/> </ObjectComplementOf> </ObjectIntersectionOf> </EquivalentClasses>
上のすべての例は、新しいクラスが他のクラスを組み合わせたものであると定義するために、クラスのコンストラクタの使用例を示しています。しかし、もちろん、クラスにとって必要だが十分ではない状況を示すために、クラスのコンストラクタをサブクラスのステートメントと一緒に用いることもできます。次のステートメントは、あらゆる祖父(Grandfather)は、男性と親の両方である(その逆は、必ずしも真ではない)ことを示しています。
SubClassOf( :Grandfather ObjectIntersectionOf( :Man :Parent ) )
<owl:Class rdf:about="Grandfather"> <rdfs:subClassOf> <owl:Class> <owl:intersectionOf rdf:parseType="Collection"> <owl:Class rdf:about="Man"/> <owl:Class rdf:about="Parent"/> </owl:intersectionOf> </owl:Class> </rdfs:subClassOf> </owl:Class>
:Grandfather rdfs:subClassOf [ rdf:type owl:Class ; owl:intersectionOf ( :Man :Parent ) ] .
Class: Grandfather SubClassOf: Man and Parent
<SubClassOf> <Class IRI="Grandfather"/> <ObjectIntersectionOf> <Class IRI="Man"/> <Class IRI="Parent"/> </ObjectIntersectionOf> </SubClassOf>
一般的に、複合クラスは、名前付きクラスが出現可能なあらゆる場所、つまり、クラス言明で使用できます。これは、ジャックが人ではあるが親ではないと言明している次の例で示しています。
ClassAssertion( ObjectIntersectionOf( :Person ObjectComplementOf( :Parent ) ) :Jack )
<rdf:Description rdf:about="Jack"> <rdf:type> <owl:Class> <owl:intersectionOf rdf:parseType="Collection"> <owl:Class rdf:about="Person"/> <owl:Class> <owl:complementOf rdf:resource="Parent"/> </owl:Class> </owl:intersectionOf> </owl:Class> </rdf:type> </rdf:Description>
:Jack rdf:type [ rdf:type owl:Class ; owl:intersectionOf ( :Person [ rdf:type owl:Class ; owl:complementOf :Parent ] ) ] .
Individual: Jack Types: Person and not Parent
<ClassAssertion> <ObjectIntersectionOf> <Class IRI="Person"/> <ObjectComplementOf> <Class IRI="Parent"/> </ObjectComplementOf> </ObjectIntersectionOf> <NamedIndividual IRI="Jack"/> </ClassAssertion>
プロパティーの制限は、複合クラスに別のタイプの論理ベースのコンストラクタを提供します。名前が示すように、プロパティー制限は、プロパティーを含んだコンストラクタを用います。
特称量化と呼ばれるプロパティー制限は、クラスは、ある特定のプロパティーによって、あるクラスのインスタンスである別の個体に関連付けられたすべての個体の集合であると定義します。これは、両親のクラスは、hasChildというプロパティーによって人にリンクされた個体のクラスであると定義している次の例のように、例を用いて説明するのが最も良いでしょう。
EquivalentClasses( :Parent ObjectSomeValuesFrom( :hasChild :Person ) )
<owl:Class rdf:about="Parent"> <owl:equivalentClass> <owl:Restriction> <owl:onProperty rdf:resource="hasChild"/> <owl:someValuesFrom rdf:resource="Person"/> </owl:Restriction> </owl:equivalentClass> </owl:Class>
:Parent owl:equivalentClass [ rdf:type owl:Restriction ; owl:onProperty :hasChild ; owl:someValuesFrom :Person ] .
Class: Parent EquivalentTo: hasChild some Person
<EquivalentClasses> <Class IRI="Parent"/> <ObjectSomeValuesFrom> <ObjectProperty IRI="hasChild"/> <Class IRI="Person"/> </ObjectSomeValuesFrom> </EquivalentClasses>
これは、親のすべてのインスタンスに対して少なくとも1人の子供が存在し、その子供が人というクラスのメンバーであると予期されることを意味します。これは、不完全な知識を捕捉するために有用です。例えば、ボブは親であるとサリーが述べると、我々は、彼らの名前を知らなくても彼には少なくとも1人の子供がいると推論できます。特称量化を使用する際の自然言語指示子は、「いくつか」(some)や「1つ」(one)のような単語です。
全称量化と呼ばれる、別のプロパティー制限は、関連付けられているすべての個体が特定のクラスのインスタンスでなければならない個体のクラスを記述するために用います。次のステートメントを用いて、自分のすべての子供が幸せな人(HappyPerson)であれば、その人は幸せな人であるということを示すことができます。
EquivalentClasses( :HappyPerson ObjectAllValuesFrom( :hasChild :HappyPerson ) )
<owl:Class> <owl:Class rdf:about="HappyPerson"/> <owl:equivalentClass> <owl:Restriction> <owl:onProperty rdf:resource="hasChild"/> <owl:allValuesFrom rdf:resource="HappyPerson"/> </owl:Restriction> </owl:equivalentClass> </owl:Class>
[] rdf:type owl:Class ; :HappyPerson ; owl:equivalentClass [ rdf:type owl:Restriction ; owl:onProperty :hasChild ; owl:allValuesFrom :Happy ] .
Class: HappyPerson EquivalentTo: hasChild only HappyPerson
<EquivalentClasses> <Class IRI="HappyPerson"/> <ObjectAllValuesFrom> <ObjectProperty IRI="hasChild"/> <Class IRI="Happy"/> </ObjectAllValuesFrom> </EquivalentClasses>
この例では、OWLステートメントは、一種の自己参照が可能であることも示しています。幸せな人というクラスが、同等ステートメントの両側で用いられています。
プロパティー制限の使用は、「モデル化の初心者」に、ある種の概念上の混乱を生じさせるかもしれません。大ざっぱに言えば、自然言語のステートメントを論理的な公理に翻訳する場合には、特称量化の方がはるかに頻繁に発生します。全称量化を使用する際の自然言語指示子は、「単に/唯一の」(only)、「排他的に」(exclusively)や「~にすぎない」(nothing but)のような単語です。
全称的な役割の制限には、ある特定の誤解があります。上記の幸せの公理を例として考えてみます。直感的には、幸せであるためには、少なくとも1人の幸せな子供を持っていなければならないと解釈できます。しかし、そうではありません。hasChildというプロパティーの「出発点」ではない個体は、hasChildに対する全称量化によって定義されたクラスのメンバーです。したがって、上記のステートメントでは、すべての子供のない人は幸せでありえます。前述の通りに意図した解釈を形式化するためには、ステートメントを次の通りに書かなければならないでしょう。
EquivalentClasses( :HappyPerson ObjectIntersectionOf( ObjectAllValuesFrom( :hasChild :HappyPerson ) ObjectSomeValuesFrom( :hasChild :HappyPerson ) ) )
<owl:Class> <owl:Class rdf:about="HappyPerson"/> <owl:equivalentClass> <owl:Class> <owl:intersectionOf rdf:parseType="Collection"> <owl:Restriction> <owl:onProperty rdf:resource="hasChild"/> <owl:allValuesFrom rdf:resource="HappyPerson"/> </owl:Restriction> <owl:Restriction> <owl:onProperty rdf:resource="hasChild"/> <owl:someValuesFrom rdf:resource="HappyPerson"/> </owl:Restriction> </owl:intersectionOf> </owl:Class> </owl:equivalentClass> </owl:Class>
[] rdf:type owl:Class ; :HappyPerson ; owl:equivalentClass [ rdf:type owl:Class ; owl:intersectionOf ( [ rdf:type owl:Restriction ; owl:onProperty :hasChild ; owl:allValuesFrom :Happy ] [ rdf:type owl:Restriction ; owl:onProperty :hasChild ; owl:someValuesFrom :Happy ] ) ] .
Class: HappyPerson EquivalentTo: hasChild only HappyPerson and hasChild some HappyPerson
<EquivalentClasses> <Class IRI="HappyPerson"/> <ObjectIntersectionOf> <ObjectAllValuesFrom> <ObjectProperty IRI="hasChild"/> <Class IRI="HappyPerson"/> </ObjectAllValuesFrom> <ObjectSomeValuesFrom> <ObjectProperty IRI="hasChild"/> <Class IRI="HappyPerson"/> </ObjectSomeValuesFrom> </ObjectIntersectionOf> </EquivalentClasses>
この例は、プロパティー制限を、複合クラスとどのように入れ子にできるかも示しています。
1つの特定の個体に関連付けられている個体のクラスを記述するためにプロパティー制限を使用できます。例えば、ジョンの子供のクラスを、次の通りに定義できます。
EquivalentClasses( :JohnsChildren ObjectHasValue( :hasParent :John ) )
<owl:Class rdf:about="JohnsChildren"> <owl:equivalentClass> <owl:Restriction> <owl:onProperty rdf:resource="hasParent"/> <owl:hasValue rdf:resource="John"/> </owl:Restriction> </owl:equivalentClass> </owl:Class>
:JohnsChildren owl:equivalentClass [ rdf:type owl:Restriction ; owl:onProperty :hasParent ; owl:hasValue :John ] .
Class: JohnsChildren EquivalentTo: hasParent value John
<EquivalentClasses> <Class IRI="JohnsChildren"/> <ObjectHasValue> <ObjectProperty IRI="hasParent"/> <NamedIndividual IRI="John"/> </ObjectHasValue> </EquivalentClasses>
プロパティーでリンクされている個体という特殊なケースでは、個体は、自身にリンクされているかもしれません。次の例は、すべてのナルシストが自身を愛しているという考えを表す方法を示しています。
EquivalentClasses( :NarcisticPerson ObjectHasSelf( :loves ) )
<owl:Class rdf:about="NarcisticPerson"> <owl:equivalentClass> <owl:Restriction> <owl:onProperty rdf:resource="loves"/> <owl:hasSelf rdf:datatype="&xsd;boolean"> true </owl:hasSelf> </owl:Restriction> </owl:equivalentClass> </owl:Class>
:NarcisticPerson owl:equivalentClass [ rdf:type owl:Restriction ; owl:onProperty :loves ; owl:hasSelf "true"^^xsd:boolean . ] .
Class: NarcisticPerson EquivalentTo: loves Self
<EquivalentClasses> <Class IRI="NarcisticPerson"/> <ObjectHasSelf> <ObjectProperty IRI="loves"/> </ObjectHasSelf> </EquivalentClasses>
全称量化および特称量化を用いると、だれかの子供のうちの少なくとも1人などの、すべてに関して、個々に何かを述べることができます。しかし、制限に含まれる個体の数を指定したい場合があります。実際、子供の数に応じたクラスを作成できます。 次の例は、ジョンには、自身も親である子供が最大4人いると述べています。
ClassAssertion( ObjectMaxCardinality( 4 :hasChild :Parent ) :John )
<rdf:Description rdf:about="John"> <rdf:type> <owl:Restriction> <owl:maxQualifiedCardinality rdf:datatype="&xsd;nonNegativeInteger"> 4 </owl:maxQualifiedCardinality> <owl:onProperty rdf:resource="hasChild"/> <owl:onClass rdf:resource="Parent"/> </owl:Restriction> </rdf:type> </rdf:Description>
:John rdf:type [ rdf:type owl:Restriction ; owl:maxQualifiedCardinality "4"^^xsd:nonNegativeInteger ; owl:onProperty :hasChild ; owl:onClass :Parent ] .
Individual: John Types: hasChild max 4 Parent
<ClassAssertion> <ObjectMaxCardinality cardinality="4"> <ObjectProperty IRI="hasChild"/> <Class IRI="Parent"/> </ObjectMaxCardinality> <NamedIndividual IRI="John"/> </ClassAssertion>
このステートメントにより、ジョンが、親ではない子供を任意の数だけ持つことができることに注意してください。
同様に、ジョンが、親である子供が少なくとも2人いる個体のクラスのインスタンスであると述べることによって、最小の数を宣言することも可能です。
ClassAssertion( ObjectMinCardinality( 2 :hasChild :Parent ) :John )
<rdf:Description rdf:about="John"> <rdf:type> <owl:Restriction> <owl:minQualifiedCardinality rdf:datatype="&xsd;nonNegativeInteger"> 2 </owl:minQualifiedCardinality> <owl:onProperty rdf:resource="hasChild"/> <owl:onClass rdf:resource="Parent"/> </owl:Restriction> </rdf:type> </rdf:Description>
:John rdf:type [ rdf:type owl:Restriction ; owl:minQualifiedCardinality "2"^^xsd:nonNegativeInteger ; owl:onProperty :hasChild ; owl:onClass :Parent ] .
Individual: John Types: hasChild min 2 Parent
<ClassAssertion> <ObjectMinCardinality cardinality="2"> <ObjectProperty IRI="hasChild"/> <Class IRI="Parent"/> </ObjectMinCardinality> <NamedIndividual IRI="John"/> </ClassAssertion>
親であるジョンの子供の正確な数をたまたま知っていれば、次の通りに指定できます。
ClassAssertion( ObjectExactCardinality( 3 :hasChild :Parent ) :John )
<rdf:Description rdf:about="John"> <rdf:type> <owl:Restriction> <owl:qualifiedCardinality rdf:datatype="&xsd;nonNegativeInteger"> 3 </owl:qualifiedCardinality> <owl:onProperty rdf:resource="hasChild"/> <owl:onClass rdf:resource="Parent"/> </owl:Restriction> </rdf:type> </rdf:Description>
:John rdf:type [ rdf:type owl:Restriction ; owl:qualifiedCardinality "3"^^xsd:nonNegativeInteger ; owl:onProperty :hasChild ; owl:onClass :Parent ] .
Individual: John Types: hasChild exactly 3 Parent
<ClassAssertion> <ObjectExactCardinality cardinality="3"> <ObjectProperty IRI="hasChild"/> <Class IRI="Parent"/> </ObjectExactCardinality> <NamedIndividual IRI="John"/> </ClassAssertion>
カーディナリティー制限では、クラスの提供は任意です。ジョンのすべての子供の数について述べたいだけであれば、次の通りに記述できます。
ClassAssertion( ObjectExactCardinality( 5 :hasChild ) :John )
<rdf:Description rdf:about="John"> <rdf:type> <owl:Restriction> <owl:cardinality rdf:datatype="&xsd;nonNegativeInteger"> 5 </owl:cardinality> <owl:onProperty rdf:resource="hasChild"/> </owl:Restriction> </rdf:type> </rdf:Description>
:John rdf:type [ rdf:type owl:Restriction ; owl:cardinality "5"^^xsd:nonNegativeInteger ; owl:onProperty :hasChild ] .
Individual: John Types: hasChild exactly 5
<ClassAssertion> <ObjectExactCardinality cardinality="5"> <ObjectProperty IRI="hasChild"/> </ObjectExactCardinality> <NamedIndividual IRI="John"/> </ClassAssertion>
クラスを記述する非常に簡単な方法は、すべてのインスタンスを列挙することです。OWLでは、これが可能です。例えば、誕生日のゲストのクラスを作成できます。
EquivalentClasses( :MyBirthdayGuests ObjectOneOf( :Bill :John :Mary) )
<owl:Class rdf:about="MyBirthdayGuests"> <owl:equivalentClass> <owl:Class> <owl:oneOf rdf:parseType="Collection"> <rdf:Description rdf:about="Bill"/> <rdf:Description rdf:about="John"/> <rdf:Description rdf:about="Mary"/> </owl:oneOf> </owl:Class> </owl:equivalentClass> </owl:Class>
:MyBirthdayGuests owl:equivalentClass [ rdf:type owl:Class ; owl:oneOf ( :Bill :John :Mary ) ] .
Class: MyBirthdayGuests EquivalentTo: { Bill, John, Mary }
<EquivalentClasses> <Class IRI="MyBirthdayGuests"/> <ObjectOneOf> <NamedIndividual IRI="Bill"/> <NamedIndividual IRI="John"/> <NamedIndividual IRI="Mary"/> </ObjectOneOf> </EquivalentClasses>
4.1項で説明しているように、この公理が、ビル、ジョン、メアリーというクラスのメンバーシップを単に言明するより多くの情報を提供していることに注意してください。それに加えて、ビル、ジョン、メアリーが、誕生日のゲスト(MyBirthdayGuests)の唯一の(only)メンバーであることを規定しています。したがって、このように定義されたクラスは、閉じたクラスや列挙された集合と呼ばれることがあります。ここで、ジェフをMyBirthdayGuestsのインスタンスであると言明すれば、その結果、ジェフは上記の3人のうちのひとりに相当しなければならないことになります。
これまでは、クラス式の構成要素として使用されているだけのクラスとプロパティーに焦点を合わせてきました。以下では、OWL 2が、プロパティーを用いたどのようなモデル化性能を他に備えているかを見ていきます。
あるプロパティーは、別のプロパティーを持ってきて、その方向性を変える(すなわち、逆にする)ことで得られることがあります。例えば、親を持つ(hasParent)は、子どもを持つ(hasChild)の逆のプロパティーと定義できます。
InverseObjectProperties( :hasParent :hasChild )
<owl:ObjectProperty rdf:about="hasParent"> <owl:inverseOf rdf:resource="hasChild"/> </owl:ObjectProperty>
:hasParent owl:inverseOf :hasChild .
ObjectProperty: hasParent InverseOf: hasChild
<InverseObjectProperties> <ObjectProperty IRI="hasParent"/> <ObjectProperty IRI="hasChild"/> </InverseObjectProperties>
例えば、これは、任意の個体AとBに関し、子供を持つというプロパティーでAがBにリンクされていれば、BとAは、親を持つというプロパティーによってリンクされていると推論することができます。 しかし、たとえば、クラス式に使いたいだけであれば、プロパティの逆に対して明示的に名前を付ける必要はありません。孤児(Orphan)というクラスの定義に、親を持つ(hasParent)という新しいプロパティーを用いる代わりに、子供を持つの逆(hasChild-inverse)と直接的に記述できます。
EquivalentClasses( :Orphan ObjectAllValuesFrom( ObjectInverseOf( :hasChild ) :Dead ) )
<owl:Class rdf:about="Orphan"> <owl:equivalentClass> <owl:Restriction> <owl:onProperty> <owl:ObjectProperty> <owl:inverseOf rdf:resource="hasChild"/> </owl:ObjectProperty> </owl:onProperty> <owl:Class rdf:resource="Dead"/> </owl:Restriction> </owl:equivalentClass> </owl:Class>
:Orphan owl:equivalentClass [ rdf:type owl:Restriction ; owl:onProperty [ owl:inverseOf :hasChild ] ; owl:allValuesFrom :Dead ] .
Class: Orphan EquivalentTo: inverse hasChild only Dead
<EquivalentClasses> <Class IRI="Orphan"/> <ObjectAllValuesFrom> <ObjectInverseOf> <ObjectProperty IRI="hasChild"/> </ObjectInverseOf> <Class IRI="Dead"/> </ObjectAllValuesFrom> </EquivalentClasses>
プロパティーとその逆が一致すること、言い換えれば、プロパティーの方向性が重要ではない場合があります。例えば、配偶者を持つ(hasSpouse)というプロパティーによって、BがAと関連付けられていれば、AはBに必ず関連付けられています。理由は明らかですが、この特性を有するプロパティーを対称的と呼びます。次の通りに指定できます。
SymmetricObjectProperty( :hasSpouse )
<owl:SymmetricProperty rdf:about="hasSpouse"/>
:hasSpouse rdf:type owl:SymmetricProperty .
ObjectProperty: hasSpouse Characteristics: Symmetric
<SymmetricObjectProperty> <ObjectProperty IRI="hasSpouse"/> </SymmetricObjectProperty>
その一方で、プロパティーは非対称的でもありえ、これによってAがBに関連付けられていれば、BはAに決して関連付けられていないことを意味します。明らかに(タイムトラベルによって起こる逆説的なシナリオを除き)、これは、子供を持たないというプロパティーに当てはまるケースであり、次のように表現されます。
AsymmetricObjectProperty( :hasChild )
<owl:AsymmetricProperty rdf:about="hasChild"/>
:hasChild rdf:type owl:AsymmetricProperty .
ObjectProperty: hasChild Characteristics: Asymmetric
<AsymmetricObjectProperty> <ObjectProperty IRI="hasChild"/> </AsymmetricObjectProperty>
非対称的であることが、対称的ではないという概念よりはるかに強いことに注意してください。同様に、対称的であることは、非対称ではないという概念よりはるかに強いです。
以前、サブプロパティーはサブクラスと類似していると考えていました。素のクラスの概念を、プロパティーに転用することも成り立つことが判明しました。つまり、2つのプロパティーは、その両方のプロパティーによってリンクされている2つの個体が存在していない場合には、素です。次に、普通法に従えば、親子間の結婚は発生しえないと述べることができます。
DisjointObjectProperties( :hasParent :hasSpouse )
<rdf:Description rdf:about="hasParent"> <owl:propertyDisjointWith rdf:resource="hasSpouse"/> </rdf:Description>
:hasParent owl:propertyDisjointWith :hasSpouse .
DisjointProperties: hasParent, hasSpouse
<DisjointObjectProperties> <ObjectProperty IRI="hasParent"/> <ObjectProperty IRI="hasSpouse"/> </DisjointObjectProperties>
プロパティーは、反射的でもありえます。そのようなプロパティーは、すべてを自身と関連付けています。次の例では、誰もが自身を親類として持っていることに注意してください。
ReflexiveObjectProperty( :hasRelative )
<owl:ReflexiveProperty rdf:about="hasRelative"/>
:hasRelative rdf:type owl:ReflexiveProperty .
ObjectProperty: hasRelative Characteristics: Reflexive
<ReflexiveObjectProperty> <ObjectProperty IRI="hasRelative"/> </ReflexiveObjectProperty>
これは、反射的なプロパティーによって関係づけられている2つの個体が同一であることを必ずしも意味するわけではないことに注意してください。
さらに、プロパティーは非反射的でもありえ、個体は、その役割のままで自身に関係づけることができないことを意味します。典型的な例は、次の通り、だれも自分自身の親にはなれないと単に述べるものです。
IrreflexiveObjectProperty( :parentOf )
<owl:IrreflexiveProperty rdf:about="parentOf"/>
:parentOf rdf:type owl:IrreflexiveProperty .
ObjectProperty: parentOf Characteristics: Irreflexive
<IrreflexiveObjectProperty> <ObjectProperty IRI="parentOf"/> </IrreflexiveObjectProperty>
次に、夫を持つ(hasHusband)というプロパティーを考えてみます。どんな人も1人の夫しか持てない(例のために、それが当然であるとする)ため、すべての個体は、夫を持つというプロパティーによって、最大1つだけ他の個体にリンクできます。この種のプロパティーは、関数型と呼ばれ、次の通りに記述します。
FunctionalObjectProperty( :hasHusband )
<owl:FunctionalProperty rdf:about="hasHusband"/>
:hasHusband rdf:type owl:FunctionalProperty .
ObjectProperty: hasHusband Characteristics: Functional
<FunctionalObjectProperty> <ObjectProperty IRI="hasHusband"/> </FunctionalObjectProperty>
このステートメントが、すべての個体が夫を持つ必要はなく、1人以下の夫を持つことができると述べているだけであることに注意してください。さらに、メアリーの夫がジェームズであるというステートメントと、メアリーの夫がジムであるというステートメントが加われば、ジムとジェームズが同じ個体を意味しなければならないと推論できます。
また、特定のプロパティーの逆が関数型であることを示すことも可能です。
InverseFunctionalObjectProperty( :hasHusband )
<owl:InverseFunctionalProperty rdf:about="hasHusband"/>
:hasHusband rdf:type owl:InverseFunctionalProperty .
ObjectProperty: hasHusband Characteristics: InverseFunctional
<InverseFunctionalObjectProperty> <ObjectProperty IRI="hasHusband"/> </InverseFunctionalObjectProperty>
これは、個体が最大1つの他の個体の夫でありえることを示します。例では、一夫多妻の状況下では、前者の公理は有効だけども、後者は有効ではないという、関数と逆関数の違いも示しています。
次に、個体AがBの直接の子孫である場合には、AとBを必ずリンクさせることになる、先祖を持つ(hasAncestor)というプロパティーを見てみましょう。明らかに、親を持つというプロパティーは、先祖を持つというプロパティーの「特別なケース」であり、そのサブプロパティーであると定義できます。さらに、「自動的に」親の親(また、親の親の親)を含められると良いでしょう。これは、祖先を持つを推移的なプロパティーと定義することで実現できます。ある個体Bが存在しているとき、推移的なプロパティーによって、個体AとB、かつ、BとCがリンクされている場合、2つの個体AとCは常にリンクされています。
TransitiveObjectProperty( :hasAncestor )
<owl:TransitiveProperty rdf:about="hasAncestor"/>
:hasAncestor rdf:type owl:TransitiveProperty .
ObjectProperty: hasAncestor Characteristics: Transitive
<TransitiveObjectProperty> <ObjectProperty IRI="hasAncestor"/> </TransitiveObjectProperty>
前項の最後の例では、親を持つプロパティーの連鎖があれば、祖先を持つというプロパティーの存在が必ず含意されていましたが、その代わりに、もう少し具体的に、例えば、祖父母を持つ(hasGrandparent)というプロパティーを定義したいと考えるかもしれません。技術的には、これは、きっかり2人の親を持つ(hasParent)プロパティーの連鎖でリンクされているすべての個体を、祖父母を持つ(hasGrandparent)によって、関連付けたいということを意味します。祖先を持つ(hasAncestor)という、前の例と異なるのは、親を持つ(hasParent)が、祖父母を持つ(hasGrandparent)の特別なケースであることも、祖父母を持つ(hasGrandparent)が、曽祖父母などを意味することも望んでいない点です。次のように、そのような連鎖の範囲は、すべて、祖父母を持つ(hasGrandparent)プロパティーによって、決まらなければならないと表現できます。
SubObjectPropertyOf( ObjectPropertyChain( :hasParent :hasParent ) :hasGrandparent )
<rdf:Description rdf:about="hasGrandparent"> <owl:propertyChainAxiom rdf:parseType="Collection"> <owl:ObjectProperty rdf:about="hasParent"/> <owl:ObjectProperty rdf:about="hasParent"/> </owl:propertyChainAxiom> </rdf:Description>
:hasGrandparent owl:propertyChainAxiom ( :hasParent :hasParent ) .
ObjectProperty: hasGrandparent SubPropertyChain: hasParent o hasParent
<SubObjectPropertyOf> <ObjectPropertyChain> <ObjectProperty IRI="hasParent"/> <ObjectProperty IRI="hasParent"/> </ObjectPropertyChain> <ObjectProperty IRI="hasGrandparent"/> </SubObjectPropertyOf>
OWL2では、プロパティーの集合(データかオブジェクト)を、クラス式のキーとして割り当てることができます。これは、インスタンスとの関係によって、これらのプロパティーが得る値の集合によって、クラス式の名前付きインスタンスが一意に特定されることを意味します。
これに関する分かりやすい例は、社会保険番号による人の識別でしょう。
HasKey( :Person () ( :hasSSN ) )
<owl:Class rdf:about="Person"> <owl:hasKey rdf:parseType="Collection"> <owl:ObjectProperty rdf:about="hasSSN"/> </owl:hasKey> </owl:Class>
:Person owl:hasKey ( :hasSSN ) .
Class: Person HasKey: hasSSN
<HasKey> <Class IRI="Person"/> <ObjectProperty IRI="hasSSN"/> </HasKey>
4.8項では、オブジェクト・プロパティーを他の定義域の個体へリンクするのとちょうど同じように、基本的には、個体をデータ型プロパティーでデータ値に関連付けることにより、個体に数字の情報を与えられることを学びました。実際には、これらの類似点は、データ型の使用に関するより高度な機能にまで及びます。
まず、データ値はデータ型に分類されます。そして、4.8項では、データ型プロパティーの値域制限をどのように用いると、このプロパティーがリンクできる値の種類を示すことができるかを見ました。さらに、既存のデータ型を制約したり結合することで新しいデータ型を表現し、定義することができます。データ型は、いわゆるファセットで制限し、XMLスキーマ・データ型[XML Schema Datatypes]から借りることができます。次の例では、データ型の整数を(すべてを包含する)0から150の間の値に制約することにより、人の年齢の新しいデータ型を定義しています。
DatatypeDefinition( :personAge DatatypeRestriction( xsd:integer xsd:minInclusive "0"^^xsd:integer xsd:maxInclusive "150"^^xsd:integer ) )
<rdf:Description rdf:about="personAge"> <owl:equivalentClass> <rdfs:Datatype> <owl:onDatatype rdf:resource="http://www.w3.org/2001/XMLSchema#integer"/> <owl:withRestrictions rdf:parseType="Collection"> <rdf:Description> <xsd:minInclusive rdf:datatype="http://www.w3.org/2001/XMLSchema#integer">0</xsd:minInclusive> </rdf:Description> <rdf:Description> <xsd:maxInclusive rdf:datatype="http://www.w3.org/2001/XMLSchema#integer">150</xsd:maxInclusive> </rdf:Description> </owl:withRestrictions> </rdfs:Datatype> </owl:equivalentClass> </rdf:Description>
:personAge owl:equivalentClass [ rdf:type rdfs:Datatype; owl:onDatatype xsd:integer; owl:withRestrictions ( [ xsd:minInclusive "0"^^xsd:integer ] [ xsd:maxInclusive "150"^^xsd:integer ] ) ] .
Datatype: personAge EquivalentTo: integer[<= 0 , >= 150]
<DatatypeDefinition> <Datatype IRI="personAge"/> <DatatypeRestriction> <Datatype IRI="&xsd;integer"/> <FacetRestriction facet="&xsd;minInclusive"> <Literal datatypeIRI="&xsd;integer">0</Literal> </FacetRestriction> <FacetRestriction facet="&xsd;maxInclusive"> <Literal datatypeIRI="&xsd;integer">150</Literal> </FacetRestriction> </DatatypeRestriction> </DatatypeDefinition>
同様に、データ型は、クラスと同じように、補集合、積集合、和集合によって結合できます。その結果、未成年(minorAge)というデータ型を既に定義していると仮定した場合、未成年(minorAge)のあらゆるデータ値を、人の年齢(personAge)から除外することによって、成年(majorAge)というデータ型を定義できます。
DatatypeDefinition( :majorAge DataIntersectionOf( :personAge DataComplementOf( :minorAge ) ) )
<rdf:Description rdf:about="majorAge"> <owl:equivalentClass> <rdfs:Datatype> <owl:intersectionOf rdf:parseType="Collection"> <rdf:Description rdf:about="personAge"/> <rdfs:Datatype> <owl:datatypeComplementOf rdf:resource="minorAge"/> </rdfs:Datatype> </owl:intersectionOf> </rdfs:Datatype> </owl:equivalentClass> </rdf:Description>
:majorAge owl:equivalentClass [ rdf:type rdfs:Datatype; owl:intersectionOf ( :personAge [ rdf:type rdfs:Datatype; owl:datatypeComplementOf :minorAge ] ) ] .
Datatype: majorAge EquivalentTo: personAge and not minorAge
<DatatypeDefinition> <Datatype IRI="majorAge"/> <DataIntersectionOf> <Datatype IRI="personAge"/> <DataComplementOf> <Datatype IRI="minorAge"/> </DataComplementOf> </DataIntersectionOf> </DatatypeDefinition>
さらに、それに含まれるデータ値を列挙するだけで、新しいデータ型を作成できます。
DatatypeDefinition( :toddlerAge DataOneOf( "1"^^xsd:integer "2"^^xsd:integer ) )
<rdf:Description rdf:about="toddlerAge"> <owl:equivalentClass> <rdfs:Datatype> <owl:oneOf> <rdf:Description> <rdf:first rdf:datatype="&xsd;integer">1</rdf:first> <rdf:rest> <rdf:Description> <rdf:first rdf:datatype="&xsd;integer">2</rdf:first> <rdf:rest rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#nil"/> </rdf:Description> </rdf:rest> </rdf:Description> </owl:oneOf> </rdfs:Datatype> </owl:equivalentClass> </rdf:Description>
:toddlerAge owl:equivalentClass [ rdf:type rdfs:Datatype; owl:oneOf ( "1"^^xsd:integer "2"^^xsd:integer ) ] .
Datatype: toddlerAge EquivalentTo: { 1, 2 }
<DatatypeDefinition> <Datatype IRI="toddlerAge"/> <DataOneOf> <Literal datatypeIRI="http://www.w3.org/2001/XMLSchema#integer">1</Literal> <Literal datatypeIRI="http://www.w3.org/2001/XMLSchema#integer">2</Literal> </DataOneOf> </DatatypeDefinition>
6.1項では、オブジェクト・プロパティーに特性を付与する方法を見ました。また、それらの一部は、データ型プロパティーに利用できます。例えば、年齢を持つ(hasAge)というデータ型プロパティーに関数型という特性を付与することで、すべての人は1つの年齢しか持てないと表現できます。
FunctionalDataProperty( :hasAge )
<owl:FunctionalProperty rdf:about="hasAge"/>
:hasAge rdf:type owl:FunctionalProperty .
DataProperty: hasHusband Characteristics: Functional
<FunctionalDataProperty> <DataProperty IRI="hasHusband"/> </FunctionalDataProperty>
データ型プロパティーを制限することにより、新しいクラスを定義できます。次の例では、ティーンエイジャーというクラスを、年齢が13と19の間であるすべての個体と定義しています。
SubClassOf( :Teenager DataSomeValuesFrom( :hasAge DatatypeRestriction( xsd:integer xsd:minExclusive "12"^^xsd:integer xsd:maxInclusive "19"^^xsd:integer ) ) )
<owl:Class rdf:about="Teenager"> <rdfs:subClassOf> <owl:Restriction> <owl:onProperty rdf:resource="hasAge"/> <owl:someValuesFrom> <rdfs:Datatype> <owl:onDataType rdf:resource="&xsd;integer"/> <owl:withRestrictions rdf:parseType="Collection"> <rdf:Description> <xsd:minExclusive rdf:datatype="&xsd;integer">12</xsd:minExclusive> </rdf:Description> <rdf:Description> <xsd:maxInclusive rdf:datatype="&xsd;integer">19</xsd:maxInclusive> </rdf:Description> </owl:withRestrictions> </rdfs:Datatype> </owl:someValuesFrom> </owl:Restriction> </rdfs:subClassOf> </owl:Class>
:Teenager rdfs:subClassOf [ rdf:type owl:Restriction ; owl:onProperty :hasAge ; owl:someValuesFrom [ rdf:type rdfs:Datatype ; owl:onDatatype xsd:integer ; owl:withRestrictions ( [ xsd:minExclusive "12"^^xsd:integer ] [ xsd:maxInclusive "19"^^xsd:integer ] ) ] ] .
Class: Teenager SubClassOf: hasAge some integer[< 12 , >= 19]
<SubClassOf> <Class IRI="Teenager"/> <DataSomeValuesFrom> <DataProperty IRI="hasAge"/> <DatatypeRestriction> <Datatype IRI="&xsd;integer"/> <FacetRestriction facet="&xsd;minExclusive"> <Literal datatypeIRI="&xsd;integer">12</Literal> </FacetRestriction> <FacetRestriction facet="&xsd;maxInclusive"> <Literal datatypeIRI="&xsd;integer">19</Literal> </FacetRestriction> </DatatypeRestriction> </DataSomeValuesFrom> </SubClassOf>
以下では、オントロジーで定められた「論理的な」知識に実際には関係のないOWL 2の機能について説明します。これらは、オントロジー自身、公理、または、ひとつのエンティティーに関する追加情報を提供するために用いられます。
多くの場合、OWLオントロジーの一部に実際にその定義域自体を記述するのではなく、定義域の記述に関して記述した情報を提供したいと考えます。OWLはこのためにアノテーションを提供します。OWLアノテーションは、プロパティーと値の対を、オントロジーの一部、またはオントロジー全体自体にシンプルに関連付けます。アノテーション自体をアノテーションすることさえ可能です。アノテーション情報は、オントロジーの理論的意味の一部というわけではありません。
そのため、例えば、意味を自然言語で記述することで、オントロジーのクラスの1つに情報を追加できます。
AnnotationAssertion( rdfs:comment :Person "Represents the set of all people." )
<owl:Class rdf:about="Person"> <rdfs:comment>Represents the set of all people.</rdfs:comment> </owl:Class>
:Person rdfs:comment "Represents the set of all people."^^xsd:string .
Class: Person Annotations: rdfs:comment "Represents the set of all people."
<AnnotationAssertion> <AnnotationProperty IRI="&rdfs;comment"/> <IRI>Person</IRI> <Literal>Represents the set of all people.</Literal> </AnnotationAssertion>
下記は、アノテーションがある公理の例です。
SubClassOf( Annotation( rdfs:comment "States that every man is a person." ) :Man :Person )
<owl:Class rdf:about="Man"> <rdfs:subClassOf rdf:resource="Person"/> </owl:Class> <owl:Axiom> <owl:annotatedSource rdf:resource="Man"/> <owl:annotatedProperty rdf:resource="&rdfs;subClassOf"/> <owl:annotatedTarget rdf:resource="Person"/> <rdfs:comment>States that every man is a person.</rdfs:comment> </owl:Axiom>
:Man rdfs:subClassOf :Person . [] rdf:type owl:Axiom ; owl:annotatedSource :Man ; owl:annotatedProperty rdfs:subClassOf ; owl:annotatedTarget :Person ; rdfs:comment "States that every man is a person."^^xsd:string .
Class: Man SubClassOf: Annotations: rdfs:comment "States that every man is a person." Person
<SubClassOf> <Annotation> <AnnotationProperty IRI="&rdfs;comment"/> <Literal datatypeIRI="xsd:string">"States that every man is a person."</Literal> </Annotation> <Class IRI="Man"/> <Class IRI="Person"/> </SubClassOf>
しばしば、そのようなアノテーションは、ヘルプのインターフェースに表示するための自然言語テキストへのアクセスを提供するツールで用いられます。
OWLでは、あるテーマに関する一般的な情報は、ほぼ必ず、オントロジーに集約され、後で様々なアプリケーションに用いられまる。OWLオントロジーに名前を与えることもでき、この名前は通常、オントロジー・ドキュメントがウェブに置かれている場所です。あるテーマに関する特定の情報も、異なるアプリケーションで用いられていれば、オントロジー内に置くことができます。
Ontology(<http://example.com/owl/families> ... )
<rdf:RDF ...> <owl:Ontology rdf:about="http://example.com/owl/families"/> ... </rdf:RDF>
<http://example.com/owl/families> rdf:type owl:Ontology .
Ontology: <http://example.com/owl/families>
<Ontology ... ontologyIRI="http://example.com/owl/families"> ... </Ontology>
OWLオントロジーは、OWLドキュメント内に置かれ、その後で、ローカルのファイル・システムやWWWに置かれます。OWLドキュメントは、OWLオントロジーを含んでいるだけではなく、接頭辞の展開によって、OWLオントロジー(例えば、人(Person))で通常用いられる省略名をIRIに変換するための情報を含んでいます。その結果、IRIは、接頭辞の展開と参照とを連結したものとなります。
例では、今までに、xsdや空白の接頭辞などの、多くの接頭辞を用いてきました。前者の接頭辞は、XMLスキーマ・データ型のコンパクト名に用いられおり、そのIRIは、XMLスキーマ勧告で定められています。したがって、http://www.w3.org/2001/XMLSchema#というxsdの標準的な展開を用いなければなりません。もう一方の接頭辞用に選ぶ展開は、オントロジーのクラス、プロパティー、個体の名前にも、また、オントロジー自身の名前にも影響するでしょう。オントロジーをウェブに置くときには、他の誰かの名前を偶然使用してしまわないように、自分が管理しているウェブの一部に存在する展開を選ぶべきです。(ここでは、だれも制御していない、架空の場所を使用しています。)2つのXMLベースの構文には、組み込み名用の名前空間が必要で、名前空間としてXMLエンティティーを用いることもできます。一般に、似たキーワードが使われていても、利用可能な省略メカニズムとその特定の構文は、それぞれのOWLのシリアル化によって異なることに注意すべきです。
Prefix(:=<http://example.com/owl/families/>) Prefix(otherOnt:=<http://example.org/otherOntologies/families/>) Prefix(xsd:=<http://www.w3.org/2001/XMLSchema#>) Prefix(owl:=<http://www.w3.org/2002/07/owl#>) Ontology(<http://example.com/owl/families> ... )
<!DOCTYPE rdf:RDF [ <!ENTITY owl "http://www.w3.org/2002/07/owl#" > <!ENTITY xsd "http://www.w3.org/2001/XMLSchema#" > <!ENTITY rdfs "http://www.w3.org/2000/01/rdf-schema#" > <!ENTITY otherOnt "http://example.org/otherOntologies/families/" > ]> <rdf:RDF xml:base="http://example.com/owl/families/" xmlns="http://example.com/owl/families/" xmlns:otherOnt="http://example.org/otherOntologies/families/" xmlns:owl="http://www.w3.org/2002/07/owl#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:xml="http://www.w3.org/2001/XMLSchema#"> <owl:Ontology rdf:about="http://example.com/owl/families"/> ...
@prefix : <http://example.com/owl/families/> . @prefix otherOnt: <http://example.org/otherOntologies/families/> . @prefix owl: <http://www.w3.org/2002/07/owl#> . @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . @prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
Prefix: : <http://example.com/owl/families/> Prefix: xsd: <http://www.w3.org/2001/XMLSchema#> Prefix: owl: <http://www.w3.org/2002/07/owl#> Prefix: otherOnt: <http://example.org/otherOntologies/families/>
<!DOCTYPE Ontology [ <!ENTITY xsd "http://www.w3.org/2001/XMLSchema#" > ]> <Ontology xml:base="http://example.com/owl/families/" ontologyIRI="http://example.com/owl/families" xmlns="http://www.w3.org/2002/07/owl#"> <Prefix name="owl" IRI="http://www.w3.org/2002/07/owl#"/> ... </Ontology>
OWLでは、あるオントロジーに格納されている一般的な情報を他のオントロジーで再利用することも一般的です。OWLでは、この情報をコピーする必要はなく、次の通り、インポート・ステートメントを用いると、他のオントロジー内のオントロジー全体のコンテンツをインポートできます。
Import( <http://example.org/otherOntologies/families.owl> )
<owl:Ontology rdf:about="http://example.com/owl/families"> <owl:imports rdf:resource="http://example.org/otherOntologies/families.owl" /> </owl:Ontology>
<http://example.com/owl/families> owl:imports <http://example.org/otherOntologies/families.owl> .
Import: <http://example.org/otherOntologies/families.owl>
<Prefix name="otherOnt" IRI="http://example.org/otherOntologies/families/"/> <Import>http://example.org/otherOntologies/families.owl</Import>
セマンティック・ウェブとオントロジーの構築は分散的に提供されるため、オントロジーは、一般的に、同じ概念、プロパティーや個体に、異なる名前を用います。これまで見てきたように、OWLのいくつかの構成子は、異なる名前が同じクラス、プロパティーや個体を参照していると述べるために使用できるため、例えば、(エンティティーを改名するのではなく)次のように、自分のオントロジーに使用している名前を、インポートしたオントロジーに用いられている名前と関連付けることができます。
SameIndividual( :John otherOnt:JohnBrown ) SameIndividual( :Mary otherOnt:MaryBrown ) EquivalentClasses( :Adult otherOnt:Grownup ) EquivalentObjectProperties( :hasChild otherOnt:child ) EquivalentDataProperties( :hasAge otherOnt:age )
<rdf:Description rdf:about="John"> <owl:sameAs rdf:resource="&otherOnt;JohnBrown"/> </rdf:Description> <rdf:Description rdf:about="Mary"> <owl:sameAs rdf:resource="&otherOnt;MaryBrown"/> </rdf:Description> <owl:Class rdf:about="Adult"> <owl:equivalentClass rdf:resource="&otherOnt;Grownup"/> </owl:Class> <owl:DatatypeProperty rdf:about="hasAge"> <owl:equivalentProperty rdf:resource="&otherOnt;age"/> </owl:DatatypeProperty> <owl:Class rdf:about="Adult"> <owl:equivalentClass rdf:resource="&otherOnt;Grownup"/> </owl:Class>
:Mary owl:sameAs otherOnt:MaryBrown . :John owl:sameAs otherOnt:JohnBrown . :Adult owl:equivalentClass otherOnt:Grownup . :hasChild owl:equivalentProperty otherOnt:child . :hasAge owl:equivalentProperty otherOnt:age .
SameIndividual: John, otherOnt:JohnBrown SameIndividual: Mary, otherOnt:MaryBrown EquivalentClasses: Adult, otherOnt:Grownup EquivalentProperties: hasChild, otherOnt:child EquivalentProperties: hasAge, otherOnt:age
<SameIndividual> <NamedIndividual IRI="John"/> <NamedIndividual abbreviatedIRI="otherOnt:JohnBrown"/> </SameIndividual> <SameIndividual> <NamedIndividual IRI="Mary"/> <NamedIndividual abbreviatedIRI="otherOnt:MaryBrown"/> </SameIndividual> <EquivalentClasses> <Class IRI="Adult"/> <Class abbreviatedIRI="otherOnt:Grownup"/> </EquivalentClasses> <EquivalentObjectProperties> <ObjectProperty IRI="hasChild"/> <ObjectProperty abbreviatedIRI="otherOnt:child"/> </EquivalentObjectProperties> <EquivalentDataProperties> <DataProperty IRI="hasAge"/> <DataProperty abbreviatedIRI="otherOnt:age"/> </EquivalentDataProperties>
オントロジーの管理に役立つように、OWLには、宣言という考えがあります。基本的な考え方は、クラス、プロパティーや個体はオントロジーで宣言すべきであり、その後で、それをそのオントロジーやそのオントロジーをインポートするオントロジーで使用できるというものです。
マンチェスター構文では、宣言は暗示的です。クラス、プロパティー、個体に関する情報を提供する構成子は、必要に応じて、そのクラス、プロパティー、個体を暗示的に宣言します。それ以外の構文には、明示的な宣言があります。
Declaration( NamedIndividual( :John ) ) Declaration( Class( :Person ) ) Declaration( ObjectProperty( :hasWife ) ) Declaration( DataProperty( :hasAge ) )
<owl:NamedIndividual rdf:about="John"/> <owl:Class rdf:about="Person"/> <owl:ObjectProperty rdf:about="hasWife"/> <owl:DatatypeProperty rdf:about="hasAge"/>
:John rdf:type owl:NamedIndividual . :Person rdf:type owl:Class . :hasWife rdf:type owl:ObjectProperty . :hasAge rdf:type owl:DatatypeProperty .
Individual: John Class: Person ObjectProperty: hasWife DataProperty: hasAge
<Declaration> <NamedIndividual IRI="John"/> </Declaration> <Declaration> <Class IRI="Person"/> </Declaration> <Declaration> <ObjectProperty IRI="hasWife"/> </Declaration> <Declaration> <DataProperty IRI="hasAge"/> </Declaration>
しかし、IRIは、異なるエンティティーの型(例えば、個体とクラスの両方)を同時に指すことができます。一定量のメタモデリングが可能となるように「パニング」(punning)と呼ばれるこの性能を導入しました。これに関する例は、9項で示します。さらに、OWL 2では、名前を利用したり再利用したりする際には、ある原理原則が必要です。より可読性の高い構文を実現するため、また、その他の技術的な理由により、OWL 2 DLは、1つ以上のプロパティー・タイプ(オブジェクト、データ型またはアノテーション・プロパティー)で名前が使われておらず、IRIがクラスとデータ型の両方を指すことができない必要があります。そのうえ、OWLでは、「組み込み」名(RDF、RDFS、および、様々な構文のOWLで使用されるものなど)を自由に用いることはできません。
OWL 2のオントロジーに意味を割り当てる方法には、ダイレクト・モデル理論セマンティクス[OWL 2 Direct Semantics]とRDFベースのセマンティクス[OWL 2 RDF-Based Semantics]と呼ばれる2つの選択肢があります。非公式には、「OWL 2 DL」という概念は、ダイレクト・セマンティクスを用いて解釈されたOWL 2オントロジーを指すために用いられ、RDFベースのセマンティクスを考慮する際には「OWL 2 Full」という概念が使用されます。OWL 2関数型構文ドキュメント[OWL 2 Specification]では、さらに、OWL 2 DLとして認められるためにOWL 2オントロジーが満たさなければならない条件をいくつかリストアップしています。
ダイレクト・モデル理論セマンティクス[OWL 2 Direct Semantics]は、記述論理[Description Logics]形式のOWL 2に意味を提供します。RDFベースのセマンティクス[OWL 2 RDF-Based Semantics]は、RDFS[RDF Semantics]のためのセマンティクスの拡張であり、OWL 2オントロジーのRDFグラフとしての表示に基づいています。
オントロジーを考えるときに、これらの2つのセマンティクスの違いは、一般的には、かなり小さいです。実際に、OWL 2 DLオントロジーの場合、ダイレクト・セマンティクスを用いて出された推論は、RDFベースのセマンティクス下でも有効性を保っています。RDFベースのセマンティクスのドキュメント[OWL 2 RDF-Based Semantics]の7.2項の対応定理を参照してください。2つの主な違いは、ダイレクト・モデル理論セマンティクス下ではアノテーションは形式的な意味を持っておらず、RDFベースのセマンティクス下ではRDFの宇宙観から生じるいくつかの追加の推論があります。
概念的に、OWL 2 DLとOWL 2 Fullの違いを、次の2通りに考えることができます。
もちろん、2つのセマンティクスは一緒に設計されたため、互いに影響を及ぼしました。例えば、OWL 2の1つの設計目標は、OWL 2 DLをOWL 2 Fullに構文上近づける(つまり、より多くのRDFグラフ/OWL 2 Fullオントロジーが、正当なOWL 2 DLオントロジーになるようにする)ことでした。これは、OWL 2へのいわゆるパニングの組み込み(例えば、クラスと個体の両方の名前と同じIRIとして用いた)につながりました。そのような用法の例は下記にあり、ジョンが父親(Father)であり、父親は社会的役割(SocialRole)あると述べています。
ClassAssertion( :Father :John ) ClassAssertion( :SocialRole :Father )
<Father rdf:about="John"/> <SocialRole rdf:about="Father"/>
:John rdf:type :Father . :Father rdf:type :SocialRole .
Individual: John Types: Father Individual: Father Types: SocialRole
<ClassAssertion> <Class IRI="Father"/> <NamedIndividual IRI="John"/> </ClassAssertion> <ClassAssertion> <Class IRI="SocialRole"/> <NamedIndividual IRI="Father"/> </ClassAssertion>
最初のステートメントでは父親がクラスとして用いられており、2番目ステートメントでは個体として用いられていることに注意してください。その意味で、社会的な役割は、父親というクラスのメタクラスとして機能します。
OWL 1では、これらの2つのステートメントを含むドキュメントは、OWL 1 DLドキュメントではなく、OWL 1 Fullドキュメントでしょう。しかし、OWL 2 DLでは、これが可能です。もっとも、OWL 2 DLのダイレクト・モデル理論セマンティクスが、クラスの父親と個体の父親を同じIRIに対する2つの異なる見方と理解する(つまり、まるでそれらが異なっているかのように意味的に解釈する)ことによって、これに対応することに注意しなければなりません。
OWL 2は、OWL 2 DLとOWL 2 Fullに加え、3つのプロファイルを定めています。一般的に、OWL 2は、非常に表現力のある言語(コンピュータ上、そして、ユーザにとって)であるため、実装し、連携するのが難しい場合があります。これらの追加プロフィールは、さまざまなアプリケーションにとって分かりやすいOWL 2のサブセットとなるように設計されています。OWL 2 DLのように、コンピュータに関する課題が、これらのプロファイルの主要な要件(そして、それらはすべて、既存技術を考えると、強力なスケーラビリティにより、はるかに実装しやすい)ですが、優れたコンピュータ特性を有するOWL 2のサブセットが多く存在しています。選択したOWL 2プロファイルには、既にかなりのユーザ・コミュニティがあることが確認されており、関与していないものも他にいくつかあるものの、もっと出現することが予想されます。[OWL 2 Profiles]ドキュメントは、追加プロファイルを指定するための分かりやすいテンプレートを提供しています。
スケーラブルな推論を確保するため、既存のプロファイルは、表現の豊かさに関するいくつかの制限を共有しています。これらの構成子が推論を複雑化し、モデル化には極めてまれにしか必要ではないことが分かっているため、それらでは一般的に、論理否定と論理和を認められていません。例えば、どのプロファイルにおいても、すべての人が男性である、または、女性であると指定することはできません。より詳細なプロファイルのモデル化制限については、個々のプロファイルに関する項で扱っています。
我々は、各プロファイルとその設計原理について議論し、どのプロファイルを扱うかを選択する際の案内をユーザに提供します。この議論が包括的なものではなく、包括的であるはずもないことに留意してください。決定の要素は、利用可能なツールと、それがどのようにシステムや作業フローの残りの部分と適合するかに基づかなければなりません。
概して、様々なプロファイル間に包含関係が存在することで、構文上異なるプロファイルを区別できます。例えば、OWL 2 DLはOWL 2 Fullの構文の断片であり、OWL 2 QLはOWL 2 DL(したがって、OWL 2 Full)の構文の断片であると見ることができます。以下のプロファイルは、どれも別のプロファイルのサブセットではありません。理想的には、同じ結果を導き出すサブプロファイル上のスーパープロファイルに適合する推論システム(または、その他のツール)を使用できます。OWL 2 DLと関連のあるOWL 2 ELとOWL 2 QLのプロファイルの場合、すべての適合OWL 2 DL推論システムは、OWL 2 ELとOWL 2 QLの推論システムである(しかし、OWL 2 DL推論システムは、より一般的なケースに合わせて調整されているため、性能が異なるかもしれない)という原則が成り立ちます。
OWL 2 ELの扱いは、OWL 2 DLの扱いとかなり同じです。クラス式をsubClassOfステートメントの両側で用い、そのような関係を推論することも可能です。多くの大規模なクラス式指向のオントロジーでは、少しの簡素化を行うだけで、OWL 2 ELオントロジーを入手し、元のオントロジーの意味のほとんどを保存できます。
OWL 2 ELは、SNOMED-CTや、NCIシソーラスや、Galenなどの大規模なバイオヘルスのオントロジーを念頭において設計されています。このようなオントロジーに共通する特徴には、複雑な構造の記述(例えば、身体の部分について、それがどのような部分を含み、どのような部分に含まれているかの観点、または、部分―下位部分関係に沿った病気の伝播の観点で定義する)、膨大な数のクラス、用語を管理するための分類の多用、結果として得られた用語の大量データへの応用が含まれます。したがって、OWL 2 ELには比較的表現力のあるクラス式言語が存在しており、公理における使用方法に制限がありません。これは、かなり表現力のあるプロパティー式も有しており、プロパティー連鎖は含むものの、逆は除外されています。
言うまでもなく、OWL 2 ELの実際的な使用は、バイオヘルスの定義域に限られてはいません。他のプロファイルのように、OWL 2 ELは、定義域には依存しません。しかし、OWL 2 ELは、構造的に複雑なオブジェクトの認識が定義域とアプリケーションに必要な場合に優れています。このような定義域には、システム構成、製品目録、多くの科学的な定義域が含まれます。
OWL 2 ELでは、論理否定と論理和以外にも、プロパティーの全称量化は許されていません。したがって、「金持ちの子供はみんな金持ちである」のような命題を述べることはできません。さらに、すべての種類の役割の逆が利用できるわけではないないため、たとえば、parentOfとchildOfが互いに逆であるということを指定する方法はありません。
ELという頭字語は、プロファイルの基礎が、記述論理[EL++]のいわゆるELファミリー(主に変数の特称量化を提供する言語)にあることを反映しています。
次は、OWL 2 ELで利用できる典型的なモデル化機能のいくつかを用いた例です。
SubClassOf( :Father ObjectIntersectionOf( :Man :Parent ) ) EquivalentClasses( :Parent ObjectSomeValuesFrom( :hasChild :Person ) ) EquivalentClasses( :NarcisticPerson ObjectHasSelf( :loves ) ) DisjointClasses( :Mother :Father :YoungChild ) SubObjectPropertyOf( ObjectPropertyChain( :hasFather :hasBrother ) :hasUncle ) NegativeObjectPropertyAssertion( :hasDaughter :Bill :Susan )
<owl:Class rdf:about="Father"> <rdfs:subClassOf> <owl:Class> <owl:intersectionOf rdf:parseType="Collection"> <owl:Class rdf:about="Man"/> <owl:Class rdf:about="Parent"/> </owl:intersectionOf> </owl:Class> </rdfs:subClassOf> </owl:Class> <owl:Class rdf:about="Parent"> <owl:equivalentClass> <owl:Restriction> <owl:onProperty rdf:about="hasChild"/> <owl:someValuesFrom rdf:resource="Person"/> </owl:Restriction> </owl:equivalentClass> </owl:Class> <owl:Class rdf:about="NarcisticPerson"> <owl:equivalentClass> <owl:Restriction> <owl:onProperty rdf:resource="loves"/> <owl:hasSelf rdf:datatype="&xsd;boolean"> true </owl:hasSelf> </owl:Restriction> </owl:equivalentClass> </owl:Class> <owl:AllDisjointClasses> <owl:members rdf:parseType="Collection"> <owl:Class rdf:about="Mother"/> <owl:Class rdf:about="Father"/> <owl:Class rdf:about="YoungChild"/> </owl:members> </owl:AllDisjointClasses> <rdf:Description rdf:about="hasUncle"> <owl:propertyChainAxiom rdf:parseType="Collection"> <owl:ObjectProperty rdf:about="hasFather"/> <owl:ObjectProperty rdf:about="hasBrother"/> </owl:propertyChainAxiom> </rdf:Description> <owl:NegativePropertyAssertion> <owl:sourceIndividual rdf:resource="Bill"/> <owl:assertionProperty rdf:resource="hasDaughter"/> <owl:targetIndividual rdf:resource="Susan"/> </owl:NegativePropertyAssertion>
:Father rdfs:subClassOf [ rdf:type owl:Class ; owl:intersectionOf ( :Man :Parent ) ] . :Parent owl:equivalentClass [ rdf:type owl:Restriction ; owl:onProperty :hasChild ; owl:someValuesFrom :Person ] . :NarcisticPerson owl:equivalentClass [ rdf:type owl:Restriction ; owl:onProperty :loves ; owl:hasSelf true ] . [] rdf:type owl:AllDisjointClasses ; owl:members ( :Mother :Father :YoungChild ) . :hasUncle owl:propertyChainAxiom ( :hasFather :hasBrother ) . [] rdf:type owl:NegativePropertyAssertion ; owl:sourceIndividual :Bill ; owl:assertionProperty :hasDaughter ; owl:targetIndividual :Susan .
Class: Father SubClassOf: Man and Parent Class: Parent EquivalentTo: hasChild some Person Class: NarcisticPerson EquivalentTo: loves Self DisjointClasses: Mother, Father, YoungChild ObjectProperty: hasUncle SubPropertyChain: hasFather o hasBrother Individual: Bill Facts: not hasDaughter Susan
<SubClassOf> <Class IRI="Father"/> <ObjectIntersectionOf> <Class IRI="Man"/> <Class IRI="Parent"/> </ObjectIntersectionOf> </SubClassOf> <EquivalentClasses> <Class IRI="Parent"/> <ObjectSomeValuesFrom> <ObjectProperty IRI="hasChild"/> <Class IRI="Person"/> </ObjectSomeValuesFrom> </EquivalentClasses> <EquivalentClasses> <Class IRI="NarcisticPerson"/> <ObjectHasSelf> <ObjectProperty IRI="loves"/> </ObjectHasSelf> </EquivalentClasses> <DisjointClasses> <Class IRI="Father"/> <Class IRI="Mother"/> <Class IRI="YoungChild"/> </DisjointClasses> <SubObjectPropertyOf> <ObjectPropertyChain> <ObjectProperty IRI="hasFather"/> <ObjectProperty IRI="hasBrother"/> </ObjectPropertyChain> <ObjectProperty IRI="hasUncle"/> </SubObjectPropertyOf> <NegativeObjectPropertyAssertion> <ObjectProperty IRI="hasDaughter"/> <NamedIndividual IRI="Bill"/> <NamedIndividual IRI="Susan"/> </NegativeObjectPropertyAssertion>
OWL 2 QLは、標準的なリレーショナル・データベース技術(例えば、SQL)を用いて、クラス公理の観点でクエリを拡張するだけで実現できます。これは、RDBMSと密接に統合可能で、その強力な実装とマルチユーザ機能の恩恵を受けられることを意味します。さらに、「データに触れる」必要がないため、実際に翻訳/前処理レイヤーとして実装できます。それは、実体関連図とUML図(少なくとも関数制限があるもの)の重要な機能を表現力豊かに表すことができます。したがって、データベース・スキーマの表現と、クエリの書き換えによるそのスキーマの統合に適しています。その結果、ユーザは図に基づいた構文を好むかもしれませんが、高度なデータベース・スキーマ言語としても直接使用できます。
OWL 2 QLは、逆プロパティーやサブプロパティー階層のような、RDFSとその小さな拡張において一般的に用いられる機能の多くも取り入れています。OWL 2 QLは、クラス公理を非対称的に制限します。すなわち、スーパークラスとして使用できないサブクラスとして構成子を使用できます。
構成子の中でも、とりわけOWL 2 QLでは、クラス式に対する役割の特称量化は許されていません。すなわち、すべての人には親がいるけれども、すべての人に女性の親がいるとは限らないと述べることができます。さらに、プロパティー連鎖公理はサポオートされていません。
QLという頭字語は、クエリを標準的なリレーショナル型クエリ言語[DL-Lite]に書き換えることによって、このプロファイルで回答を行うクエリを実装できるという事実を反映しています。
次は、OWL 2 QLで利用可能な典型的なモデル化機能のいくつかを用いた例です。最初の公理は、すべての子供のいない人は、親という一人称を持っていない人であると述べています。
SubClassOf( :ChildlessPerson ObjectIntersectionOf( :Person ObjectComplementOf( ObjectSomeValuesFrom( ObjectInverseOf( :hasParent ) owl:Thing ) ) ) ) DisjointClasses( :Mother :Father :YoungChild ) DisjointObjectProperties( :hasSon :hasDaughter ) SubObjectPropertyOf( :hasFather :hasParent )
<owl:Class rdf:about="ChildlessPerson"> <rdfs:subClassOf> <owl:Class> <owl:intersectionOf rdf:parseType="Collection"> <owl:Class rdf:about="Person"/> <owl:Class> <owl:complementOf> <owl:Restriction> <owl:onProperty> <owl:ObjectProperty> <owl:inverseOf rdf:resource="hasParent"/> </owl:ObjectProperty> </owl:onProperty> <owl:someValuesFrom rdf:resource="Person"/> </owl:Restriction> </owl:complementOf> </owl:Class> </owl:intersectionOf> </owl:Class> </rdfs:subClassOf> </owl:Class> <owl:AllDisjointClasses> <owl:members rdf:parseType="Collection"> <owl:Class rdf:about="Mother"/> <owl:Class rdf:about="Father"/> <owl:Class rdf:about="YoungChild"/> </owl:members> </owl:AllDisjointClasses> <owl:ObjectProperty rdf:about="hasSon"> <owl:propertyDisjointWith rdf:resource="hasDaughter"/> </owl:ObjectProperty> <owl:ObjectProperty rdf:about="hasFather"> <rdfs:subPropertyOf rdf:resource="hasParent"/> </owl:ObjectProperty>
:ChildlessPerson owl:subClassOf [ rdf:type owl:Class ; owl:intersectionOf ( :Person [ owl:complementOf [ rdf:type owl:Restriction ; owl:onProperty [ owl:inverseOf :hasParent ] ; owl:someValuesFrom owl:Thing ] ] ) ] . [] rdf:type owl:AllDisjointClasses ; owl:members ( :Mother :Father :YoungChild ) . :hasSon owl:propertyDisjointWith :hasDaughter. :hasFather rdfs:subPropertyOf :hasParent.
Class: ChildlessPerson SubClassOf: Person and not inverse hasParent some owl:Thing DisjointClasses: Mother, Father, YoungChild DisjointProperties: hasSon, hasDaughter ObjectProperty: hasFather SubPropertyOf: hasParent
<SubClassOf> <Class IRI="ChildlessPerson"/> <ObjectIntersectionOf> <Class IRI="Person"/> <ObjectComplementOf> <ObjectSomeValuesFrom> <ObjectInverseOf> <ObjectProperty IRI="hasParent"/> </ObjectInverseOf> <Class abbreviatedIRI="owl:Thing"/> </ObjectSomeValuesFrom> </ObjectComplementOf> </ObjectIntersectionOf> </SubClassOf> <DisjointClasses> <Class IRI="Father"/> <Class IRI="Mother"/> <Class IRI="YoungChild"/> </DisjointClasses> <DisjointObjectProperties> <ObjectProperty IRI="hasSon"/> <ObjectProperty IRI="hasDaughter"/> </DisjointObjectProperties> <SubObjectPropertyOf> <ObjectProperty IRI="hasFather"/> <ObjectProperty IRI="hasParent"/> </SubObjectPropertyOf>
OWL 2 RLプロファイルは、表現力をあまり犠牲にすることなく、スケーラブルな推論を必要とするアプリケーションを対象としています。これは、言語の完全な表現力と効率とを交換できるOWL 2アプリケーションと、OWL 2の表現力を追加する必要があるRDF(S)アプリケーションの両方に対応するように作られています。これは、規則ベースの技術を用いた実装が可能なOWL 2の構文上のサブセットを定義し、そのような実装の基礎として使用できる一次含意の形でOWL 2 RDFベースのセマンティクスの部分的な公理化を示すことによって達成されます。
OWL 2 RLの適切な規則ベースの実装は、任意のRDFグラフと一緒に使用できます。その結果、OWL 2 RLは、特に規則を追加してデータを操作しなければならないときに、RDFデータを拡充するのに理想的です。しかし、モデル化の観点では、これは、クラス式の扱いからかけ離れてしまいます。OWL 2 RLでは、スーパークラスの式で未知の個体に関して(容易に)述べることは確実にできません(この制限は、規則の性質から生じる)。OWL 2 QLと比べて、OWL 2 RLは、データを既に操作してRDFにし、それをRDFとして扱う場合にうまく機能します。
構成子の中でも、とりわけOWL 2 RLでは、個体の存在が別の個体の存在を強制するようなステートメントは許されていません。例えば、「すべての人には親がいる」というステートメントは、OWL RLでは表現できません。
OWL 2 RLは、クラス公理を非対称的に制限します。すなわち、スーパークラスとして使用できないサブクラスとして構成子を使用できます。
RLという頭字語は、標準的な規則言語[DLP]を用いることで、このプロファイルの推論を実装できるという事実を反映しています。
次の例では、OWL 2 RLで利用可能な典型的なモデル化機能のいくつかを用いています。最初の(やや不自然な)公理は、女性であるメアリー、ビル、メグのそれぞれに関し、彼女は最大1人の子供を持つ親であり、彼女のすべての子供(彼女に子供がいれば)は女性であるということが成立すると述べています。
SubClassOf( ObjectIntersectionOf( ObjectOneOf( :Mary :Bill :Meg ) :Female ) ObjectIntersectionOf( :Parent ObjectMaxCardinality( 1 :hasChild ) ObjectAllValuesFrom( :hasChild :Female ) ) ) DisjointClasses( :Mother :Father :YoungChild ) SubObjectPropertyOf( ObjectPropertyChain( :hasFather :hasBrother ) :hasUncle )
<owl:Class> <owl:intersectionOf rdf:parseType="Collection"> <owl:Class> <owl:oneOf rdf:parseType="Collection"> <rdf:Description rdf:about="Mary"/> <rdf:Description rdf:about="Bill"/> <rdf:Description rdf:about="Meg"/> </owl:oneOf> </owl:Class> <owl:Class rdf:about="Female"/> </owl:intersectionOf> <rdfs:subClassOf> <owl:Class> <owl:intersectionOf rdf:parseType="Collection"> <owl:Class rdf:about="Parent"/> <owl:Restriction> <owl:maxCardinality rdf:datatype="&xsd;nonNegativeInteger"> 2 </owl:maxCardinality> <owl:onProperty rdf:resource="hasChild"/> </owl:Restriction> <owl:Restriction> <owl:onProperty rdf:resource="hasChild"/> <owl:allValuesFrom rdf:resource="Female"/> </owl:Restriction> </owl:intersectionOf> </owl:Class> </rdfs:subClassOf> </owl:Class> <owl:AllDisjointClasses> <owl:members rdf:parseType="Collection"> <owl:Class rdf:about="Mother"/> <owl:Class rdf:about="Father"/> <owl:Class rdf:about="YoungChild"/> </owl:members> </owl:AllDisjointClasses> <rdf:Description rdf:about="hasUncle"> <owl:propertyChainAxiom rdf:parseType="Collection"> <owl:ObjectProperty rdf:about="hasFather"/> <owl:ObjectProperty rdf:about="hasBrother"/> </owl:propertyChainAxiom> </rdf:Description>
[] rdf:type owl:Class ; owl:intersectionOf ( [ rdf:type owl:Class ; owl:oneOf ( :Mary :Bill :Meg ) ] :Female ) ; rdfs:subClassOf [ rdf:type owl:Class ; owl:intersectionOf ( :Parent [ rdf:type owl:Restriction ; owl:maxCardinality "1"^^xsd:nonNegativeInteger ; owl:onProperty :hasChild ] [ rdf:type owl:Restriction ; owl:onProperty :hasChild ; owl:allValuesFrom :Female ] ) ] . [] rdf:type owl:AllDisjointClasses ; owl:members ( :Mother :Father :YoungChild ) . :hasUncle owl:propertyChainAxiom ( :hasFather :hasBrother ) .
Class: X SubClassOf: Parent and hasChild max 1 and hasChild only Female Class: X EquivalentTo: {Mary, Bill, Meg} and Female DisjointClasses: Mother, Father, YoungChild ObjectProperty: hasUncle SubPropertyChain: hasFather o hasBrother
<SubClassOf> <ObjectIntersectionOf> <ObjectOneOf> <NamedIndividual IRI="Mary"/> <NamedIndividual IRI="Bill"/> <NamedIndividual IRI="Meg"/> </ObjectOneOf> <Class IRI="Female"/> </ObjectIntersectionOf> <ObjectIntersectionOf> <Class IRI="Parent"/> <ObjectMaxCardinality cardinality="1"> <ObjectProperty IRI="hasChild"/> </ObjectMaxCardinality> <ObjectAllValuesFrom> <ObjectProperty IRI="hasChild"/> <Class IRI="Female"/> </ObjectAllValuesFrom> </ObjectIntersectionOf> </SubClassOf> <DisjointClasses> <Class IRI="Father"/> <Class IRI="Mother"/> <Class IRI="YoungChild"/> </DisjointClasses> <SubObjectPropertyOf> <ObjectPropertyChain> <ObjectProperty IRI="hasFather"/> <ObjectProperty IRI="hasBrother"/> </ObjectPropertyChain> <ObjectProperty IRI="hasUncle"/> </SubObjectPropertyOf>
OWLオントロジーを扱うためには、ツールのサポートは不可欠です。基本的に、オントロジーのライフ・サイクルの2つの主要な段階に対応した2種類のツールがあります。オントロジー・エディタは、オントロジーを作成、編集するために用いられ、推論システムは、オントロジーにクエリを実行して暗黙知を得るために用いられます。言い換えれば、これは、問題のステートメントがオントロジーにおいて論理的帰結であるか否かを決定します。
現在最も広く使用されているOWLエディタは、スタンフォード大学で開発された無料オープン・ソースの編集フレームワークであるProtégéです。オープンなプラグイン構造により、特殊用途のオントロジー編集コンポーネントの統合が容易に可能になります。他のエディタには、TopQuadrantの市販のTopBraid Composerやオープン・ソース・システムであるSWOOPおよびNeOn-Toolkitがあります。
推論機能のサポート範囲が異なるOWL DL用の推論システムがいくつかあります。これらの一部は、OWL 2への適合化が現在計画されており、対応する実装を進めています。テスト・スイート・ステータスのドキュメントでは、以下で述べる推論システムの一部が、どの範囲テストケースに準拠しているかを記述しています。
OWL DLの推論システムの場合、最も有名なシステムは、マンチェスター大学のFact++、オックスフォード大学コンピューティング研究所のHermit、Clark & Parsia, LLCのPellet、およびレーサー・システムズのRacerProです。
OWL DLの完全なサポートを目指している汎用推論システムのほかに、OWLの扱いやすいプロファイルに適合させた推論システムがあります。ドレスデン工科大学のCELは、OWL ELをサポートしています。ローマ・ラ・サピエンツァ大学のQuOntoは、OWL QLをサポートしています。ORACLE 11gは、OWL RLをサポートしています。
オープン・ソースのOWL APIは、OWLに関する現在最も重要な開発ツールとしてかなり大きな役割を果たしています。
このドキュメントが作成された時点でいくつかのOWLツールが開発中であり、したがって、現在の概要は、最新の概要ではなく、この開発のスナップショットであると考えるべきと言わなければなりません。OWLツールの詳細リストは、semanticweb.orgとESW-Wikiにあります。
この短い入門では、OWLの表面をなでることしかできません。ウェブで探せば、OWLとOWLツールの使い方に関すより長く、より詳細なチュートリアルを多く発見できます。これらのドキュメントを読んだり、OWLオントロジーを構築するためにツールを用いることが、OWLに関する実用的な知識を得るには、おそらく最も良い方法です。OWLの基礎をもっと学ぶために、最初に、[FOST]という教科書を読み、次に、そこで引用されている原著を読むことをお勧めします。
また、この短い入門はOWLの規範的な定義ではありません。OWL構文の規範的な定義と、各OWL構成子の意味に関する参考情報は、OWL 2構造仕様ドキュメントおよび関数型構文ドキュメント[OWL 2 Specification]にあります。
OWL 2 クィック・リファレンス・ガイド[OWL 2 Quick Guide]は、特定の言語機能の情報を探す際の参考として便利です。
より形式的なドキュメントに興味がある場合は、OWL 2の形式的な意味は、OWL 2セマンティクス・ドキュメント[OWL 2 Direct Semantics] [OWL 2 RDF-Based Semantics]にあるかもしれません。
OWL構文とRDFトリプルとの間のマッピングは、OWL 2 RDFグラフへのマッピングというドキュメント[OWL 2 RDF Mapping]にあります。
ここで、完全なサンプルOWLオントロジーを掲載します。オントロジーの原理は、それが用いるトップレベルの表現力を有する機能によって順序付けられています。さらに、最初にオントロジーおよび宣言情報、その後でプロパティーに関する情報、その次にクラスとデータ型、そして、次に個体という一般的な順序に従います。
Prefix(:=<http://example.com/owl/families/>) Prefix(otherOnt:=<http://example.org/otherOntologies/families/>) Prefix(xsd:=<http://www.w3.org/2001/XMLSchema#>) Prefix(owl:=<http://www.w3.org/2002/07/owl#>) Ontology(<http://example.com/owl/families> Import( <http://example.org/otherOntologies/families.owl> ) Declaration( NamedIndividual( :John ) ) Declaration( NamedIndividual( :Mary ) ) Declaration( NamedIndividual( :Jim ) ) Declaration( NamedIndividual( :James ) ) Declaration( NamedIndividual( :Jack ) ) Declaration( NamedIndividual( :Bill ) ) Declaration( NamedIndividual( :Susan ) ) Declaration( Class( :Person ) ) AnnotationAssertion( rdfs:comment :Person "Represents the set of all people." ) Declaration( Class( :Woman ) ) Declaration( Class( :Parent ) ) Declaration( Class( :Father ) ) Declaration( Class( :Mother ) ) Declaration( Class( :SocialRole ) ) Declaration( Class( :Man ) ) Declaration( Class( :Teenager ) ) Declaration( Class( :ChildlessPerson ) ) Declaration( Class( :Human ) ) Declaration( Class( :Female ) ) Declaration( Class( :HappyPerson ) ) Declaration( Class( :JohnsChildren ) ) Declaration( Class( :NarcisticPerson ) ) Declaration( Class( :MyBirthdayGuests ) ) Declaration( Class( :Dead ) ) Declaration( Class( :Orphan ) ) Declaration( Class( :Adult ) ) Declaration( Class( :YoungChild ) ) Declaration( ObjectProperty( :hasWife ) ) Declaration( ObjectProperty( :hasChild ) ) Declaration( ObjectProperty( :hasDaughter ) ) Declaration( ObjectProperty( :loves ) ) Declaration( ObjectProperty( :hasSpouse ) ) Declaration( ObjectProperty( :hasGrandparent ) ) Declaration( ObjectProperty( :hasParent ) ) Declaration( ObjectProperty( :hasBrother ) ) Declaration( ObjectProperty( :hasUncle ) ) Declaration( ObjectProperty( :hasSon ) ) Declaration( ObjectProperty( :hasAncestor ) ) Declaration( ObjectProperty( :hasHusband ) ) Declaration( DataProperty( :hasAge ) ) Declaration( DataProperty( :hasSSN ) ) Declaration( Datatype( :personAge ) ) Declaration( Datatype( :majorAge ) ) Declaration( Datatype( :toddlerAge ) ) SubObjectPropertyOf( :hasWife :hasSpouse ) SubObjectPropertyOf( ObjectPropertyChain( :hasParent :hasParent ) :hasGrandparent ) SubObjectPropertyOf( ObjectPropertyChain( :hasFather :hasBrother ) :hasUncle ) SubObjectPropertyOf( :hasFather :hasParent ) EquivalentObjectProperties( :hasChild otherOnt:child ) InverseObjectProperties( :hasParent :hasChild ) EquivalentDataProperties( :hasAge otherOnt:age ) DisjointObjectProperties( :hasSon :hasDaughter ) ObjectPropertyDomain( :hasWife :Man ) ObjectPropertyRange( :hasWife :Woman ) DataPropertyDomain( :hasAge :Person ) DataPropertyRange( :hasAge xsd:nonNegativeInteger ) SymmetricObjectProperty( :hasSpouse ) AsymmetricObjectProperty( :hasChild ) DisjointObjectProperties( :hasParent :hasSpouse ) ReflexiveObjectProperty( :hasRelative ) IrreflexiveObjectProperty( :parentOf ) FunctionalObjectProperty( :hasHusband ) InverseFunctionalObjectProperty( :hasHusband ) TransitiveObjectProperty( :hasAncestor ) FunctionalDataProperty( :hasAge ) SubClassOf( :Woman :Person ) SubClassOf( :Mother :Woman ) SubClassOf( :Grandfather ObjectIntersectionOf( :Man :Parent ) ) SubClassOf( :Teenager DataSomeValuesFrom( :hasAge DatatypeRestriction( xsd:integer xsd:minExclusive "12"^^xsd:integer xsd:maxInclusive "19"^^xsd:integer ) ) ) SubClassOf( Annotation( rdfs:comment "States that every man is a person." ) :Man :Person ) SubClassOf( :Father ObjectIntersectionOf( :Man :Parent ) ) SubClassOf( :ChildlessPerson ObjectIntersectionOf( :Person ObjectComplementOf( ObjectSomeValuesFrom( ObjectInverseOf( :hasParent ) owl:Thing ) ) ) ) SubClassOf( ObjectIntersectionOf( ObjectOneOf( :Mary :Bill :Meg ) :Female ) ObjectIntersectionOf( :Parent ObjectMaxCardinality( 1 :hasChild ) ObjectAllValuesFrom( :hasChild :Female ) ) ) EquivalentClasses( :Person :Human ) EquivalentClasses( :Mother ObjectIntersectionOf( :Woman :Parent ) ) EquivalentClasses( :Parent ObjectUnionOf( :Mother :Father ) ) EquivalentClasses( :ChildlessPerson ObjectIntersectionOf( :Person ObjectComplementOf( :Parent ) ) ) EquivalentClasses( :Parent ObjectSomeValuesFrom( :hasChild :Person ) ) EquivalentClasses( :HappyPerson ObjectIntersectionOf( ObjectAllValuesFrom( :hasChild :HappyPerson ) ObjectSomeValuesFrom( :hasChild :HappyPerson ) ) ) EquivalentClasses( :JohnsChildren ObjectHasValue( :hasParent :John ) ) EquivalentClasses( :NarcisticPerson ObjectHasSelf( :loves ) ) EquivalentClasses( :MyBirthdayGuests ObjectOneOf( :Bill :John :Mary) ) EquivalentClasses( :Orphan ObjectAllValuesFrom( ObjectInverseOf( :hasChild ) :Dead ) ) EquivalentClasses( :Adult otherOnt:Grownup ) EquivalentClasses( :Parent ObjectSomeValuesFrom( :hasChild :Person ) ) DisjointClasses( :Woman :Man ) DisjointClasses( :Mother :Father :YoungChild ) HasKey( :Person () ( :hasSSN ) ) DatatypeDefinition( :personAge DatatypeRestriction( xsd:integer xsd:minInclusive "0"^^xsd:integer xsd:maxInclusive "150"^^xsd:integer ) ) DatatypeDefinition( :majorAge DataIntersectionOf( :personAge DataComplementOf( :minorAge ) ) ) DatatypeDefinition( :toddlerAge DataOneOf( "1"^^xsd:integer "2"^^xsd:integer ) ) ClassAssertion( :Person :Mary ) ClassAssertion( :Woman :Mary ) ClassAssertion( ObjectIntersectionOf( :Person ObjectComplementOf( :Parent ) ) :Jack ) ClassAssertion( ObjectMaxCardinality( 4 :hasChild :Parent ) :John ) ClassAssertion( ObjectMinCardinality( 2 :hasChild :Parent ) :John ) ClassAssertion( ObjectExactCardinality( 3 :hasChild :Parent ) :John ) ClassAssertion( ObjectExactCardinality( 5 :hasChild ) :John ) ClassAssertion( :Father :John ) ClassAssertion( :SocialRole :Father ) ObjectPropertyAssertion( :hasWife :John :Mary ) NegativeObjectPropertyAssertion( :hasWife :Bill :Mary ) NegativeObjectPropertyAssertion( :hasDaughter :Bill :Susan ) DataPropertyAssertion( :hasAge :John "51"^^xsd:integer ) NegativeDataPropertyAssertion( :hasAge :Jack "53"^^xsd:integer ) SameIndividual( :John :Jack ) SameIndividual( :John otherOnt:JohnBrown ) SameIndividual( :Mary otherOnt:MaryBrown ) DifferentIndividuals( :John :Bill ) )
<!DOCTYPE rdf:RDF [ <!ENTITY owl "http://www.w3.org/2002/07/owl#" > <!ENTITY xsd "http://www.w3.org/2001/XMLSchema#" > <!ENTITY rdfs "http://www.w3.org/2000/01/rdf-schema#" > <!ENTITY otherOnt "http://example.org/otherOntologies/families/" > ]> <rdf:RDF xml:base="http://example.com/owl/families/" xmlns="http://example.com/owl/families/" xmlns:otherOnt="http://example.org/otherOntologies/families/" xmlns:owl="http://www.w3.org/2002/07/owl#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:xsd="http://www.w3.org/2001/XMLSchema#"> <owl:Ontology rdf:about="http://example.com/owl/families"> <owl:imports rdf:resource="http://example.org/otherOntologies/families.owl" /> </owl:Ontology> <owl:ObjectProperty rdf:about="hasWife"> <rdfs:subPropertyOf rdf:resource="hasSpouse"/> <rdfs:domain rdf:resource="Man"/> <rdfs:range rdf:resource="Woman"/> </owl:ObjectProperty> <owl:ObjectProperty rdf:about="hasParent"> <owl:inverseOf rdf:resource="hasChild"/> <owl:propertyDisjointWith rdf:resource="hasSpouse"/> </owl:ObjectProperty> <owl:ObjectProperty rdf:about="hasSon"> <owl:propertyDisjointWith rdf:resource="hasDaughter"/> </owl:ObjectProperty> <owl:ObjectProperty rdf:about="hasFather"> <rdfs:subPropertyOf rdf:resource="hasParent"/> </owl:ObjectProperty> <owl:SymmetricProperty rdf:about="hasSpouse"/> <owl:AsymmetricProperty rdf:about="hasChild"/> <owl:ReflexiveProperty rdf:about="hasRelative"/> <owl:IrreflexiveProperty rdf:about="parentOf"/> <owl:FunctionalProperty rdf:about="hasHusband"/> <owl:InverseFunctionalProperty rdf:about="hasHusband"/> <owl:TransitiveProperty rdf:about="hasAncestor"/> <rdf:Description rdf:about="hasGrandparent"> <owl:propertyChainAxiom rdf:parseType="Collection"> <owl:ObjectProperty rdf:about="hasParent"/> <owl:ObjectProperty rdf:about="hasParent"/> </owl:propertyChainAxiom> </rdf:Description> <rdf:Description rdf:about="hasUncle"> <owl:propertyChainAxiom rdf:parseType="Collection"> <owl:ObjectProperty rdf:about="hasFather"/> <owl:ObjectProperty rdf:about="hasBrother"/> </owl:propertyChainAxiom> </rdf:Description> <owl:DatatypeProperty rdf:about="hasAge"> <rdfs:domain rdf:resource="Person"/> <rdfs:range rdfs:Datatype="http://www.w3.org/2001/XMLSchema#nonNegativeInteger"/> <owl:equivalentProperty rdf:resource="&otherOnt;age"/> </owl:DatatypeProperty> <owl:FunctionalProperty rdf:about="hasAge"/> <owl:Class rdf:about="Woman"> <rdfs:subClassOf rdf:resource="Person"/> </owl:Class> <owl:Class rdf:about="Mother"> <rdfs:subClassOf rdf:resource="Woman"/> <owl:equivalentClass> <owl:Class> <owl:intersectionOf rdf:parseType="Collection"> <owl:Class rdf:about="Woman"/> <owl:Class rdf:about="Parent"/> </owl:intersectionOf> </owl:Class> </owl:equivalentClass> </owl:Class> <owl:Class rdf:about="Person"> <rdfs:comment>Represents the set of all people.</rdfs:comment> <owl:equivalentClass rdf:resource="Human"/> <owl:hasKey rdf:parseType="Collection"> <owl:ObjectProperty rdf:about="hasSSN"/> </owl:hasKey> </owl:Class> <owl:Class rdf:about="Parent"> <owl:equivalentClass> <owl:Class> <owl:unionOf rdf:parseType="Collection"> <owl:Class rdf:about="Mother"/> <owl:Class rdf:about="Father"/> </owl:unionOf> </owl:Class> </owl:equivalentClass> <owl:equivalentClass> <owl:Restriction> <owl:onProperty rdf:resource="hasChild"/> <owl:someValuesFrom rdf:resource="Person"/> </owl:Restriction> </owl:equivalentClass> </owl:Class> <owl:Class rdf:about="ChildlessPerson"> <owl:equivalentClass> <owl:Class> <owl:intersectionOf rdf:parseType="Collection"> <owl:Class rdf:about="Person"/> <owl:Class> <owl:complementOf rdf:resource="Parent"/> </owl:Class> </owl:intersectionOf> </owl:Class> </owl:equivalentClass> </owl:Class> <owl:Class rdf:about="Grandfather"> <rdfs:subClassOf> <owl:Class> <owl:intersectionOf rdf:parseType="Collection"> <owl:Class rdf:about="Man"/> <owl:Class rdf:about="Parent"/> </owl:intersectionOf> </owl:Class> </rdfs:subClassOf> </owl:Class> <owl:Class rdf:about="HappyPerson"> <owl:equivalentClass> <owl:Class> <owl:intersectionOf rdf:parseType="Collection"> <owl:Restriction> <owl:onProperty rdf:resource="hasChild"/> <owl:allValuesFrom rdf:resource="HappyPerson"/> </owl:Restriction> <owl:Restriction> <owl:onProperty rdf:resource="hasChild"/> <owl:someValuesFrom rdf:resource="HappyPerson"/> </owl:Restriction> </owl:intersectionOf> </owl:Class> </owl:equivalentClass> </owl:Class> <owl:Class rdf:about="JohnsChildren"> <owl:equivalentClass> <owl:Restriction> <owl:onProperty rdf:resource="hasParent"/> <owl:hasValue rdf:resource="John"/> </owl:Restriction> </owl:equivalentClass> </owl:Class> <owl:Class rdf:about="NarcisticPerson"> <owl:equivalentClass> <owl:Restriction> <owl:onProperty rdf:resource="loves"/> <owl:hasSelf rdf:datatype="&xsd;boolean"> true </owl:hasSelf> </owl:Restriction> </owl:equivalentClass> </owl:Class> <owl:Class rdf:about="MyBirthdayGuests"> <owl:equivalentClass> <owl:Class> <owl:oneOf rdf:parseType="Collection"> <rdf:Description rdf:about="Bill"/> <rdf:Description rdf:about="John"/> <rdf:Description rdf:about="Mary"/> </owl:oneOf> </owl:Class> </owl:equivalentClass> </owl:Class> <owl:Class rdf:about="Orphan"> <owl:equivalentClass> <owl:Restriction> <owl:onProperty> <owl:ObjectProperty> <owl:inverseOf rdf:resource="hasChild"/> </owl:ObjectProperty> </owl:onProperty> <owl:Class rdf:resource="Dead"/> </owl:Restriction> </owl:equivalentClass> </owl:Class> <owl:Class rdf:about="Teenager"> <rdfs:subClassOf> <owl:Restriction> <owl:onProperty rdf:resource="hasAge"/> <owl:someValuesFrom> <rdfs:Datatype> <owl:onDataType rdf:resource="&xsd;integer"/> <owl:withRestrictions rdf:parseType="Collection"> <rdf:Description> <xsd:minExclusive rdf:datatype="&xsd;integer">12</xsd:minExclusive> </rdf:Description> <rdf:Description> <xsd:maxInclusive rdf:datatype="&xsd;integer">19</xsd:maxInclusive> </rdf:Description> </owl:withRestrictions> </rdfs:Datatype> </owl:someValuesFrom> </owl:Restriction> </rdfs:subClassOf> </owl:Class> <owl:Class rdf:about="Man"> <rdfs:subClassOf rdf:resource="Person"/> </owl:Class> <owl:Axiom> <owl:annotatedSource rdf:resource="Man"/> <owl:annotatedProperty rdf:resource="&rdfs;subClassOf"/> <owl:annotatedTarget rdf:resource="Person"/> <rdfs:comment>States that every man is a person.</rdfs:comment> </owl:Axiom> <owl:Class rdf:about="Adult"> <owl:equivalentClass rdf:resource="&otherOnt;Grownup"/> </owl:Class> <owl:Class rdf:about="Father"> <rdfs:subClassOf> <owl:Class> <owl:intersectionOf rdf:parseType="Collection"> <owl:Class rdf:about="Man"/> <owl:Class rdf:about="Parent"/> </owl:intersectionOf> </owl:Class> </rdfs:subClassOf> </owl:Class> <owl:Class rdf:about="ChildlessPerson"> <rdfs:subClassOf> <owl:Class> <owl:intersectionOf rdf:parseType="Collection"> <owl:Class rdf:about="Person"/> <owl:Class> <owl:complementOf> <owl:Restriction> <owl:onProperty> <owl:ObjectProperty> <owl:inverseOf rdf:resource="hasParent"/> </owl:ObjectProperty> </owl:onProperty> <owl:someValuesFrom rdf:resource="&owl;Thing"/> </owl:Restriction> </owl:complementOf> </owl:Class> </owl:intersectionOf> </owl:Class> </rdfs:subClassOf> </owl:Class> <owl:Class> <owl:intersectionOf rdf:parseType="Collection"> <owl:Class> <owl:oneOf rdf:parseType="Collection"> <rdf:Description rdf:about="Mary"/> <rdf:Description rdf:about="Bill"/> <rdf:Description rdf:about="Meg"/> </owl:oneOf> </owl:Class> <owl:Class rdf:about="Female"/> </owl:intersectionOf> <rdfs:subClassOf> <owl:Class> <owl:intersectionOf rdf:parseType="Collection"> <owl:Class rdf:about="Parent"/> <owl:Restriction> <owl:maxCardinality rdf:datatype="&xsd;nonNegativeInteger"> 2 </owl:maxCardinality> <owl:onProperty rdf:resource="hasChild"/> </owl:Restriction> <owl:Restriction> <owl:onProperty rdf:resource="hasChild"/> <owl:allValuesFrom rdf:resource="Female"/> </owl:Restriction> </owl:intersectionOf> </owl:Class> </rdfs:subClassOf> </owl:Class> <owl:AllDisjointClasses> <owl:members rdf:parseType="Collection"> <owl:Class rdf:about="Woman"/> <owl:Class rdf:about="Man"/> </owl:members> </owl:AllDisjointClasses> <owl:AllDisjointClasses> <owl:members rdf:parseType="Collection"> <owl:Class rdf:about="Mother"/> <owl:Class rdf:about="Father"/> <owl:Class rdf:about="YoungChild"/> </owl:members> </owl:AllDisjointClasses> <rdf:Description rdf:about="personAge"> <owl:equivalentClass> <rdfs:Datatype> <owl:onDatatype rdf:resource="http://www.w3.org/2001/XMLSchema#integer"/> <owl:withRestrictions rdf:parseType="Collection"> <rdf:Description> <xsd:minInclusive rdf:datatype="http://www.w3.org/2001/XMLSchema#integer">0</xsd:minInclusive> </rdf:Description> <rdf:Description> <xsd:maxInclusive rdf:datatype="http://www.w3.org/2001/XMLSchema#integer">150</xsd:maxInclusive> </rdf:Description> </owl:withRestrictions> </rdfs:Datatype> </owl:equivalentClass> </rdf:Description> <rdf:Description rdf:about="majorAge"> <owl:equivalentClass> <rdfs:Datatype> <owl:intersectionOf rdf:parseType="Collection"> <rdf:Description rdf:about="personAge"/> <rdfs:Datatype> <owl:datatypeComplementOf rdf:resource="minorAge"/> </rdfs:Datatype> </owl:intersectionOf> </rdfs:Datatype> </owl:equivalentClass> </rdf:Description> <rdf:Description rdf:about="toddlerAge"> <owl:equivalentClass> <rdfs:Datatype> <owl:oneOf> <rdf:Description> <rdf:first rdf:datatype="&xsd;integer">1</rdf:first> <rdf:rest> <rdf:Description> <rdf:first rdf:datatype="&xsd;integer">2</rdf:first> <rdf:rest rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#nil"/> </rdf:Description> </rdf:rest> </rdf:Description> </owl:oneOf> </rdfs:Datatype> </owl:equivalentClass> </rdf:Description> <Person rdf:about="Mary"> <rdf:type rdf:resource="Woman"/> <owl:sameAs rdf:resource="&otherOnt;MaryBrown"/> </Person> <owl:NamedIndividual rdf:about="James"> <owl:sameAs rdf:resource="Jim"/> </owl:NamedIndividual> <rdf:Description rdf:about="Jack"> <rdf:type> <owl:Class> <owl:intersectionOf rdf:parseType="Collection"> <owl:Class rdf:about="Person"/> <owl:Class> <owl:complementOf rdf:resource="Parent"/> </owl:Class> </owl:intersectionOf> </owl:Class> </rdf:type> </rdf:Description> <owl:NamedIndividual rdf:about="John"> <hasWife rdf:resource="Mary"/> <hasAge rdf:datatype="http://www.w3.org/2001/XMLSchema#integer">51</hasAge> <owl:differentFrom rdf:resource="Bill"/> <owl:sameAs rdf:resource="&otherOnt;JohnBrown"/> <rdf:type rdf:resource="Person"/> <rdf:type rdf:resource="Father"/> <rdf:type> <owl:Restriction> <owl:maxQualifiedCardinality rdf:datatype="&xsd;nonNegativeInteger"> 4 </owl:maxQualifiedCardinality> <owl:onProperty rdf:resource="hasChild"/> <owl:onClass rdf:resource="Parent"/> </owl:Restriction> </rdf:type> <rdf:type> <owl:Restriction> <owl:minQualifiedCardinality rdf:datatype="&xsd;nonNegativeInteger"> 2 </owl:minQualifiedCardinality> <owl:onProperty rdf:resource="hasChild"/> <owl:onClass rdf:resource="Parent"/> </owl:Restriction> </rdf:type> <rdf:type> <owl:Restriction> <owl:qualifiedCardinality rdf:datatype="&xsd;nonNegativeInteger"> 3 </owl:qualifiedCardinality> <owl:onProperty rdf:resource="hasChild"/> <owl:onClass rdf:resource="Parent"/> </owl:Restriction> </rdf:type> <rdf:type> <owl:Restriction> <owl:cardinality rdf:datatype="&xsd;nonNegativeInteger"> 5 </owl:cardinality> <owl:onProperty rdf:resource="hasChild"/> </owl:Restriction> </rdf:type> </owl:NamedIndividual> <SocialRole rdf:about="Father"/> <owl:NegativePropertyAssertion> <owl:sourceIndividual rdf:resource="Bill"/> <owl:assertionProperty rdf:resource="hasWife"/> <owl:targetIndividual rdf:resource="Mary"/> </owl:NegativePropertyAssertion> <owl:NegativePropertyAssertion> <owl:sourceIndividual rdf:resource="Jack"/> <owl:assertionProperty rdf:resource="hasAge"/> <owl:targetValue rdf:datatype="http://www.w3.org/2001/XMLSchema#integer">53</owl:targetValue> </owl:NegativePropertyAssertion> <owl:NegativePropertyAssertion> <owl:sourceIndividual rdf:resource="Bill"/> <owl:assertionProperty rdf:resource="hasDaughter"/> <owl:targetIndividual rdf:resource="Susan"/> </owl:NegativePropertyAssertion> </rdf:RDF>
@prefix : <http://example.com/owl/families/> . @prefix otherOnt: <http://example.org/otherOntologies/families/> . @prefix owl: <http://www.w3.org/2002/07/owl#> . @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . @prefix xsd: <http://www.w3.org/2001/XMLSchema#> . <http://example.com/owl/families> rdf:type owl:Ontology ; owl:imports <http://example.org/otherOntologies/families.owl> . :hasSpouse rdf:type owl:SymmetricProperty . :hasRelative rdf:type owl:ReflexiveProperty . :parentOf rdf:type owl:IrreflexiveProperty . :hasAncestor rdf:type owl:TransitiveProperty . :hasHusband rdf:type owl:FunctionalProperty . :hasHusband rdf:type owl:InverseFunctionalProperty . :hasWife rdf:type owl:ObjectProperty . :hasWife rdfs:domain :Man ; rdfs:range :Woman . :hasWife rdfs:subPropertyOf :hasSpouse . :hasSon owl:propertyDisjointWith :hasDaughter. :hasFather rdfs:subPropertyOf :hasParent. :hasParent owl:inverseOf :hasChild . :hasParent owl:propertyDisjointWith :hasSpouse . :hasGrandparent owl:propertyChainAxiom ( :hasParent :hasParent ) . :hasUncle owl:propertyChainAxiom ( :hasFather :hasBrother ) . :hasAge owl:equivalentProperty otherOnt:age . :hasAge rdf:type owl:DatatypeProperty . :hasAge rdf:type owl:FunctionalProperty .:hasAge rdfs:domain :Person ; rdfs:range xsd:nonNegativeInteger . :hasChild owl:equivalentProperty otherOnt:child .:hasChild rdf:type owl:AsymmetricProperty . :Woman rdfs:subClassOf :Person . :Mother rdfs:subClassOf :Woman . :Mother owl:equivalentClass [ rdf:type owl:Class ; owl:intersectionOf ( :Woman :Parent ) ] . :Person rdf:type owl:Class . :Person owl:equivalentClass :Human . :Person rdfs:comment "Represents the set of all people."^^xsd:string . :Person owl:hasKey ( :hasSSN ) . :Parent owl:equivalentClass [ rdf:type owl:Class ; owl:unionOf ( :Mother :Father ) ] . :Parent owl:equivalentClass [ rdf:type owl:Restriction ; owl:onProperty :hasChild ; owl:someValuesFrom :Person ] . :Grandfather rdfs:subClassOf [ rdf:type owl:Class ; owl:intersectionOf ( :Man :Parent ) ] . :HappyPerson owl:equivalentClass [ rdf:type owl:Class ; owl:intersectionOf ( [ rdf:type owl:Restriction ; owl:onProperty :hasChild ; owl:allValuesFrom :HappyPerson ] [ rdf:type owl:Restriction ; owl:onProperty :hasChild ; owl:someValuesFrom :HappyPerson ] ) ] . :JohnsChildren owl:equivalentClass [ rdf:type owl:Restriction ; owl:onProperty :hasParent ; owl:hasValue :John ] . :NarcisticPerson owl:equivalentClass [ rdf:type owl:Restriction ; owl:onProperty :loves ; owl:hasSelf "true"^^xsd:boolean . ] . :MyBirthdayGuests owl:equivalentClass [ rdf:type owl:Class ; owl:oneOf ( :Bill :John :Mary ) ] . :Orphan owl:equivalentClass [ rdf:type owl:Restriction ; owl:onProperty [ owl:inverseOf :hasChild ] ; owl:allValuesFrom :Dead ] . :Teenager rdfs:subClassOf [ rdf:type owl:Restriction ; owl:onProperty :hasAge ; owl:someValuesFrom [ rdf:type rdfs:Datatype ; owl:onDatatype xsd:integer ; owl:withRestrictions ( [ xsd:minExclusive "12"^^xsd:integer ] [ xsd:maxInclusive "19"^^xsd:integer ] ) ] ] . :Man rdfs:subClassOf :Person . [] rdf:type owl:Axiom ; owl:annotatedSource :Man ; owl:annotatedProperty rdfs:subClassOf ; owl:annotatedTarget :Person ; rdfs:comment "States that every man is a person."^^xsd:string . :Adult owl:equivalentClass otherOnt:Grownup . :Father rdfs:subClassOf [ rdf:type owl:Class ; owl:intersectionOf ( :Man :Parent ) ] . :ChildlessPerson owl:equivalentClass [ rdf:type owl:Class ; owl:intersectionOf ( :Person [ owl:complementOf :Parent ] ) ] . :ChildlessPerson owl:subClassOf [ rdf:type owl:Class ; owl:intersectionOf ( :Person [ owl:complementOf [ rdf:type owl:Restriction ; owl:onProperty [ owl:inverseOf :hasParent ] ; owl:someValuesFrom owl:Thing ] ] ) ] . [] rdf:type owl:Class ; owl:intersectionOf ( [ rdf:type owl:Class ; owl:oneOf ( :Mary :Bill :Meg ) ] :Female ) ; rdfs:subClassOf [ rdf:type owl:Class ; owl:intersectionOf ( :Parent [ rdf:type owl:Restriction ; owl:maxCardinality "1"^^xsd:nonNegativeInteger ; owl:onProperty :hasChild ] [ rdf:type owl:Restriction ; owl:onProperty :hasChild ; owl:allValuesFrom :Female ] ) ] . [] rdf:type owl:AllDisjointClasses ; owl:members ( :Mother :Father :YoungChild ) . [] rdf:type owl:AllDisjointClasses ; owl:members ( :Woman :Man ) . :personAge owl:equivalentClass [ rdf:type rdfs:Datatype; owl:onDatatype xsd:integer; owl:withRestrictions ( [ xsd:minInclusive "0"^^xsd:integer ] [ xsd:maxInclusive "150"^^xsd:integer ] ) ] . :majorAge owl:equivalentClass [ rdf:type rdfs:Datatype; owl:intersectionOf ( :personAge [ rdf:type rdfs:Datatype; owl:datatypeComplementOf :minorAge ] ) ] . :toddlerAge owl:equivalentClass [ rdf:type rdfs:Datatype; owl:oneOf ( "1"^^xsd:integer "2"^^xsd:integer ) ] . :Mary rdf:type :Person . :Mary rdf:type :Woman . :Mary owl:sameAs otherOnt:MaryBrown . :James owl:sameAs :Jim . :Jack rdf:type [ rdf:type owl:Class ; owl:intersectionOf ( :Person [ rdf:type owl:Class ; owl:complementOf :Parent ] ) ] . :John owl:sameAs otherOnt:JohnBrown . :John rdf:type owl:NamedIndividual . :John rdf:type :Father . :John :hasWife :Mary . :John owl:differentFrom :Bill . :John :hasAge 51 . :John rdf:type [ rdf:type owl:Restriction ; owl:maxQualifiedCardinality "4"^^xsd:nonNegativeInteger ; owl:onProperty :hasChild ; owl:onClass :Parent ] . :John rdf:type [ rdf:type owl:Restriction ; owl:minQualifiedCardinality "2"^^xsd:nonNegativeInteger ; owl:onProperty :hasChild ; owl:onClass :Parent ] . :John rdf:type [ rdf:type owl:Restriction ; owl:qualifiedCardinality "3"^^xsd:nonNegativeInteger ; owl:onProperty :hasChild ; owl:onClass :Parent ] . :John rdf:type [ rdf:type owl:Restriction ; owl:cardinality "5"^^xsd:nonNegativeInteger ; owl:onProperty :hasChild ] . :Father rdf:type :SocialRole . [] rdf:type owl:NegativePropertyAssertion ; owl:sourceIndividual :Bill ; owl:assertionProperty :hasWife ; owl:targetIndividual :Mary . [] rdf:type owl:NegativePropertyAssertion ; owl:sourceIndividual :Bill ; owl:assertionProperty :hasDaughter ; owl:targetIndividual :Susan . [] rdf:type owl:NegativePropertyAssertion ; owl:sourceIndividual :Jack ; owl:assertionProperty :hasAge ; owl:targetValue 53 .
Prefix: : <http://example.com/owl/families/> Prefix: xsd: <http://www.w3.org/2001/XMLSchema#>Prefix: owl: <http://www.w3.org/2002/07/owl#> Prefix: otherOnt: <http://example.org/otherOntologies/families/> Ontology: <http://example.com/owl/families> Import: <http://example.org/otherOntologies/families.owl> ObjectProperty: hasWife SubPropertyOf: hasSpouse Domain: Man Range: Woman ObjectProperty: hasParent InverseOf: hasChild ObjectProperty: hasSpouse Characteristics: Symmetric ObjectProperty: hasChild Characteristics: Asymmetric ObjectProperty: hasRelative Characteristics: Reflexive ObjectProperty: parentOf Characteristics: IrreflexiveObjectProperty: hasHusband Characteristics: Functional Characteristics: InverseFunctional ObjectProperty: hasAncestor Characteristics: Transitive ObjectProperty: hasGrandparent SubPropertyChain: hasParent o hasParent ObjectProperty: hasUncle SubPropertyChain: hasFather o hasBrother ObjectProperty: hasFather SubPropertyOf: hasParent ObjectProperty: hasBrother ObjectProperty: hasDaughter ObjectProperty: loves DisjointProperties: hasParent, hasSpouse DisjointProperties: hasSon, hasDaughter EquivalentProperties: hasChild, otherOnt:child EquivalentProperties: hasAge, otherOnt:age DataProperty: hasAge Domain: Person Range: xsd:nonNegativeInteger DataProperty: hasHusband Characteristics: Functional DataProperty: hasSSN Datatype: personAge EquivalentTo: integer[<= 0 , >= 150] Datatype: majorAge EquivalentTo: personAge and not minorAge Datatype: toddlerAge EquivalentTo: { 1, 2 } Datatype: minorAge Class: Woman SubClassOf: Person Class: Mother SubClassOf: Woman EquivalentTo: Woman and Parent Class: Person Annotations: rdfs:comment "Represents the set of all people." EquivalentTo: Human HasKey: hasSSN Class: Parent EquivalentTo: hasChild some Person EquivalentTo: Mother or Father Class: ChildlessPerson EquivalentTo: Person and not Parent SubClassOf: Person and not inverse hasParent some owl:Thing Class: Grandfather SubClassOf: Man and Parent Class: HappyPerson EquivalentTo: hasChild only Happy and hasChild some Happy Class: JohnsChildren EquivalentTo: hasParent value John Class: NarcisticPerson EquivalentTo: loves Self Class: Orphan EquivalentTo: inverse hasChild only Dead Class: Teenager SubClassOf: hasAge some integer[<= 13 , >= 19] Class: Man SubClassOf: Annotations: rdfs:comment "States that every man is a person." Person Class: MyBirthdayGuests EquivalentTo: { Bill, John, Mary } Class: Father SubClassOf: Man and Parent Class: X SubClassOf: Parent and hasChild max 1 and hasChild only Female EquivalentTo: {Mary, Bill, Meg} and Female Class: Dead Class: Father Class: Female Class: Happy Class: Human Class: SocialRole Class: YoungChild DisjointClasses: Mother, Father, YoungChild DisjointClasses: Woman, Man EquivalentClasses: Adult, otherOnt:Grownup Individual: Mary Types: Person Types: Woman Individual: Jack Types: Person and not Parent Individual: John Types: Father Types: hasChild max 4 Parent Types: hasChild min 2 Parent Types: hasChild exactly 3 Parent Types: hasChild exactly 5 Facts: hasAge "51"^^xsd:integer Facts: hasWife Mary DifferentFrom: Bill Individual: Bill Facts: not hasWife Mary Facts: not hasDaughter Susan Individual: James SameAs: Jim Individual: Jack Facts: not hasAge "53"^^xsd:integer Individual: Father Types: SocialRole Individual: Meg Individual: Susan Individual: Jim Individual: otherOnt:JohnBrownIndividual: otherOnt:MaryBrown SameIndividual: John, otherOnt:JohnBrown SameIndividual: Mary, otherOnt:MaryBrown
<!DOCTYPE Ontology [ <!ENTITY xsd "http://www.w3.org/2001/XMLSchema#" > <!ENTITY rdfs "http://www.w3.org/2000/01/rdf-schema#" > ]> <Ontology xml:base="http://example.com/owl/families/" ontologyIRI="http://example.com/owl/families" xmlns="http://www.w3.org/2002/07/owl#"> <Prefix name="owl" IRI="http://www.w3.org/2002/07/owl#"/> <Prefix name="otherOnt" IRI="http://example.org/otherOntologies/families/"/> <Import>http://example.org/otherOntologies/families.owl</Import> <Declaration> <NamedIndividual IRI="John"/> </Declaration> <Declaration> <NamedIndividual IRI="Mary"/> </Declaration> <Declaration> <NamedIndividual IRI="Jim"/> </Declaration> <Declaration> <NamedIndividual IRI="James"/> </Declaration> <Declaration> <NamedIndividual IRI="Jack"/> </Declaration> <Declaration> <NamedIndividual IRI="Bill"/> </Declaration> <Declaration> <NamedIndividual IRI="Susan"/> </Declaration> <Declaration> <NamedIndividual IRI="Meg"/> </Declaration> <Declaration> <Class IRI="Person"/> </Declaration> <AnnotationAssertion> <AnnotationProperty IRI="&rdfs;comment"/> <IRI>Person</IRI> <Literal>Represents the set of all people.</Literal> </AnnotationAssertion> <Declaration> <Class IRI="Woman"/> </Declaration> <Declaration> <Class IRI="Parent"/> </Declaration> <Declaration> <Class IRI="Father"/> </Declaration> <Declaration> <Class IRI="Mother"/> </Declaration> <Declaration> <Class IRI="SocialRole"/> </Declaration> <Declaration> <Class IRI="Man"/> </Declaration> <Declaration> <Class IRI="Teenager"/> </Declaration> <Declaration> <Class IRI="ChildlessPerson"/> </Declaration> <Declaration> <Class IRI="Human"/> </Declaration> <Declaration> <Class IRI="Female"/> </Declaration> <Declaration> <Class IRI="HappyPerson"/> </Declaration> <Declaration> <Class IRI="JohnsChildren"/> </Declaration> <Declaration> <Class IRI="NarcisticPerson"/> </Declaration> <Declaration> <Class IRI="MyBirthdayGuests"/> </Declaration> <Declaration> <Class IRI="Dead"/> </Declaration> <Declaration> <Class IRI="Orphan"/> </Declaration> <Declaration> <Class IRI="Adult"/> </Declaration> <Declaration> <Class IRI="YoungChild"/> </Declaration> <Declaration> <ObjectProperty IRI="hasWife"/> </Declaration> <Declaration> <ObjectProperty IRI="hasChild"/> </Declaration> <Declaration> <ObjectProperty IRI="hasDaughter"/> </Declaration> <Declaration> <ObjectProperty IRI="loves"/> </Declaration> <Declaration> <ObjectProperty IRI="hasSpouse"/> </Declaration> <Declaration> <ObjectProperty IRI="hasGrandparent"/> </Declaration> <Declaration> <ObjectProperty IRI="hasParent"/> </Declaration> <Declaration> <ObjectProperty IRI="hasBrother"/> </Declaration> <Declaration> <ObjectProperty IRI="hasUncle"/> </Declaration> <Declaration> <ObjectProperty IRI="hasSon"/> </Declaration> <Declaration> <ObjectProperty IRI="hasAncestor"/> </Declaration> <Declaration> <ObjectProperty IRI="hasHusband"/> </Declaration> <Declaration> <DataProperty IRI="hasAge"/> </Declaration> <Declaration> <DataProperty IRI="hasSSN"/> </Declaration> <Declaration> <Datatype IRI="personAge"/> </Declaration> <Declaration> <Datatype IRI="majorAge"/> </Declaration> <Declaration> <Datatype IRI="toddlerAge"/> </Declaration> <DatatypeDefinition> <Datatype IRI="personAge"/> <DatatypeRestriction> <Datatype IRI="&xsd;integer"/> <FacetRestriction facet="&xsd;minInclusive"> <Literal datatypeIRI="&xsd;integer">0</Literal> </FacetRestriction> <FacetRestriction facet="&xsd;maxInclusive"> <Literal datatypeIRI="&xsd;integer">150</Literal> </FacetRestriction> </DatatypeRestriction> </DatatypeDefinition> <DatatypeDefinition> <Datatype IRI="majorAge"/> <DataIntersectionOf> <Datatype IRI="personAge"/> <DataComplementOf> <Datatype IRI="minorAge"/> </DataComplementOf> </DataIntersectionOf> </DatatypeDefinition> <DatatypeDefinition> <Datatype IRI="toddlerAge"/> <DataOneOf> <Literal datatypeIRI="http://www.w3.org/2001/XMLSchema#integer">1</Literal> <Literal datatypeIRI="http://www.w3.org/2001/XMLSchema#integer">2</Literal> </DataOneOf> </DatatypeDefinition> <SymmetricObjectProperty> <ObjectProperty IRI="hasSpouse"/> </SymmetricObjectProperty> <AsymmetricObjectProperty> <ObjectProperty IRI="hasChild"/> </AsymmetricObjectProperty> <DisjointObjectProperties> <ObjectProperty IRI="hasParent"/> <ObjectProperty IRI="hasSpouse"/> </DisjointObjectProperties> <ReflexiveObjectProperty> <ObjectProperty IRI="hasRelative"/> </ReflexiveObjectProperty> <IrreflexiveObjectProperty> <ObjectProperty IRI="parentOf"/> </IrreflexiveObjectProperty> <FunctionalObjectProperty> <ObjectProperty IRI="hasHusband"/> </FunctionalObjectProperty> <InverseFunctionalObjectProperty> <ObjectProperty IRI="hasHusband"/> </InverseFunctionalObjectProperty> <TransitiveObjectProperty> <ObjectProperty IRI="hasAncestor"/> </TransitiveObjectProperty> <ObjectPropertyDomain> <ObjectProperty IRI="hasWife"/> <Class IRI="Man"/> </ObjectPropertyDomain> <ObjectPropertyRange> <ObjectProperty IRI="hasWife"/> <Class IRI="Woman"/> </ObjectPropertyRange> <InverseObjectProperties> <ObjectProperty IRI="hasParent"/> <ObjectProperty IRI="hasChild"/> </InverseObjectProperties> <DisjointObjectProperties> <ObjectProperty IRI="hasSon"/> <ObjectProperty IRI="hasDaughter"/> </DisjointObjectProperties> <EquivalentObjectProperties> <ObjectProperty IRI="hasChild"/> <ObjectProperty abbreviatedIRI="otherOnt:child"/> </EquivalentObjectProperties> <SubObjectPropertyOf> <ObjectProperty IRI="hasWife"/> <ObjectProperty IRI="hasSpouse"/> </SubObjectPropertyOf> <SubObjectPropertyOf> <ObjectProperty IRI="hasFather"/> <ObjectProperty IRI="hasParent"/> </SubObjectPropertyOf> <SubObjectPropertyOf> <ObjectPropertyChain> <ObjectProperty IRI="hasParent"/> <ObjectProperty IRI="hasParent"/> </ObjectPropertyChain> <ObjectProperty IRI="hasGrandparent"/> </SubObjectPropertyOf> <SubObjectPropertyOf> <ObjectPropertyChain> <ObjectProperty IRI="hasFather"/> <ObjectProperty IRI="hasBrother"/> </ObjectPropertyChain> <ObjectProperty IRI="hasUncle"/> </SubObjectPropertyOf> <SubObjectPropertyOf> <ObjectPropertyChain> <ObjectProperty IRI="hasFather"/> <ObjectProperty IRI="hasBrother"/> </ObjectPropertyChain> <ObjectProperty IRI="hasUncle"/> </SubObjectPropertyOf> <HasKey> <Class IRI="Person"/> <ObjectProperty IRI="hasSSN"/> </HasKey> <DataPropertyDomain> <DataProperty IRI="hasAge"/> <Class IRI="Person"/> </DataPropertyDomain> <DataPropertyRange> <DataProperty IRI="hasAge"/> <Datatype IRI="http://www.w3.org/2001/XMLSchema#nonNegativeInteger"/> </DataPropertyRange> <FunctionalDataProperty> <DataProperty IRI="hasHusband"/> </FunctionalDataProperty> <EquivalentDataProperties> <DataProperty IRI="hasAge"/> <DataProperty abbreviatedIRI="otherOnt:age"/> </EquivalentDataProperties> <SubClassOf> <Class IRI="Woman"/> <Class IRI="Person"/> </SubClassOf> <SubClassOf> <Class IRI="Mother"/> <Class IRI="Woman"/> </SubClassOf> <SubClassOf> <Class IRI="Grandfather"/> <ObjectIntersectionOf> <Class IRI="Man"/> <Class IRI="Parent"/> </ObjectIntersectionOf> </SubClassOf> <SubClassOf> <Class IRI="Father"/> <ObjectIntersectionOf> <Class IRI="Man"/> <Class IRI="Parent"/> </ObjectIntersectionOf> </SubClassOf> <SubClassOf> <Class IRI="ChildlessPerson"/> <ObjectIntersectionOf> <Class IRI="Person"/> <ObjectComplementOf> <ObjectSomeValuesFrom> <ObjectInverseOf> <ObjectProperty IRI="hasParent"/> </ObjectInverseOf> <Class abbreviatedIRI="owl:Thing"/> </ObjectSomeValuesFrom> </ObjectComplementOf> </ObjectIntersectionOf> </SubClassOf> <SubClassOf> <ObjectIntersectionOf> <ObjectOneOf> <NamedIndividual IRI="Mary"/> <NamedIndividual IRI="Bill"/> <NamedIndividual IRI="Meg"/> </ObjectOneOf> <Class IRI="Female"/> </ObjectIntersectionOf> <ObjectIntersectionOf> <Class IRI="Parent"/> <ObjectMaxCardinality cardinality="1"> <ObjectProperty IRI="hasChild"/> </ObjectMaxCardinality> <ObjectAllValuesFrom> <ObjectProperty IRI="hasChild"/> <Class IRI="Female"/> </ObjectAllValuesFrom> </ObjectIntersectionOf> </SubClassOf> <SubClassOf> <Class IRI="Teenager"/> <DataSomeValuesFrom> <DataProperty IRI="hasAge"/> <DatatypeRestriction> <Datatype IRI="&xsd;integer"/> <FacetRestriction facet="&xsd;minExclusive"> <Literal datatypeIRI="&xsd;integer">12</Literal> </FacetRestriction> <FacetRestriction facet="&xsd;maxInclusive"> <Literal datatypeIRI="&xsd;integer">19</Literal> </FacetRestriction> </DatatypeRestriction> </DataSomeValuesFrom> </SubClassOf> <SubClassOf> <Annotation> <AnnotationProperty IRI="&rdfs;comment"/> <Literal datatypeIRI="xsd:string">"States that every man is a person."</Literal> </Annotation> <Class IRI="Man"/> <Class IRI="Person"/> </SubClassOf> <EquivalentClasses> <Class IRI="HappyPerson"/> <ObjectIntersectionOf> <ObjectAllValuesFrom> <ObjectProperty IRI="hasChild"/> <Class IRI="HappyPerson"/> </ObjectAllValuesFrom> <ObjectSomeValuesFrom> <ObjectProperty IRI="hasChild"/> <Class IRI="HappyPerson"/> </ObjectSomeValuesFrom> </ObjectIntersectionOf> </EquivalentClasses> <EquivalentClasses> <Class IRI="JohnsChildren"/> <ObjectHasValue> <ObjectProperty IRI="hasParent"/> <NamedIndividual IRI="John"/> </ObjectHasValue> </EquivalentClasses> <EquivalentClasses> <Class IRI="NarcisticPerson"/> <ObjectHasSelf> <ObjectProperty IRI="loves"/> </ObjectHasSelf> </EquivalentClasses> <EquivalentClasses> <Class IRI="Orphan"/> <ObjectAllValuesFrom> <ObjectInverseOf> <ObjectProperty IRI="hasChild"/> </ObjectInverseOf> <Class IRI="Dead"/> </ObjectAllValuesFrom> </EquivalentClasses> <EquivalentClasses> <Class IRI="MyBirthdayGuests"/> <ObjectOneOf> <NamedIndividual IRI="Bill"/> <NamedIndividual IRI="John"/> <NamedIndividual IRI="Mary"/> </ObjectOneOf> </EquivalentClasses> <EquivalentClasses> <Class IRI="Adult"/> <Class abbreviatedIRI="otherOnt:Grownup"/> </EquivalentClasses> <EquivalentClasses> <Class IRI="Parent"/> <ObjectSomeValuesFrom> <ObjectProperty IRI="hasChild"/> <Class IRI="Person"/> </ObjectSomeValuesFrom> </EquivalentClasses> <EquivalentClasses> <Class IRI="Parent"/> <ObjectSomeValuesFrom> <ObjectProperty IRI="hasChild"/> <Class IRI="Person"/> </ObjectSomeValuesFrom> </EquivalentClasses> <EquivalentClasses> <Class IRI="Person"/> <Class IRI="Human"/> </EquivalentClasses> <EquivalentClasses> <Class IRI="Mother"/> <ObjectIntersectionOf> <Class IRI="Woman"/> <Class IRI="Parent"/> </ObjectIntersectionOf> </EquivalentClasses> <EquivalentClasses> <Class IRI="Parent"/> <ObjectUnionOf> <Class IRI="Mother"/> <Class IRI="Father"/> </ObjectUnionOf> </EquivalentClasses> <EquivalentClasses> <Class IRI="ChildlessPerson"/> <ObjectIntersectionOf> <Class IRI="Person"/> <ObjectComplementOf> <Class IRI="Parent"/> </ObjectComplementOf> </ObjectIntersectionOf> </EquivalentClasses> <DisjointClasses> <Class IRI="Woman"/> <Class IRI="Man"/> </DisjointClasses> <DisjointClasses> <Class IRI="Father"/> <Class IRI="Mother"/> <Class IRI="YoungChild"/> </DisjointClasses> <DifferentIndividuals> <NamedIndividual IRI="John"/> <NamedIndividual IRI="Bill"/> </DifferentIndividuals> <SameIndividual> <NamedIndividual IRI="James"/> <NamedIndividual IRI="Jim"/> </SameIndividual> <SameIndividual> <NamedIndividual IRI="John"/> <NamedIndividual abbreviatedIRI="otherOnt:JohnBrown"/> </SameIndividual> <SameIndividual> <NamedIndividual IRI="Mary"/> <NamedIndividual abbreviatedIRI="otherOnt:MaryBrown"/> </SameIndividual> <ObjectPropertyAssertion> <ObjectProperty IRI="hasWife"/> <NamedIndividual IRI="John"/> <NamedIndividual IRI="Mary"/> </ObjectPropertyAssertion> <DataPropertyAssertion> <DataProperty IRI="hasAge"/> <NamedIndividual IRI="John"/> <Literal datatypeIRI="http://www.w3.org/2001/XMLSchema#integer">51</Literal> </DataPropertyAssertion> <ClassAssertion> <Class IRI="Person"/> <NamedIndividual IRI="Mary"/> </ClassAssertion> <ClassAssertion> <Class IRI="Woman"/> <NamedIndividual IRI="Mary"/> </ClassAssertion> <ClassAssertion> <ObjectIntersectionOf> <Class IRI="Person"/> <ObjectComplementOf> <Class IRI="Parent"/> </ObjectComplementOf> </ObjectIntersectionOf> <NamedIndividual IRI="Jack"/> </ClassAssertion> <ClassAssertion> <ObjectMaxCardinality cardinality="4"> <ObjectProperty IRI="hasChild"/> <Class IRI="Parent"/> </ObjectMaxCardinality> <NamedIndividual IRI="John"/> </ClassAssertion> <ClassAssertion> <ObjectMinCardinality cardinality="2"> <ObjectProperty IRI="hasChild"/> <Class IRI="Parent"/> </ObjectMinCardinality> <NamedIndividual IRI="John"/> </ClassAssertion> <ClassAssertion> <ObjectExactCardinality cardinality="3"> <ObjectProperty IRI="hasChild"/> <Class IRI="Parent"/> </ObjectExactCardinality> <NamedIndividual IRI="John"/> </ClassAssertion> <ClassAssertion> <ObjectExactCardinality cardinality="5"> <ObjectProperty IRI="hasChild"/> </ObjectExactCardinality> <NamedIndividual IRI="John"/> </ClassAssertion> <ClassAssertion> <Class IRI="Father"/> <NamedIndividual IRI="John"/> </ClassAssertion> <ClassAssertion> <Class IRI="SocialRole"/> <NamedIndividual IRI="Father"/> </ClassAssertion> <NegativeObjectPropertyAssertion> <ObjectProperty IRI="hasWife"/> <NamedIndividual IRI="Bill"/> <NamedIndividual IRI="Mary"/> </NegativeObjectPropertyAssertion> <NegativeDataPropertyAssertion> <DataProperty IRI="hasAge"/> <NamedIndividual IRI="Jack"/> <Literal datatypeIRI="http://www.w3.org/2001/XMLSchema#integer">53</Literal> </NegativeDataPropertyAssertion> <NegativeObjectPropertyAssertion> <ObjectProperty IRI="hasDaughter"/> <NamedIndividual IRI="Bill"/> <NamedIndividual IRI="Susan"/> </NegativeObjectPropertyAssertion> </Ontology>
この項は、2009年9月22日の勧告案以後のこのドキュメントへの変更をまとめています。
この項では、2009年6月11日の最終草案以後のこのドキュメントへの変更をまとめています。
OWL 2の開発の出発点は、OWL 1.1メンバーの提案で、それ自身は、ユーザと開発者のフィードバックの結果であり、特に、OWL経験と説明(OWLED)ワークショップ・シリーズの間に集まった情報です。ワーキンググループは、WebOntワーキングループで先送りされていた課題についても検討しました。
このドキュメントは、OWLワーキンググループによって製作され(下記を参照)、コンテンツはワーキンググループ全体の広範囲にわたる議論を反映しています。編集者は、徹底的なレビューと有益なコメントに関し、Jie Bao (RPI)、Michel Dumontier (Carleton University)、 Christine Goldbreich (Université de Versailles St-Quentin and LIRMM)、Henson Graves (Lockheed Martin)、Ivan Herman (W3C/ERCIM)、Rinke Hoekstra (University of Amsterdam)、Doug Lenat (Cycorp)、Deborah L. McGuinness (RPI)、Alan Rector (University of Manchester)、Alan Ruttenberg (Science Commons)、Uli Sattler (University of Manchester)、Michael Schneider (FZI)とMike Smith (Clark & Parsia)に特に謝意を表します。
このドキュメントの公表時点のOWLワーキンググループの会合の正規出席者は次の通りでした。Jie Bao (RPI)、Diego Calvanese (Free University of Bozen-Bolzano)、Bernardo Cuenca Grau (Oxford University Computing Laboratory)、Martin Dzbor (Open University)、Achille Fokoue (IBM Corporation)、Christine Golbreich (Université de Versailles St-Quentin and LIRMM)、Sandro Hawke (W3C/MIT)、Ivan Herman (W3C/ERCIM)、Rinke Hoekstra (University of Amsterdam)、Ian Horrocks (Oxford University Computing Laboratory)、Elisa Kendall (Sandpiper Software)、Markus Krötzsch (FZI)、Carsten Lutz (Universität Bremen)、Deborah L. McGuinness (RPI)、Boris Motik (Oxford University Computing Laboratory)、Jeff Pan (University of Aberdeen)、Bijan Parsia (University of Manchester)、Peter F. Patel-Schneider (Bell Labs Research, Alcatel-Lucent)、Sebastian Rudolph (FZI)、Alan Ruttenberg (Science Commons)、Uli Sattler (University of Manchester)、Michael Schneider (FZI)、Mike Smith (Clark & Parsia)、Evan Wallace (NIST)、Zhe Wu (Oracle Corporation)とAntoine Zimmermann (DERI Galway)。ワーキンググループの元のメンバーであるJeremy Carroll、Jim Hendler、Vipul Kashyapにも感謝申し上げます。