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

21. 関係データベースの利用1

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

21.1. 関係データベースの利用

アプリケーションが起動していないときでも、値を保存し続けるオブジェクトの性質を永続性といいます。 例えば Jena で知識データベースを構築するとします。 そこで使用されるデータは、アプリケーションが起動したり終了したりするびに読み込みや保存が必要になります。 テキストファイルとして保存することも解決策の一つです。 しかし巨大なデータの処理やデータ共有などに向いているとはいえません。 RDF モデルを永続化する機能として Jena には関係データベースを利用する方法が提供されています。

Jena は MySQL, Oracle, PostgreSQL の3つの関係データベースに対応しています。 接続には JDBC が利用されているため、使用するデータベースの種類や そのバージョンに応じた JDBC ドライバを用意する必要があります。 JDBC ドライバはデータベースや JDK のバージョンによって変わるので環境にあったものを用意します。 JDBC 自体の解説は要旨を外れるのでここでは省略します。 ここからは PostgreSQL8.0 を例に説明していきます。

21.2. RDFモデルの作成

データベースを利用するといっても基本的な操作の多くはは変わりません。 他のモデルとの違いは1つはモデルの作成や接続、削除の手順です。 もう1つはデータベースに保存される複数のモデルの識別を行うために名前をつける点です。 それではまず永続性のあるモデルの作成を行いましょう。

準備として JDBC ドライバを用意します。 例えば PostgreSQL8.0 と JDK5.0 の場合 postgresql-8.0-314.jdbc3.jar を用意してクラスパスに指定しておきます。 プログラム上での手順は次のようになります。

  1. JDBC ドライバ(org.postgresql.Driver)のロード
  2. RDBMS の URL, ユーザ名, パスワード, DBの種類を引数にコネクション(DBConnection)の作成
  3. モデル作成用の ModelMaker の作成
  4. モデル(Model)の作成
  5. モデルの操作
  6. コネクションの開放

上の手順を見て分かるようにデータベースを利用すると意識的にモデルを保存する必要がなくなります。 モデルに与えた処理は適宜データベースに反映されます。

次のプログラムは、データベース上に"test"という名前のモデルを作成するコードです。

ModelRDBCreate.java

1:  import com.hp.hpl.jena.db.DBConnection;
2:  import com.hp.hpl.jena.rdf.model.Model;
3:  import com.hp.hpl.jena.rdf.model.ModelFactory;
4:  import com.hp.hpl.jena.rdf.model.ModelMaker;
5:  import com.hp.hpl.jena.vocabulary.DC;
6:  
7:  public class ModelRDBCreate {
8:     public static void main(String[] args) {
9:        try {
10:           Class.forName("org.postgresql.Driver");//---1---
11:           
12:           String URL = "jdbc:postgresql:Training";
13:           String USER = "postgres";
14:           String PASSWORD = "";
15:           String TYPE = "PostgreSQL";
16:           
17:           DBConnection conn = new DBConnection(
18:                URL, USER, PASSWORD, TYPE);//---2---
19:           
20:           ModelMaker maker = 
21:            ModelFactory.createModelRDBMaker(conn);//---3---
22:           
23:           Model model = maker.createModel("test");//---4---
24:           
25:           model.add(model.createResource("http://tech.4dd.co.jp/")
26:                , DC.creator, "四次元データ");//---5---
27:           model.write(System.out, "RDF/XML");
28:           
29:           conn.close();//---6---
30:        } catch (Exception e) {
31:           e.printStackTrace();
32:        }
33:     }
34:  }

10行目が接続に必要な PostgreSQL 用の JDBC ドライバのロードです。 17行目の DBConnection のインスタンス化については前から順にデータベースの URL 、アカウント、パスワード、データベースの種類です。

17:           DBConnection conn = new DBConnection(
18:                URL, USER, PASSWORD, TYPE);//---2---

ModelRDBCreate の例では、このプログラムと同じマシン上で動作している Training というデータベースに postgres というアカウントで接続しています。 ここで使用する URL は JDBC で使用されるものです。 第4引数については使用するデータベースの名前を与えます。 Oracle の場合は"Oracle"、MySQL の場合は"MySQL"を指定します。

20,21行目ではデータベースに接続したModelを作成するための特殊な ModelMaker を作成します。 それを利用して"test"という名前を持った RDFモデル を作成します。

20:           ModelMaker maker = 
21:            ModelFactory.createModelRDBMaker(conn);//---3---
22:           
23:           Model model = maker.createModel("test");//---4---

上で使用している ModelMaker の createModel メソッドですが3種類あります。

メソッド 説明
Model createModel(java.lang.String name) name という名前を持つモデルがすでに存在する場合は、そのインスタンスを返します。 存在していない場合は新たにモデルを生成してインスタンスを返します。 createModel(name, false) と同じ動作です。
Model createModel(java.lang.String name, boolean strict) 第2引数が false の場合はcreateModel(java.lang.String name)と同じ動作をします。 第2引数が true の場合は、nameという名前を持つモデルが存在していない場合にのみ、新たにモデルを生成してインスタンスを戻します。 既に存在している場合は AlreadyExistsException を発生します。
Model createDefaultModel() 名前のない RDF モデルを返します。このようなモデルは各データベースに1個のみしか存在しません。

例えば上記の ModelRDBCreate の例の場合、createModelメソッドを23行目のように使用しています。

23:           Model model = maker.createModel("test");//---4---

この場合データベースに"test"という名前のモデルが事前に存在しても、存在しなくても動作します。 存在ていなかったか存在しても空だった場合次のような出力をします。

<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:dc="http://purl.org/dc/elements/1.1/" >
  <rdf:Description rdf:about="http://tech.4dd.co.jp/">
    <dc:creator>四次元データ</dc:creator>
  </rdf:Description>
</rdf:RDF>

事前にステートメントを含んでいた場合は、出力にこれらが追加されます。 一方で23行目を次のように書き換えると"test"という名前のモデルが事前に存在した場合に例外を発するようになります。

Model model = maker.createModel("test",true);

最後に29行目のコネクション開放についてです。

29:           conn.close();//---6---

データベースに対して接続できるコネクション数には限度があるため、それを超えると接続できなくなります。。 今回のような動作期間の短いアプリケーションでは、あまり関係ありませんが、 知識データベースのように長期間動き続けるアプリケーションでは重要です。 必要以上に多くのコネクションを保持せずに、使用しなくなったものは適切に開放する必要があります。



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

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