より優れたRDFフォーマット: N3構文
RDFストレージとクエリ機能を提供するSesameのようなフレームワークでは、入力にどのRDFフォーマットを使うかは関知されません。しかし、可読性が高く理解しやすいフォーマットを使うに越したことはありません。そのため、私はできる限りN3を使うことにしています。私がRDFを初めて使用したのはもう何年も前のことですが、そのとき使用したXMLシリアライズフォーマットは、紛らわしく、概して直観に反するものでした。N-Triple、N3、Turtle(N3を簡略化したフォーマットです。本稿では扱いません)のいずれのフォーマットもRDFのXMLフォーマットよりも圧倒的に優れています。
私のラッパーライブラリには、RDFストレージ内の任意のRDFデータをN3に変換するSesameユーティリティコードのAPIがあります。次のJavaコードは、この使い方を示しています。
public class ConvertTriplesToN3 { public static void main(String [] args) throws RepositoryException, IOException, RDFParseException, RDFHandlerException { TripleStoreSesameManager ts = new TripleStoreSesameManager(); ts.loadRDF("rdf_files/rdfs.nt"); ts.loadRDF("rdf_files/news.nt"); ts.saveRepositoryAsN3("sample_N3.n3"); } }
残念ながら、SesameがN3データを書き出すとき、名前空間の略号は使われません。リスト4は、上記のコードで生成される行を示しています。CWMのようなユーティリティプログラムで、さまざまなRDFフォーマットへの変換を行うこともできます。
N3では、複数のN-Triple RDFステートメント(「主語, 述語, 目的語, "."」という形式)を、同じ主語を持つN-Tripleステートメントに対応する単一のN3ステートメントに畳み込むことができます。N3部分を詳しく見てみましょう(名前空間接頭辞のkb:とrdfs:が定義されているものと仮定します)。
<http://news.yahoo.com/s/nm/20080616/ts_nm/usa_flooding_dc_16 /> kb:containsCity "Burlington" , "Denver" ; kb:containsRegion "U.S. Midwest" , "Midwest" ; kb:containsCountry "United States" , "Japan".
ここで、主語はWeb上のニュース記事の完全なURLです。この記事には、述語kb:containsCityについて2つの目的語"Burlington"と"Denver"があり、複数の目的語はコンマで区切られ、最後の目的語がセミコロンで止められています。これは、次の用語の新しい述語が始まり、その後に複数の目的語が続くことを意味します。最後の行がピリオドで止められていることに注意してください。これには、このN3ステートメントを止める意味もあります。
私はファイル「rdf_files/news.n3」を手作業で編集して(これは正規表現による検索と置換を使えば簡単)名前空間の略号を自動変換後のN3ファイルに追加しました。リスト5は、ファイル「news.n3」の最初の数行です。最初の2行で名前空間の略号(すなわち「接頭辞」)を定義しています。一例として、RDFスキーマの略号『rdfs』と私の独自の名前空間knowledgebooks.comの略号『kb』が新しいRDFSプロパティkb:containsPlace
を定義するために使用され、これはkb:containsCity
、kb:containsCountry
、kb:containsState
の親プロパティとなります。なお、この例でkb:containsCity
をkb:containsPlace
の子プロパティにしていないことに注意してください。名前空間の略号を使うと、RDFの可読性が大いに向上します。
新しい親プロパティkb:containsPlace
は、どう使うのか? オリジナルのトリプルストア内のトリプルにkb:containsPlace
と一致する述語はありませんでした。このプロパティはRDFS推論で新しいトリプルをアサートするために用いられます。RDFトリプルストアの中には、アサートされたトリプルを事前に計算するものもあれば、SPARQLクエリの処理中に必要に応じて計算するものもあります。セマンティックWebの開発者としてはトリプルストアの内部動作を概念的に区別することはありませんが、メモリ消費と相対立するクエリのパフォーマンスについて、どこかで妥協点を見つけるよう迫られることになると思われます。
RDFS推論の一例として、あるアプリケーションで特定の州を含むニュース記事を探す粒度の高いクエリを実行し、別のアプリケーションでともかくも物理的な場所を参照しているすべてのニュース記事を探すものとします。この場合、最初のアプリケーションでは、kb:containsStateとトリプルの目的語について州名の文字列リテラル(あるいは州を表す50個のURIを使うことも考えられる)で照合を行うことになるでしょう。一方、2番目のアプリケーションでは、SPARQLクエリにおいて先ほどの親プロパティを次のように使うことができます。
sparql_query = "PREFIX kb: <http://knowlegebooks.com/ontology/#> SELECT ?subject ?object WHERE { ?subject kb:containsPlace ?object . }";
このクエリでは、containsRegion
、containsCountry
、containsState
のいずれかと一致する述語を持つすべての記事がマッチします。このSPARQL構文で名前空間の略号(すなわち接頭辞)としてキーワードPREFIXを使用していることに注意してください。
SPARQLクエリを実行するときのRDFフォーマットが違っても、そこに何か差が生じることはありません。SesameのようなRDFストレージのリポジトリにおいて、RDFはある効率的な内部フォーマットで保存されます。開発者はフォーマットと言えばXML RDFかN3 RDFだと考えがちですが、データがいったんリポジトリに読み込まれた後は、最初のRDFフォーマットとして何を使用したかは関係ありません。また、単一のN3ステートメントで通例、多数のRDFトリプル(いずれも同じ主語を持つ)が定義されることを知っておくことも重要です。
RDFSを使うことで(この例では、親プロパティcontainsPlace
を定義している)RDFデータを変換しなくてもそのアクセスの道筋を変えることができます。一方、リレーショナルデータベースアプリケーションでは、特別なクエリを使うか(この場合、containsPlace
に新しい子プロパティを追加しようとするとクエリの変更が必要)、新しいテーブルもしくはデータベースビューを使う必要があります。確かに、こうした再利用問題はリレーショナルデータベースでも解決できますが、RDFSと比べて柔軟性が著しく低くなります。
スキーマ/フォーマットの異なる複数のデータソースが存在するような状況では、RDFとRDFSを組み合わせることで、さらに高い柔軟性が得られます。これについては後ほど説明します。
<http:://knowledgebooks.com/ontology#containsCity> <http://www.w3.org/2000/01/rdf-schema#subPropertyOf> <http:://knowledgebooks.com/ontology#containsPlace> . <http:://knowledgebooks.com/ontology#containsCountry> <http://www.w3.org/2000/01/rdf-schema#subPropertyOf> <http:://knowledgebooks.com/ontology#containsPlace> . <http:://knowledgebooks.com/ontology#containsState> <http://www.w3.org/2000/01/rdf-schema#subPropertyOf> <http:://knowledgebooks.com/ontology#containsPlace> . <http://news.yahoo.com/s/nm/20080616/ts_nm/usa_flooding_dc_16 /> <http:://knowledgebooks.com/ontology#containsCity> "Burlington" , "Denver" , "St. Paul" , "Chicago" , "Quincy" , "CHICAGO" , "Iowa City" ; <http:://knowledgebooks.com/ontology#containsRegion> "U.S. Midwest" , "Midwest" ; <http:://knowledgebooks.com/ontology#containsCountry> "United States" , "Japan" ; <http:://knowledgebooks.com/ontology#containsState> "Minnesota" , "Illinois" , "Mississippi" , "Iowa" ; <http:://knowledgebooks.com/ontology#containsOrganization> "National Guard" , "U.S. Department of Agriculture" , "White House" , "Chicago Board of Trade" , "Department of Transportation" ; <http:://knowledgebooks.com/ontology#containsPerson> "Dena Gray-Fisher" , "Donald Miller" , "Glenn Hollander" , "Rich Feltes" , "George W. Bush" ; <http:://knowledgebooks.com/ontology#containsIndustryTerm> "food inflation" , "food" , "finance ministers" , "oil" .
@prefix kb: <http://knowledgebooks.com/ontology#> . @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . kb:containsCity rdfs:subPropertyOf kb:containsPlace . kb:containsCountry rdfs:subPropertyOf kb:containsPlace . kb:containsState rdfs:subPropertyOf kb:containsPlace . <http://news.yahoo.com/s/nm/20080616/ts_nm/usa_flooding_dc_16 /> kb:containsCity "Burlington" , "Denver" , "St. Paul" , "Chicago" , "Quincy" , "CHICAGO" , "Iowa City" ; kb:containsRegion "U.S. Midwest" , "Midwest" ; kb:containsCountry "United States" , "Japan" ; kb:containsState "Minnesota" , "Illinois" , "Mississippi" , "Iowa" ; kb:containsOrganization "National Guard" , "U.S. Department of Agriculture" , "White House" , "Chicago Board of Trade" , "Department of Transportation" ; kb:containsPerson "Dena Gray-Fisher" , "Donald Miller" , "Glenn Hollander" , "Rich Feltes" , "George W. Bush" ; kb:containsIndustryTerm "food inflation" , "food" , "finance ministers" , "oil" .