2010年4月30日金曜日

組み込み型グラフデータベース HyperGraphDB で遊ぶ #1

ゴールデンウィークなので、業務では触ることはないであろう、グラフデータベースで遊んでみました
グラフデータベースは情報を表す、または格納するのに、ノード、エッジ、プロパティを使います
(Wikipedia より)
このノード、エッジなどの用語は、データベースの名前ともなっているグラフ理論からきています
従来の RDBMS と比較した場合、グラフデータベースはデータ構造が柔軟で、横断的に情報を抽出することに長けているとされています

最近、オープンソースのグラフデータベース neo4j の 1.0 がリリースされたこと、またそれに関する記事(
InfoQ
マイコミ)も掲載されましたので、既にご存知の方、またはいろいろと試されている方も多いかと思います

今回使用するのは上記の neo4j ではないのですが、同じくオープンソースの組み込み型グラフデータベース、 HyperGraphDB です
まず、HyperGraphDB のサイトよりご使用の環境にあわせたパッケージをダウンロードし、適当な場所に解凍してください
(以降の説明では、解凍した場所を $HGDB_ROOT と表記します)
今回は最新(10/04/30 時点)の HyperGraphDB 1.0 を使用し、説明したいと思います

HyperGraphDB は組み込み型データベースなのでインストール作業は不要なのですが、ストレージ機構として Oracle Berkeley DB を使用しているため、ご使用の環境に Berkeley DB がインストールされていない場合は、別途インストールが必要となります
(Mac OS X や Linux の主なディストリビューションでは標準でインストールされているかと思います)
Google 等で検索頂ければ、各環境でのインストールに関する情報は得られると思いますので、ここでは Berkeley DB のインストールは割愛させて頂きます

また、専用のクライアントアプリケーションは(現時点では)ないので、データ操作は直接 Java のコードを記述して行います
以降の説明ではソースコードの記述、ビルドに関する説明には NetBeans 6.9 Beta を使用しています
他の開発環境をお使いの方は適時読み替えて頂ければと思います

次に開発環境( NetBeans )の準備をします
NetBeans 起動後、"Java アプリケーション" の新規プロジェクトを作成します
作成したプロジェクトを右クリックし、表示されたコンテキストメニューより「プロパティ」を選択します


表示されたプロパティーウィンドウの「カテゴリ」から「実行」を選択します
次に「 VM オプション」のテキストボックスに、"-Djava.library.path=$HGDB_ROOT/native" と入力します
(先述の通り、 $HGDB_ROOT は HyperGraphDB の展開先ですので、環境に合わせて読み替えてください)


「了解」ボタンをクリックし、設定を反映します

プロジェクトツリー内の「ライブラリ」を右クリックし、「 Jar / フォルダを追加」を選択します


Jar / フォルダを追加ウィンドウが開くので、"$HGDB_ROOT/hypergraphdb.jar" を選択します


同様に "$HGDB_ROOT/jars/db.jar" を選択してライブラリに追加します
追加した結果のプロジェクトツリーは以下のようになります


開発環境の準備は以上となります

最後に、簡単なデータの登録と検索(問い合わせ)を行います
まず、データの登録用のクラスを新規作成します
パッケージ名、クラス名は任意で構いませんが、以降は説明のため、"hgdb.sample" パッケージ以下に "Insert" クラスを作成したものとします
作成したクラスに対し、以下のようにソースコードを記述します

package hgdb.sample;

import org.hypergraphdb.HyperGraph;

/**
* データ登録用プログラム
*
* @author Junji Takakura
*/
public class Insert {

public static void main(String[] args) {
// ストレージ(Berkeley DB)用ファイルパスを記述
String databaseLocation = "/tmp/hgdb";

HyperGraph graph = null;

try {
// データベースが存在しなければ、作成、存在していたら、オープンします
graph = new HyperGraph(databaseLocation);
// データベースに "吾輩は猫である" という文字列を登録します
graph.add("吾輩は猫である");
} catch (Exception ex){
ex.printStackTrace();
} finally {
if(graph != null) {
// データベースのクローズ
graph.close();
}
}
}

}

記述後、ファイルを実行(Shift + F6)を実行します
実行時にエラーが発生した場合、先述のプロジェクトプロパティの VM オプション、ライブラリの追加が正しく行われているか確認ください
エラーが発生せず、処理の実行が完了すれば、データの登録は完了です

次に、データの登録用のクラスを新規作成します
("hgdb.sample" パッケージ以下に "Select" クラスを作成したものとします)
作成したクラスに対し、以下のようにソースコードを記述します

package hgdb.sample;

import org.hypergraphdb.HGHandle;
import org.hypergraphdb.HGSearchResult;
import org.hypergraphdb.HyperGraph;
import org.hypergraphdb.query.AtomValueCondition;
import org.hypergraphdb.query.ComparisonOperator;
import org.hypergraphdb.query.HGQueryCondition;

/**
*
* @author Junji Takakura
*/
public class Select {

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// ストレージ(Berkeley DB)用ファイルパスを記述
String databaseLocation = "/tmp/hgdb";

HyperGraph graph = null;

try {
// データベースが存在しなければ、作成、存在していたら、オープンします
graph = new HyperGraph(databaseLocation);
// 検索条件を作成
// 条件は、"吾輩は猫である" という値と等しい(ComparisonOperator.EQ)
// となるデータを取得する
HGQueryCondition condition = new AtomValueCondition(
"吾輩は猫である", ComparisonOperator.EQ);
// 検索実行と結果セットの取得
HGSearchResult<HGHandle> rs = graph.find(condition);

try {
while (rs.hasNext()) {
// 検索結果を HGHandle のインスタンスとして取得します
// HGHandle とは登録したオブジェクトを参照する、
// データベース上で一意となるキーです
// (詳細は次回説明します)
HGHandle current = rs.next();
// 取得したキーにて、データベースよりオブジェクトを取得します
String title = graph.get(current);
// 取得したオブジェクトを標準出力します
// 出力結果は「Found: xxxxxx...」と表示されます
System.out.println("Found: " + title);
}
} finally {
// 結果セットのクローズ
rs.close();
}

} catch (Exception ex) {
ex.printStackTrace();
} finally {
if (graph != null) {
// データベースのクローズ
graph.close();
}
}
}
}

記述後、ファイルを実行(Shift + F6)を実行します
NetBeans の出力ウィンドウに、"Found: 吾輩は猫である" と表示されるかと思います

以上、簡単なデータ登録と検索となります
次回は、ノード、エッジなどのグラフデータベースの概念が HyperGraphDB でどのように実装されているか、また今回使用した登録、検索プログラムの詳細とより複雑なパターンについて紹介できたらと思います

0 件のコメント: