SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

Java/JRuby開発者のためのセマンティックWeb入門

  • X ポスト
  • このエントリーをはてなブックマークに追加

ダウンロード サンプルソース (1.7 MB)

より優れた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:containsCitykb:containsCountrykb:containsStateの親プロパティとなります。なお、この例でkb:containsCitykb: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 . }";

 このクエリでは、containsRegioncontainsCountrycontainsStateのいずれかと一致する述語を持つすべての記事がマッチします。このSPARQL構文で名前空間の略号(すなわち接頭辞)としてキーワードPREFIXを使用していることに注意してください。

筆者注

 SPARQLクエリを実行するときのRDFフォーマットが違っても、そこに何か差が生じることはありません。SesameのようなRDFストレージのリポジトリにおいて、RDFはある効率的な内部フォーマットで保存されます。開発者はフォーマットと言えばXML RDFかN3 RDFだと考えがちですが、データがいったんリポジトリに読み込まれた後は、最初のRDFフォーマットとして何を使用したかは関係ありません。また、単一のN3ステートメントで通例、多数のRDFトリプル(いずれも同じ主語を持つ)が定義されることを知っておくことも重要です。

 RDFSを使うことで(この例では、親プロパティcontainsPlaceを定義している)RDFデータを変換しなくてもそのアクセスの道筋を変えることができます。一方、リレーショナルデータベースアプリケーションでは、特別なクエリを使うか(この場合、containsPlaceに新しい子プロパティを追加しようとするとクエリの変更が必要)、新しいテーブルもしくはデータベースビューを使う必要があります。確かに、こうした再利用問題はリレーショナルデータベースでも解決できますが、RDFSと比べて柔軟性が著しく低くなります。

 スキーマ/フォーマットの異なる複数のデータソースが存在するような状況では、RDFとRDFSを組み合わせることで、さらに高い柔軟性が得られます。これについては後ほど説明します。

リスト4 RDFからN3に変換するコードによって生成された行
<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" .
リスト5 ファイル「news.n3」の最初の数行

@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" .

次のページ
正規表現によるデータの照合

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Mark Watson(Mark Watson)

Javaコンサルタント。Java、人工知能、C++、知的エージェントに関する書籍を14冊執筆している。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/3163 2008/11/04 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング