RDFSモデリングにおけるクラスの使用
読者は、これまで紹介したいずれの例でもRDFSのプロパティは扱っているが、RDFSのクラスを扱っていないことに驚かれたかもしれません。既に述べたように、RDFSのプロパティとRDFSのクラスは、プロパティがRDFSのクラスの属性(すなわちクラス変数)の定義に使われることはないという意味で、直交しています。クラスを用いてその場限りのやり方でプロパティを追加して使うにせよ、クラスを拡張するにせよ、プロパティはいつでも使用できます。次の例では、RDFSモデリングにおけるクラスの使い方を示すために、N3ファイル「rdf_files/class_example.n3」を使用しています。
@prefix kb: <http://knowledgebooks.com/ontology#> . @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . @prefix foaf: <http://xmlns.com/foaf/0.1/#> . foaf:Person rdfs:subClassOf foaf:Agent . kb:KnowledgeEngineer rdfs:subClassOf foaf:Person . <http://www.markwatson.com/index.rdf> a kb:KnowledgeEngineer .
なお、上記の述語における略号のaは、主語であるURIがクラスkb:KnowledgeEngineer
のメンバであることを意味します。次のSPARQLクエリでは、目的語がfoaf:Agent
と一致するトリプルのすべての主語と述語が出力されます。
require "java" require "sesame_wrapper.jar" require 'pp' include_class "TripleStoreSesameManager" include_class "DefaultSparqlResultHandler" tsm = TripleStoreSesameManager.new tsm.loadRDF("rdf_files/class_example.n3") sparql_query = PREFIX foaf: <http://xmlns.com/foaf/0.1/#> SELECT ?subject ?predicate WHERE { ?subject ?predicate foaf:Agent . }"; tsm.doSparqlQuery(sparql_query, DefaultSparqlResultHandler.new)
リスト7は、このサンプルの実行結果です。これには、いくつか興味深い点があります。
- 主語であるURI <http://knowledgebooks.com/ontology#KnowledgeEngineer>の型は
foaf:Agent
です。論理的な推論によって、筆者のURIの型はkb:KnowledgeEngineer
からfoaf:Person
を経てfoaf:Agent
となります。 foaf:Person
と<http://knowledgebooks.com/ontology#KnowledgeEngineer>はどちらもfoaf:Agent
型です。
Sesame(あるいは、その他のRDFトリプルストア)において推論を通じてアサートされるトリプルを調べるために、この例のような「適用範囲の広い」SPARQLクエリを作成するのは、多くの場合、面白くもあり、また有益でもあります。
next result: |http://xmlns.com/foaf/0.1/#Person| |http://www.w3.org/2000/01/rdf-schema#subClassOf| . next result: |http://knowledgebooks.com/ontology#KnowledgeEngineer| |http://www.w3.org/2000/01/rdf-schema#subClassOf| . next result: |http://www.markwatson.com/foaf.rdf/| |http://www.w3.org/1999/02/22-rdf-syntax-ns#type| . next result: |http://xmlns.com/foaf/0.1/#Agent| |http://www.w3.org/2000/01/rdf-schema#subClassOf| .
今後の展開
さて、JavaとJRubyを用いてセマンティックWebの機能を実現する方法を見てきたわけですが、本稿のサンプルに倣ってコードを書けば、読者独自のセマンティックWebプログラムを作ることができるでしょう。
独自のセマンティックWebプロジェクトを開始するに当たって、次の2つの指針に従うことをお勧めします。
- 独自のデータソースをRDFとして公開し、その上で、データの消費者にRDFSと、初期の導入を容易にするためのサンプルのSPARQLクエリを提供すること。
- RDFデータのソースとして、どのようなものが自分のWebアプリケーションの価値を高めるかを確認すること。SPARQLクエリを用いて、自分の用途に合ったデータを収集するとよいでしょう。