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とまったく同じです。