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" クラスを作成したものとします
作成したクラスに対し、以下のようにソースコードを記述します
  1. package hgdb.sample;  
  2.   
  3. import org.hypergraphdb.HyperGraph;  
  4.   
  5. /** 
  6.  * データ登録用プログラム 
  7.  * 
  8.  * @author Junji Takakura 
  9.  */  
  10. public class Insert {  
  11.   
  12.     public static void main(String[] args) {  
  13.         // ストレージ(Berkeley DB)用ファイルパスを記述  
  14.         String databaseLocation = "/tmp/hgdb";  
  15.   
  16.         HyperGraph graph = null;  
  17.   
  18.         try {  
  19.             // データベースが存在しなければ、作成、存在していたら、オープンします  
  20.             graph = new HyperGraph(databaseLocation);  
  21.             // データベースに "吾輩は猫である" という文字列を登録します  
  22.             graph.add("吾輩は猫である");  
  23.         } catch (Exception ex){  
  24.             ex.printStackTrace();  
  25.         } finally {  
  26.             if(graph != null) {  
  27.                 // データベースのクローズ  
  28.                 graph.close();  
  29.             }  
  30.         }  
  31.     }  
  32.   
  33. }  

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

次に、データの登録用のクラスを新規作成します
("hgdb.sample" パッケージ以下に "Select" クラスを作成したものとします)
作成したクラスに対し、以下のようにソースコードを記述します
  1. package hgdb.sample;  
  2.   
  3. import org.hypergraphdb.HGHandle;  
  4. import org.hypergraphdb.HGSearchResult;  
  5. import org.hypergraphdb.HyperGraph;  
  6. import org.hypergraphdb.query.AtomValueCondition;  
  7. import org.hypergraphdb.query.ComparisonOperator;  
  8. import org.hypergraphdb.query.HGQueryCondition;  
  9.   
  10. /** 
  11.  * 
  12.  * @author Junji Takakura 
  13.  */  
  14. public class Select {  
  15.   
  16.     /** 
  17.      * @param args the command line arguments 
  18.      */  
  19.     public static void main(String[] args) {  
  20.         // ストレージ(Berkeley DB)用ファイルパスを記述  
  21.         String databaseLocation = "/tmp/hgdb";  
  22.   
  23.         HyperGraph graph = null;  
  24.   
  25.         try {  
  26.             // データベースが存在しなければ、作成、存在していたら、オープンします  
  27.             graph = new HyperGraph(databaseLocation);  
  28.             // 検索条件を作成  
  29.             // 条件は、"吾輩は猫である" という値と等しい(ComparisonOperator.EQ)  
  30.             // となるデータを取得する  
  31.             HGQueryCondition condition = new AtomValueCondition(  
  32.                     "吾輩は猫である", ComparisonOperator.EQ);  
  33.             // 検索実行と結果セットの取得  
  34.             HGSearchResult<HGHandle> rs = graph.find(condition);  
  35.   
  36.             try {  
  37.                 while (rs.hasNext()) {  
  38.                     // 検索結果を HGHandle のインスタンスとして取得します  
  39.                     // HGHandle とは登録したオブジェクトを参照する、  
  40.                     // データベース上で一意となるキーです  
  41.                     // (詳細は次回説明します)  
  42.                     HGHandle current = rs.next();  
  43.                     // 取得したキーにて、データベースよりオブジェクトを取得します  
  44.                     String title = graph.get(current);  
  45.                     // 取得したオブジェクトを標準出力します  
  46.                     // 出力結果は「Found: xxxxxx...」と表示されます  
  47.                     System.out.println("Found: " + title);  
  48.                 }  
  49.             } finally {  
  50.                 // 結果セットのクローズ  
  51.                 rs.close();  
  52.             }  
  53.   
  54.         } catch (Exception ex) {  
  55.             ex.printStackTrace();  
  56.         } finally {  
  57.             if (graph != null) {  
  58.                 // データベースのクローズ  
  59.                 graph.close();  
  60.             }  
  61.         }  
  62.     }  
  63. }  

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

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

0 件のコメント: