先日のエントリでも少し触れましたが、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とまったく同じです。