neo4jを使ってみる その1

neo4jは組み込み型のグラフデータベースエンジンとのこと。

グラフ(ネットワーク)データベースではノードとリレーションでデータを表現していきます。リレーショナルデータベースと違って各ノードは自由なスキーマを持てるのと、検索するときはノードをたどって目的のノードを探すので、RDBMSと比べると自由度が高い反面、検索はごりごりロジックを組む必要があります。
というわけで、まずはノードを追加するコード。

// DBの保存先ディレクトリを指定してDBのインスタンスを生成
GraphDatabaseService graphDb = new EmbeddedGraphDatabase("db");

// トランザクションを開始
Transaction tx = graphDb.beginTx();

try {
  // ノードを作成
  Node firstNode = graphDb.createNode();
  firstNode.setProperty("name", "Naoki Takezoe");
  firstNode.setProperty("mail", "takezoe@gmail.com");
  
  // 処理が成功
  tx.success();

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

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

nao4jはトランザクションをサポートしており、beginTx()しておかないと検索も更新もできません。tx.success()でいわゆるコミット、tx.failure()でロールバックになるみたいです。
ちゃんとノードが追加されているかを確認するために、データベース内のノードを全部表示してみます。

// すべてのノードを表示
for(Node node: graphDb.getAllNodes()){
  System.out.println("ID=" + node.getId());
  for(String key: node.getPropertyKeys()){
    System.out.println(key + "=" + node.getProperty(key));
  }
  System.out.println("--");
}

すると以下のように出力されました。とりあえずちゃんと動いているっぽいです。

ID=0
--
ID=1
mail=takezoe@gmail.com
name=Naoki Takezoe
--

続きます。