前回のこのコラムでは、RDFなどのXMLナレッジ管理システムが、データの設計やモデル化に関する古くからの問題に対して、どのように新しい光を投げかけるかについて説明しました。その際に、問題追跡パッケージのスキーマを明確にすることを目標にしましたが、このパッケージとは、XMLアプリケーションと連携してRDFの使用方法を説明するために取り上げたものです。今回は、RDFSおよびDAML+OIL形式について、問題追跡スキーマの定義を完成させようと思います。
今回も、RDF、RDFS、およびDAML+OILに関する知識が必要です。しかし、前回から同僚のRoxane Ouelletと共にDAML+OILの概要を説明しているので (参考文献を参照)、これらを理解するために難解な仕様書と格闘する必要はなくなったはずです。
前置きはこれくらいにして、リスト1に問題追跡アプリケーションの完全なRDFSを示します。
リスト1. 問題追跡アプリケーションのRDFSスキーマ
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE rdf:RDF [
<!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<!ENTITY rdfs "http://www.w3.org/2000/01/rdf-schema#">
<!ENTITY it "http://rdfinference.org/schemata/issue-tracker/">
<!ENTITY dc "http://purl.org/dc/elements/1.1/">
]>
<rdf:RDF
xmlns:rdf="&rdf;"
xmlns:rdfs="&rdfs;"
xmlns:it="⁢"
>
<rdfs:Class rdf:about="⁢Catalog">
<rdfs:label>Issue catalog</rdfs:label>
<rdfs:comment>
An optional collection of resources for which issues have or can
be defined. Use dc:relation to associate the catalog with its
resources.
</rdfs:comment>
</rdfs:Class>
<rdfs:Class rdf:about="⁢Issue">
<rdfs:label>Issue</rdfs:label>
<rdfs:comment>
A problem, suggestion or other matter for action or discussion
relevant to a resource. Use Dublin Core properties for base
description.
</rdfs:comment>
</rdfs:Class>
<rdfs:Property rdf:about="⁢issue">
<rdfs:label>issue</rdfs:label>
<rdfs:comment>Associate an issue to its resources</rdfs:comment>
<rdfs:range rdf:resource="⁢Issue"/>
</rdfs:Property>
<rdfs:Property rdf:about="⁢action">
<rdfs:label>action</rdfs:label>
<rdfs:comment>Associate an action with an issue</rdfs:comment>
<rdfs:domain rdf:resource="⁢Issue"/>
<rdfs:range rdf:resource="⁢Action"/>
</rdfs:Property>
<rdfs:Class rdf:about="⁢Action">
<rdfs:label>Action</rdfs:label>
<rdfs:comment>
An action to be taken with regard to an issue
</rdfs:comment>
</rdfs:Class>
<rdfs:Class rdf:about="⁢it:assignee">
<rdfs:label>Assign to</rdfs:label>
<rdfs:comment>
Specify the party to whom the action is assigned
</rdfs:comment>
<rdfs:domain rdf:resource="⁢Action"/>
</rdfs:Class>
<rdfs:Class rdf:about="⁢status">
<rdfs:label>status</rdfs:label>
<rdfs:comment>For instance, "not done" or "done"</rdfs:comment>
<rdfs:domain rdf:resource="⁢Action"/>
</rdfs:Class>
<rdfs:Class rdf:about="⁢comment">
<rdfs:label>comment</rdfs:label>
<rdfs:comment>Associate a comment with an issue</rdfs:comment>
<rdfs:domain rdf:resource="⁢Issue"/>
<rdfs:range rdf:resource="⁢Comment"/>
</rdfs:Class>
<rdfs:Class rdf:about="⁢Comment">
<rdfs:label>Comment</rdfs:label>
<rdfs:comment>A comment made with regard to an issue</rdfs:comment>
</rdfs:Class>
</rdf:RDF>
|
使用されている名前空間が変更されているなど、いくつかの変更点に気付かれたと思います。これらの変更が行われた理由は、残念ながら、これまでのRDFのサンプルに定義済みクラスが使用されていなかったという事実ほど簡単に説明することはできません。このスキーマは、さまざまな理由で行われた変更を含め、RDFInference.orgの問題追跡アプリケーションのために現在何が使用されているかを示しています。これに対応する、インスタンスRDFのアップデートを次に示します。
また、語彙に関するいくつかの約束事(convention)も採用しています。第1に、すべての名前空間URIをDTD内部部分集合のエンティティーとして定義しています (Ms. Ouelletから教わった約束事です)。これによりエラーが減少し、読み易さが向上します。第2に、rdf:about だけを使用し、rdf:ID は使用していません。rdf:IDとは、格納するドキュメントの想定されるURIに対して、IDを解決することに関連して、ありとあらゆる落とし穴に落ちてヒドイ目にあった経験から、最近採用した約束事です。次の点に注意してください。すなわち、rdf:ID は、明示的なxml:base 宣言が存在することをが確かな場合のみ使用していることと、相互運用性が必要とされるすべてのRDFプロセッサーはXMLベースをサポートしていることです。
Catalog クラスは、問題を持つすべてのリソース、あるいはユーザーが問題を作成できるすべてのリソースを集約するための方法を提供します。これは、主にアプリケーションを使いやすくするために用意されています。追跡アプリケーション用のWebベースのフォームを考えてみましょう。このフォームには、関心のあるリソースを選択するためのドロップダウン・ボックスがあることでしょう。このリストを表示するための1つの方法は、所定のカタログからdc:relation ステートメントのすべてのオブジェクトをチェックすることです。なお、これから紹介するDAML+OILスキーマでは、別のアプローチを採用しています。
これ以外にも、いくつかの小さな変更があります。たとえば、品詞の使用に、より一貫性を持たせるため、"assigned-to" から "assignee" に改名しています。それ以外には、このスキーマには特にわかりにくい点はないと思います。それでは、DAML+OILバージョンを見てみましょう。
DAML+OILはRDFSに対する重要な改善を施すスキーマ・システムです。これには、組み込みのデータ型付けシステム、列挙のサポート、プロパティーに関する特化、および推論による分類と型付けが含まれています。また、存在論を定義するために単なる図式を超えていますが、これは私たちの概念の保持のしかた近似となるように意図されています。しかし、ここでは主に基本的な図式的機能を使用することにします。リスト2は、リスト1と同様の、問題追跡アプリケーションのDAML+OILスキーマです。
リスト2. 問題追跡アプリケーションのDAML+OILスキーマ
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE rdf:RDF [ <!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <!ENTITY xsd "http://www.w3.org/2000/10/XMLSchema#"> <!ENTITY rdfs "http://www.w3.org/2000/01/rdf-schema#"> <!ENTITY daml "http://www.daml.org/2001/03/daml+oil#"> <!ENTITY dc "http://purl.org/dc/elements/1.1/"> <!ENTITY it "http://rdfinference.org/schemata/issue-tracker/"> ]> <rdf:RDF xmlns:rdf="&rdf;" xmlns:rdfs="&rdfs;" xmlns:daml="&daml;" xmlns:xsd="&xsd;" xmlns:it="⁢" > <daml:Ontology rdf:about=""> <daml:versionInfo> <!-- Note: requires expansion by RCS, CVS or the like $Revision$ </daml:versionInfo> <rdfs:comment> Ontology for an issue tracking system for arbitrary resources </rdfs:comment> <daml:imports rdf:resource="http://www.w3.org/2001/10/daml+oil"/> </daml:Ontology> <daml:Class rdf:about="⁢RelevantResource"> <rdfs:label>Relevant resource</rdfs:label> <rdfs:comment> An implied classification of resources that have related issues </rdfs:comment> <rdfs:subClassOf> <daml:onProperty rdf:resource="⁢issue"/> <daml:toClass rdf:resource="⁢Issue"/> </rdfs:subClassOf> </daml:Class> <daml:Class rdf:about="⁢Issue"> <rdfs:label>Issue</rdfs:label> <rdfs:comment> A problem, suggestion or other matter for action or discussion relevant to a resource. Use Dublin Core properties for base description. </rdfs:comment> </daml:Class> <daml:ObjectProperty rdf:about="⁢issue"> <rdfs:label>issue</rdfs:label> <rdfs:comment>Associate an issue to its resources</rdfs:comment> <rdfs:range rdf:resource="⁢Issue"/> </daml:ObjectProperty> <daml:ObjectProperty rdf:about="⁢action"> <rdfs:label>action</rdfs:label> <rdfs:comment>Associate an action with an issue</rdfs:comment> <rdfs:domain rdf:resource="⁢Issue"/> <rdfs:range rdf:resource="⁢Action"/> </daml:ObjectProperty> <daml:Class rdf:about="⁢Action"> <rdfs:label>Action</rdfs:label> <rdfs:comment>An action to be taken with regard to an issue</rdfs:comment> </daml:Class> <daml:ObjectProperty rdf:about="⁢it:assignee"> <rdfs:label>Assign to</rdfs:label> <rdfs:comment> Specify the party to whom the action is assigned </rdfs:comment> <rdfs:domain rdf:resource="⁢Action"/> </daml:ObjectProperty> <daml:ObjectProperty rdf:about="⁢status"> <rdfs:label>status</rdfs:label> <rdfs:comment>For instance, "not done" or "done"</rdfs:comment> <rdfs:domain rdf:resource="⁢Action"/> </daml:ObjectProperty> <daml:ObjectProperty rdf:about="⁢comment"> <rdfs:label>comment</rdfs:label> <rdfs:comment>Associate a comment with an issue</rdfs:comment> <rdfs:domain rdf:resource="⁢Issue"/> <rdfs:range rdf:resource="⁢Comment"/> </daml:ObjectProperty> <daml:Class rdf:about="⁢Comment"> <rdfs:label>Comment</rdfs:label> <rdfs:comment>A comment made with regard to an issue</rdfs:comment> </daml:Class> </rdf:RDF> |
すべての定義の前にontologyヘッダーが置かれています。これはドキュメントを記述し、スキーマを指定するDAML規約です (そのため空であるrdf:aboutが定義され、これによってドキュメント自身をサブジェクトに設定します)。このヘッダーには改訂ステートメントを備え、このステートメントは改訂制御システムによって展開できるようにキーワードを使用して定義されています。また、インポートも記述されています。これは、他のファイルの定義を現在のファイルに組み込むためにDAML+OILで追加された明示的機構です (DAML以前には、複数のソースを1つのモデルにマージするか、XIncludeなどの低レベルの機構を使用しなければなりませんでした)。標準的な方法としては、コアDAML+OILスキーマをインポートし、DAML+OIL固有のリソースの定義を追加します。
次に、特別なクラスであるRelevantResource が記述されています。このインスタンスは明示的には記述されていませんが、インスタンスのプロパティーに関する推論によって定義されます。このことは、RelevantResource クラスをより詳しく調べることで明らかになります。このクラスは、無名のインライン・リソースのサブクラスとして定義されており、このサブクラスの型はdaml:Restriction です。これはインスタンスが持つプロパティーとその値によってルールを定義できる、DAML+OILの特別な機構です。ここでは制限により、値がIssue クラスであるissue プロパティーを持つすべてのリソースが選択されます。この制限からのサブクラス化により、RelevantResource クラスは、制限を満たすすべてのリソースのセットを含んだ、一種の仮想クラスとなります。あるリソースが正しいクラスの値を持つ正しいプロパティーを取得した場合、そのリソースは、明示的な記述がなかったとしても、いつでも自動的にこの仮想クラスのメンバーとなります。
これは、運用している情報空間のすべてを制御できるわけではない場合には非常に重要な機能であり、また、Semantic Webを支えるために必要な技術の一つとして、DAML+OILが大きな前進であるといえる理由です。ここでのより控えめな例では、この機能によって、問題追跡のために明示的に登録されたリソースを、すべて持つ必要はなくなりました。RDFS形式のスキーマでは、Catalog クラスを使用して、すべてのリソースを保持する必要がありましたが。
すべてのクラスはdaml:Class を使用して定義されています。daml:Classは、DAMLで導入されたすべての追加機能を提供するrdfs:Class クラスのサブクラスです。同様に、プロパティーの定義にはdaml:ObjectProperty を使用しています。問題追跡スキーマでは、プロパティーの値を定義するために特定のデータ型 (文字列、整数など) は使用しませんが、これらのプロパティーは、DAML+OILではdaml:DatatypeProperty のサブクラスとなるように定義されていることに注意してください。
実のところ、RDFInference.orgアプリケーションではDAML+OILスキーマが使用されており、またこのコラムでもこのスキーマを基礎として使用して作業を継続していきます。
すでに述べた変更のため、このコラムでこれまで検討してきた問題のサンプル・インスタンスを再び取り上げ、アップデートしました。リスト3をご覧ください。
リスト3. アップデートされたインスタンス・データ
<?xml version='1.0'?> <!DOCTYPE rdf:RDF [ <!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <!ENTITY rdfs "http://www.w3.org/2000/01/rdf-schema#"> <!ENTITY daml "http://www.daml.org/2001/03/daml+oil#"> <!ENTITY dc "http://purl.org/dc/elements/1.1/"> <!ENTITY foaf "http://xmlns.com/foaf/0.1/"> <!ENTITY it "http://rdfinference.org/schemata/issue-tracker/"> <!ENTITY rit "http://rdfinference.org/ril/issue-tracker/"> ]> <rdf:RDF xmlns:rdf="&rdf;" xmlns:rdfs="&rdfs;" xmlns:daml="&daml;" xmlns:rit="&rit;" xmlns:it="⁢" xmlns:dc="&dc;" xmlns:foaf="&foaf;" xmlns="⁢" > <rdf:Description rdf:about='http://rdfinference.org/ril/ril-20010502'> <issue rdf:resource='&rit;i2001030423'/> <issue rdf:resource='&rit;i2001042003'/> </rdf:Description> <Issue rdf:about='&rit;i2001030423'> <dc:title>Unnecessary abbreviation</dc:title> <dc:creator rdf:resource='mailto:Alexandre.Fayolle@logilab.fr'/> <dc:description> Is the abbreviation of rdf:type predicates in queries necessary? </dc:description> <dc:date>2001-03-04</dc:date> <comment rdf:parseType="Resource"> <dc:creator rdf:resource='mailto:Alexandre.Fayolle@logilab.fr'/> <dc:description> The abbreviation in listing 8 doesn't seem necessary to Nico Chauvat or me. </dc:description> </comment> <action rdf:parseType="Resource"> <dc:description>Organize a vote on this topic</dc:description> <it:assignee rdf:resource='mailto:uche.ogbuji@fourthought.com'/> </action> </Issue> <Issue rdf:about='&rit;i2001042003'> <dc:title>Inconsistent versioning</dc:title> <dc:creator rdf:resource='mailto:Nicolas.Chauvat@logilab.fr'/> <dc:description> The RIL versioning is not clear (there's a mix of 0.1, 0/1, 0.2 and 0/2) </dc:description> <dc:date>2001-04-20</dc:date> <action rdf:parseType="Resource"> <dc:description> Correct all to use the "0/1" form in the next draft. </dc:description> <it:assignee rdf:resource='mailto:uche.ogbuji@fourthought.com'/> </action> </Issue> <rdf:Description rdf:about='mailto:Alexandre.Fayolle@logilab.fr'> <foaf:name>Alexandre Fayolle</foaf:name> </rdf:Description> <rdf:Description rdf:about='mailto:uche.ogbuji@fourthought.com'> <foaf:name>Uche Ogbuji</foaf:name> </rdf:Description> <rdf:Description rdf:about='mailto:Nicolas.Chauvat@logilab.fr'> <foaf:name>Nicolas Chauvat</foaf:name> </rdf:Description> </rdf:RDF> |
サンプルの問題に対応するリソースを定義します。DAML+OILスキーマに従い、http://rdfinference.org/ril/ril-20010502 は自動的にRelevantResource クラスのメンバーになります。もう1つの重要な変更は、mailtoのURLを使用して他の人々を参照していることです。そして、このURLは「friend of a friend」(FOAF) を使用して、これらの人々の正規の名前にリンクされています。FOAFは、個人的な連絡先に関する情報を指定するための有名なDAML+OILスキーマで、電子メールボックスに関係付けられている可能性のある人物を記述するのに適しています。RDFで連絡先情報をモデル化する方法には、有名なもう1つの方法があることに注意してください。それは、連絡先情報を電子メールの添付ファイルとして埋め込むための、一般的なvCard形式に基づくものです。vCard RDFスキーマは、FOAFスキーマよりも広い範囲で使用されていますが、ここでは、その追加プロパティーは必要ありません。また、必要であれば、FOAFベースのオプションとしてFOAFCorpも利用できます。これは、企業の組織構成に関連する要素をFOAFでコア・パーソナル・プロファイル情報に追加するものです。
オリジナルではなく、このフォームを生成するための、XSLTに対する変更は、あまり重要ではありません。ほとんどはリテラルの結果要素名や名前空間URIに対する変更です。
一般に、前回のこのコラムで説明したような、緩やかな方法で制約を適用する場合でも、なんらかのスキーマを定義しておく必要があります。特に役に立たないとしても、ドキュメンテーションにはなります。RDFSは最も単純で最も普及している選択肢ですが、DAML+OILには、追加機能だけでなく、コア・セマンティクスがよりクリーンであることなど、推奨に値する点がいくつもあります。問題追跡アプリケーションのスキーマが完成したので、今度は問い合わせの構成方法を改善しましょう。このコラムではVersaに注目します。これはRDF用のオープンな問い合わせ言語で、これまでに示したすべての問い合わせコードをより単純に、より高速にしてくれます。
-
前回の記事にリストした入門的な参考文献のほかに、Roxane OuelletとUche OgbujiによるIntroduction to DAML: Part I もあります。
- パーソナル・プロファイル情報を管理するには「friend of a friend」(FOAF) スキーマがあります。企業エンティティーの構造を表現するための詳細を追加するFOAFCorp もあります。
-
Representing vCard Objects in RDF/XML は、Renato IannellaによるW3Cノートです。
- このシリーズのこれまでの回で、「ナレッジ管理のための基本的なXMLおよびRDF技法」 について参照するには、次の記事を参照してください。
- その1: XSLTによるRDFの生成 (developerWorks、2001年7月)
- その2: RDFモデルへのファイルの組み込み、および基本的なRDF照会(developerWorks、2001年9月)
- その3: 意味体系からの知識 (developerWorks、2001年11月)
- その4: 問題追跡機能のスキーマ (developerWorks、2002年2月)

Uche Ogbuji氏は、Fourthought, Inc. のコンサルタント兼共同設立者です。この会社は、企業のナレッジ・マネジメントのためのXMLソリューションを専門とするソフトウェア・ベンダー兼コンサルタント会社です。Fourthoughtでは、XML、RDF、およびナレッジ・マネジメント・アプリケーション用のオープン・ソース・プラットフォームである4Suiteを開発しています。Ogbuji氏は、ナイジェリア出身のコンピューター・エンジニア兼ライターで、現在は、米国コロラド州ボールダーに住み、そこで働いています。Ogbuji氏の連絡先はuche.ogbuji@fourthought.com です。