グラフデータベースは情報を表す、または格納するのに、ノード、エッジ、プロパティを使います
(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 でどのように実装されているか、また今回使用した登録、検索プログラムの詳細とより複雑なパターンについて紹介できたらと思います