Webアプリ開発エンジニアのための技術情報サイト「テックスコア」

22.関係データベースの利用2

2006.06.14 株式会社四次元データ 中井隆史

22.1. RDFモデルへの接続

前章ではデータベースを利用した永続性のある RDF モデルの作成の仕方を説明しました。 しかし作成しただけで次回以降接続できなければ意味がないので、 ここではデータベース内にあるモデルへの接続の仕方を説明します。

接続の仕方と言っても前章で説明した作成の仕方とほぼ同じです。 ここでは接続用のメソッドの openModel() を紹介します。 ModelMaker の createModel メソッドでも接続できなくはありませんが可能な処理や実装が異なります。 下の表は openModel() の主な種類です。

メソッド 説明
Model openModel(java.lang.String name) nameという名前を持つモデルがすでに存在する場合は、その Model オブジェクトを返します。 存在していない場合は新たにモデルを生成して Model オブジェクトを返します。 openModel(name, false) と同じ動作です。
Model openModel(java.lang.String name, boolean strict) 第2引数が false の場合は openModel(name) と同じ動作をします。 第2引数が true の場合は、nameという名前を持つモデルが存在している場合にのみ、その Model オブジェクトを戻します。 存在していない場合は DoesNotExistException を発生します。
Model openModel() 名前のない Model オブジェクトを返します。

特に重要なのは openModel(name, true) という使い方です。 前章で使用した ModelRDBCreate.java の23行目を次のように変更してみましょう。

23:           Model model = maker.openModel("test",true);//---4---

前章の例とは逆に事前に"test"という名前のモデルがデータベース内に場合にのみ出力がされるようになります。

22.2. RDF モデルの削除

現在公式HPに載っている資料は少し古いため、推奨されている ModelMaker を使用する手法には、 データベースから RDF モデルを削除する方法は無いことになっています。 しかしライブラリ自体は更新されているので、次のような手順で削除が行えるようになっています。

ModelMaker maker = ModelFactory.createModelRDBMaker(conn);

ModelRDB rdbmodel=(ModelRDB)maker.openModel("test");

rdbmodel.remove();

ここで使用している com.hp.hpl.jena.db.ModelRDB は、データベースを使用する RDF モデルのためのクラスです。 元々の仕様では maker.openModel("test") は、Model のオブジェクトを返していたのですが 現在は Model インタフェースやデータベース固有の機能を実装した ModelRDB クラスのオブジェクトを返すようになっています。 そのため上のようにキャストすることでデータベースから RDF モデルを削除する remove() メソッドが使用可能になります。

22.3. トランザクション処理

Jena から関係データベースを使用する場合、トランザクション機能を使用することができます。 この機能は Model インタフェースの次のようなメソッドを利用して使用します。

Model インタフェースのトランザクションに関するメソッド

メソッド 説明
boolean supportsTransactions() その Model オブジェクトがトランザクション処理をサポートしているかどうかを返します。
Model begin() 新しいトランザクションを開始します。
Model abort() 現在進行しているトランザクションの操作を廃棄し開始時点の状態に戻します。
Model commit() 現在進行しているトランザクションをコミットします。

これらのメソッドは Model インタフェースですが、基本的にデータベースを利用するとき限定の機能です。 例えば処理A、B、Cが全て成功した場合にのみ、これらの処理を確定し、 どれか一つでも失敗した(例外が発生した)場合に全てを取り消すには次のようにします。

try{
  model.begin();
  処理 A
  処理 B
  処理 C
  
  //例外が発生しなかった場合、処理A、B、Cをコミットする。
  model.commit();
} catch (Exception e) {
  //例外が発生した場合、処理A、B、Cを全て取り消す。
  model.abort();
  e.printStackTrace();
} 

トランザクション処理を行わない場合は処理の一つ一つが自動的にコミットされます。



前のページへ TECHSCOREのTOPページへ  
TECHSCORE PR
PR
PR
PR
PR
PR

techscore(トップページへ)
TECHSCORE書店
TECHSCOREトップページJavaSQLXMLリッチクライアントモデリングセマンティックWebその他技術Tuigwaa