マイコミジャーナルで書いた記事も公開されていますが、記事には書いていないことや個人的な所感もあるので、この日記での「neo4jを使ってみる」シリーズはもう少し続けます。
今回はjo4neoというグラフをオブジェクトにマッピングするライブラリを試してみます。O/Rマッパーに対抗してO/G(オブジェクト/グラフ)マッパーといったところでしょうか。
jo4neoではJavaオブジェクトをノードにマッピングします。ノードのプロパティに対応させるフィールドには@neoアノテーションを付与します。@neoアノテーションのindex属性、fulltext属性をtrueにしておくとインデックスを自動的に作成することができます。いちいちIndexServiceを手動で呼び出す必要がないのでこれは便利ですね。また、マッピングするオブジェクトにはNodeid型のフィールドを定義しておく必要があります。
以下はノードにマッピングするJavaクラスの例です。ここではString型のフィールドしか定義していませんが、java.util.Collectionや他のJavaオブジェクトを@neoアノテーション付きのフィールドとして持つことでリレーションを表現することができます。
public class Employee { public transient Nodeid neo; @neo(index=true) public String name; @neo(index=true) public String mail; }
このオブジェクトを永続化してみます。
GraphDatabaseService graphDb = new EmbeddedGraphDatabase("db"); ObjectGraph graph = ObjectGraphFactory.instance().get(graphDb); try { Employee emp = new Employee(); emp.name = "Naoki Takezoe"; emp.mail = "takezoen@gmail.com"; // オブジェクトを永続化 graph.persist(emp); } finally { graph.close(); graphDb.shutdown(); }
上記のコードは新しいオブジェクトを作成して永続化しているだけですが、削除や検索もObjectGraphオブジェクトのメソッドを使用して行うことができます。
このようにjo4neoを使用することでneo4jをオブジェクトデータベース的に使用することができます。O/Rマッパと比べると検索機能は弱いですが、柔軟性の高さが魅力です。
ただし、jo4neoで永続化するノードはjo4neo.Nodeidというプロパティが自動的に定義されます。このプロパティがないとjo4neoはノードをオブジェクトにマッピングすることができません。そのため、既存のグラフをあとからjo4neoでオブジェクトにマッピングするということはできません(ノードにjo4neo.Nodeidプロパティを追加してやれば動きそうな気がしますが…)。グラフをオブジェクトにマッピングするというより、オブジェクトありきの仕組みといえます。
また、jo4neoではObjectGraphクラスのメソッドがトランザクション境界になっているようです。それより大きな粒度でのトランザクションは切れないため、その点をふまえて利用する必要があります。neo4jはエンタープライズ用途にも対応可能とされていますが、jo4neoはちょっと使い道が限られるかもしれませんね。