neo4jを使ってみる その3

先日のエントリでも少し触れましたが、neo4jの拡張コンポーネントパッケージApocというものを使うと(主にLuceneを使用して)インデックスからノードを検索することができます。一発でノードを引くことができるのでグラフデータベースとしてはなんだか邪道な機能のような気もしますが、使ってみるとやはり便利な機能です。
インデックスはプログラム中でIndexServiceを使用して明示的に作成する必要があります。インデックスの作成と検索のコード例はこんな感じ。

// DBの保存先ディレクトリを指定してDBのインスタンスを生成
GraphDatabaseService graphDb = new EmbeddedGraphDatabase("db");
// トランザクションを開始
Transaction tx = graphDb.beginTx();
// インデックスサービス
IndexService index = new LuceneIndexService( graphDb );

try {
  Node personNode = graphDb.createNode();
  personNode.setProperty( "name", "Naoki Takezoe" );

  // インデックスを作成
  index.index( personNode, "name", personNode.getProperty( "name" ) );

  // インデックスを使用して一致するノードのリストを取得
  IndexHits<Node> nodeList = index.getNodes("name", "Naoki Takezoe");
  for(Node node: nodeList){
    System.out.println(node.getProperty("name"));
  }

  // インデックスを使用して1件取得
  Node node = index.getSingleNode("name", "Naoki Takezoe");
  System.out.println(node.getProperty("name"));

  // 処理が成功
  tx.success();

} catch(Exception ex){
  // 処理が失敗
  tx.failure();

} finally {
  // トランザクションを終了してDBをシャットダウン
  tx.finish();
  index.shutdown();
  graphDb.shutdown();
}

上記の例で使用しているLuceneIndexServiceはLuceneを使用してインデックスを作成するためのサービスで、完全一致による検索を行うことができます。LuceneIndexServiceの代わりにLuceneFulltextIndexServiceを使用することで全文検索を行うこともできます。使い方はLuceneIndexServiceとまったく同じです。

Java Standard EL Functions 1.1.0をリリースしました

汎用的なJSP-EL関数を提供するライブラリJava Standard EL Functions 1.1.0をリリースしました。

このバージョンでの変更点は以下の通りです。

  • FunctionsFilterを追加。このフィルタをweb.xmlに登録しないとJava Standard EL Functionsの一部の機能が利用できません。
  • f:json()、f:query()、f:matches()、f:replace()、f:js()、f:concat()、f:contains()を追加。
  • log:trace()などLog4jでログを出力するための関数群を追加。
  • $context変数を追加。

注意点としてはweb.xmlにFunctionsFilterの登録が必要になったという点です。それと、大きなところではLog4jを使ってJSPからログを出力する関数を追加しました。こんな感じで使います。

<%@ taglib uri="http://amateras.sf.jp/log4j" prefix="log" %>
...
${log:debug('デバッグログです。')}

このときLoggerの名前は以下のルールで決定されます。

  1. HttpServletRequest#getServletPath()でサーブレットパスを取得
  2. サーブレットパスの先頭の / と末尾の .jsp を除去
  3. jsp.サーブレットパスの / を . に変換した文字列 をLogger名とする

たとえば、/index.jsp の場合は jsp.index、/admin/index.jsp の場合は jsp.admin.index がLogger名になります。 Log4j側ではこれらのLoggerに対応するアペンダを定義しておくことでJSPから出力されるログを制御することができます。

組み込み型グラフデータベース「neo4j 1.0」を試してみよう

マイコミジャーナルでneo4jのハウツー記事を書きました。

ここしばらくneo4jをいじっていたのはこの記事を書くためだったのですが、グラフデータベースということで敷居が高いのかなと思っていたのですが、当初の予想よりもはるかに手軽に使うことができました。
Luceneを使用したノード検索など実用的な機能も備えていますし、コマンドラインシェルやEclipseプラグイン、jo4neoのようなオブジェクトマッパや各種フレームワークとの統合機能など、周辺のツールやライブラリも充実しています。バージョンは1.0ですが、長年製品開発に利用されて生きた実績があるようなので性能や安定性の面でも不安は少ないでしょう。
neo4jを利用するにあたり、ネックになるのはやはりライセンスがAGPL3であるという点です。オンラインサービスでの利用時にもソース公開の義務が生じるというのは結構強烈です。商用のサービスではライセンスの購入は必須といってもいいかもしれませんが、ライセンスもそれほど安くはないので(特にエンタープライズ向けのエディションは非常に高価です)、そこが障壁になりそうな気はします。
とはいえ、オープンソースでフル機能を利用することができますし、ソースも公開されているので、とりあえず評価が手軽にできるという点では完全にクローズドな商用の製品と比べると導入しやすいのではないかと思います。