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 でどのように実装されているか、また今回使用した登録、検索プログラムの詳細とより複雑なパターンについて紹介できたらと思います

2010年4月25日日曜日

NetBeans IDE の条件付きブレークポイントを使う

NetBeans IDE の条件付きブレークポイントの使い方です
以下の説明では、 NetBeans IDE 6.9 Beta を使用していますが、新機能ではないので、6.8 以前でも有効です

まず、エディタにてデバッグしたい箇所にブレイクポイントを設定します
次に、そのブレイクポイントを右クリックし、表示されたコンテキストメニューより「プロパティ」を選択します


また、メニューの「ウィンドウ > デバッグ > ブレイクポイント」と選択して表示されるブレイクポイントウィンドウでも同様の処理が可能です


「プロパティ」を選択すると、「ブレイクポイントプロパティ」ウィンドウが表示されます


まず、条件によって処理のブレイクを行いますので、ウィンドウ内の"条件"チェックボックスを選択し、その条件をテキストボックス内に入力します
テキストボックス内は補完機能が使用可能となっています


例では、"i == 4" となった場合に停止するよう設定します
条件入力後、「了解」ボタンをクリックし、設定を反映します


条件付きブレイクポイントが設定されると、ブレイクポイントアイコンの形が変わります
("■">"「"という感じです)


次に実際にデバッグを行います
(Mac な人は shift + F5 にて実行できます)

処理が停止し、表示された「変数」ウィンドウにて、条件の "i == 4" となっていることがわかります



指定回数処理が行われたかを確認するには、 "ヒットカウント時にブレーク" を使用します
先ほどの「ブレイクポイントプロパティ」ウィンドウにて、 "ヒットカウント時にブレーク" を選択し、停止したい回数を入力します
例では、7回ブレイクポイントを設定した箇所にヒットした(i == 6 となる) 場合に停止するよう設定します


デバッグを実行し、「変数」ウィンドウを確認します
"i == 6" にて停止したことがわかります



以上が条件付きブレークポイントを使い方になります
NetBeans IDE にはこれ以外にも様々なデバッグ支援機能があるので、それらも今後紹介できたらと思います

2010年4月24日土曜日

NetBeans IDE 6.9 で URL の下線を非表示にする

NetBeans IDE 6.9 では、エディタの構文の表示設定が増えています
その1つに URL があるのですが、デフォルトで下線が表示されるようになっています
XML などを編集していると見づらく感じるので、この機能をオフ(非表示)にする方法を紹介します


メニューより "オプション" を選択し、 "オプション" ウィンドウ内の "フォントと色" を選択します
つぎに "カテゴリ" の中から "URL" を選択します
"カテゴリ" の右にある、 "エフェクト" を "下線" から "なし" に変更します


「了解」ボタンをクリックし、設定を反映させます
6.8 と同様に下線が表示されなくなります

2010年4月23日金曜日

NetBeans IDE 6.9 Beta リリース

NetBeans IDE 6.9 M1 がリリースされました
ダウンロードはコチラです
正式版のリリースは、6月の予定となっています

いつも通りのスプラッシュは以下のようになっています


Beta より日本語を含む、多言語版にてリリースされているようです
(Mac な人はデフォルトではニーモニック付きなので、ダウンロードサイトからベータに対応する "nb69beta-ja_mac.zip" をダウンロードして適用ください)


※画像はMac用日本語パックを適用後のものです

何かお気づきの点がありましたら、 ML 等連絡をお願いします

2010年4月22日木曜日

NetBeans IDE 6.9 に追加予定の static import 対応

NetBeans IDE には多くの強力な補完機能を持っていますが、6.8 時点では static import の自動補完("インポートを修正")機能は実装されていません
6.9 でも期待されるような自動補完が実装される可能性は低いのですが、新たにヒント機能が追加される予定となっています
(検証に使用しているバージョンは NetBeans IDE Dev (Build 201004210200) です)

なお、今回試したバージョンではデフォルトで本機能はオフになっていたので、設定を変更する必要があります
メニューより "Options" を選択し、 "Options" ウィンドウ内の "Editor > Hints" の順にタブを選択します
「 Language 」リストボックスより "Java" を選択します
リストボックス下部のボックスより "JDK 1.5 and later" の項目を展開します
この中に "static imports" という項目があるので、これをチェックします


最後に「 OK 」ボタンをクリックしてウィンドウを閉じます

実際に "static import" のヒント機能を使用してみます
まず、 "static import" へ変換可能なメソッドを入力、カーソルがあたっている状態にします
エディタ枠外に以下のようなヒントが表示されます
【追記】
設定変更後、カーソルがあたっていてもヒントが表示されない場合があります
その際は一度ファイルを閉じ、再度開いた上でお試しください
(片貝さん、ご報告ありがとうございます)


このヒントをクリック(Mac では Alt + Enter でも同様)し、ヒントの内容を表示します


"static import" を追加するメッセージが表示されるので、これをクリック、または "enter" キーにて実行します


実行後、 "static import" 文が追加されます

"static import" のヒント機能については以上ですが、現時点では変換可能なメソッドにカーソルがないとヒントが表示されないなど実際の使用には不十分な点が見受けられます
(そのため、標準では機能がオフになっているのかもしれませんが…)
リリースまでにもう少しブラッシュアップされればと思います

2010年4月21日水曜日

Scala 2.8.0.RC1 リリース

(ちょっと前の話ですが)Scala 2.8.0.RC1 がリリースされました
Macports にも反映されています
2.7 系が Scala27 、 2.8 系が Scala28 というパッケージ名になっていますので、ご注意ください
インストール後のバージョン情報は下記のようになっています

scala-2.8 -version
Scala code runner version 2.8.0.RC1 -- Copyright 2002-2010, LAMP/EPFL