BluePrints
各グラフDBに対するインタフェース、APIを提供するソフトウェア。
複数のグラフDBに対応している。
ライブラリ追加
blueprints-core と好きなGraphDB用のライブラリを追加する。
今回はNeo4jを選んだので blueprints-neo4j-graph を追加。
手元でちょうどPlay Framework触ってたのでビルドツールはSBT。
libraryDependencies ++= Seq(
"com.tinkerpop.blueprints" % "blueprints-core" % "2.6.0",
"com.tinkerpop.blueprints" % "blueprints-neo4j-graph" % "2.6.0"
)
DB初期化〜読み書き
DBの初期化からデータの追加、検索を行うとこんな感じになる。
package app;
import com.tinkerpop.blueprints.Edge;
import com.tinkerpop.blueprints.Graph;
import com.tinkerpop.blueprints.Vertex;
import com.tinkerpop.blueprints.impls.neo4j.Neo4jGraph;
public class GraphDB {
public static void main(String[] args) {
/**
* init
* 使用するグラフDB用のディレクトリを指定する。
* このタイミングでロックファイルを作成し、排他制御をかける。
* ディレクトリが存在しない場合は初期化してくれる。
*/
Graph g = new Neo4jGraph("data/graphdb");
addData(g);
showData(g);
/**
* close
* プログラムを終了する時は必ずshutdown。
* ロックの解放とか諸々やってるっぽい。
*/
g.shutdown();
}
/**
* Add Node and Edge
* @param g
*/
public static void addData(Graph g) {
/**
* insert
* Vertex(頂点、Node)の追加+属性の追加。
*/
Vertex v1 = g.addVertex(1);
v1.setProperty("name", "Apache");
Vertex v2 = g.addVertex(2);
v2.setProperty("name", "Nginx");
/**
* insert
* Edge(辺、Link)の追加+属性の追加。
*/
Edge e1 = g.addEdge(1, v1, v2, "similar");
e1.setProperty("since", 2006);
}
/**
* show graph data
* @param g
*/
public static void showData(Graph g) {
/**
* select
* とりあえず全部取得して表示。
*/
for (Vertex v : g.getVertices()) {
System.out.println("Vertex id = " + v.getId().toString()
+ " property 'name' = " + v.getProperty("name"));
}
for (Edge e : g.getEdges()) {
System.out.println("Edge id = " + e.getId().toString()
+ " property 'since' = " + e.getProperty("since"));
}
}
}
Vertex id = 1 property 'name' = Apache Vertex id = 2 property 'name' = Nginx Edge id = 0 property 'since' = 2006
初見の印象
とりあえず触ってみたところ、特に良いなと思ったのが下記。
- サーバ構築不要
- 移植性が高い
BruePrintsにはNeo4jのライブラリが同梱されているらしく、DBとはいうもののサーバ構築やサービス起動などの一般的なミドルウェア追加時の作業を行わなくても上記のコードだけで扱うことができる。
もちろん、サーバとして起動して外部からのアクセスを待ち受けたりもできるとのこと。
また、移植性も高い。
new Neo4jGraph(“data/graphdb”) で指定したディレクトリの移動だけで移植が完了する模様。
グラフDBにはスケールしづらいという弱点があるらしいが、その分これだけ軽量になっているのは魅力的。