Javaを使ってNeo4jをいじいじするための環境構築にめちゃくちゃ手間取ったので備忘録。
まず、neo4jをJavaでいじる方法は3つある。
1.Javaに組み込む
2.REST APIを使う
3.BluePrint APIを使う
今回は1.Javaに組み込むのやり方でやった。
#準備(使ったもの)
・Mac
・eclipse(Mars)
・Java 7
・maven
あと、neo4jをダウンロードして展開しておく。
あとでサーバ立てて正常にグラフができてるのを確認するのに使う。
#プロジェクトの作成
maven使ったから瞬殺。
mvn archetype:create -DgroupId=com.example -DartifactId=GraphTest
pom.xmlに以下を追加する
<dependencies>
...
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
</dependency>
<dependency>
<groupId>org.neo4j</groupId>
<artifactId>neo4j</artifactId>
<version>2.2.3</version>
</dependency>
<dependency>
<groupId>org.neo4j</groupId>
<artifactId>neo4j-kernel</artifactId>
<version>2.2.3</version>
</dependency>
...
</dependencies>
eclipseのプロジェクトとして認識させるために
mvn eclipse:eclipse
mavenがでneo4jのライブラリはとってきてくれる。
eclipseを起動して、
Import > Existing Maven Projects
で作ったプロジェクトをインポート。これでプロジェクトはオッケー。
#Javaを書く
src/main/java/com/exampleの以下に、NeoTest.javaを作成
package com.example;
import org.neo4j.graphdb.*;
import org.neo4j.graphdb.factory.GraphDatabaseFactory;
import org.neo4j.graphdb.DynamicLabel;
/**
* Example class that constructs a simple graph with message attributes and then prints them.
*/
public class NeoTest {
public enum MyRelationshipTypes implements RelationshipType {
KNOWS
}
public static void main(String[] args) {
GraphDatabaseService graphDb = new GraphDatabaseFactory().newEmbeddedDatabase("data/graphdb");//このパスにグラフが保存される。
Transaction tx = graphDb.beginTx();
try {
//2つのノードと1つの関係を作成
Node firstNode = graphDb.createNode();
Node secondNode = graphDb.createNode();
Relationship relationship = firstNode.createRelationshipTo(secondNode, MyRelationshipTypes.KNOWS);
//それぞれのノードにラベルを追加
Label firstLabel = DynamicLabel.label("dog");
firstNode.addLabel(firstLabel);
Label secondLabel = DynamicLabel.label("cat");
secondNode.addLabel(secondLabel);
//それぞれのノードにプロパティを追加
firstNode.setProperty("message", "pochi ");
secondNode.setProperty("message", "tama");
relationship.setProperty("message", "like ");
tx.success();
//コンソールに印字
System.out.print(firstNode.getProperty("message"));
System.out.print(relationship.getProperty("message"));
System.out.print(secondNode.getProperty("message"));
}
finally {
tx.close();
graphDb.shutdown();
}
}
}
これで実行してコンソールに「pochi like tama」って出たらオッケー。
更にプロジェクト以下に data/graphdb ができてて中にいろいろ入ってることを確認。
#neo4jでグラフの中身を見てみる
準備で展開したneo4jディレクトリにいく。
neo4j/conf/neo4j-server.propertiesを編集する
...
# location of the database directory
org.neo4j.server.database.location=/Users/UserName/Documents/workspace/GraphTest/data/graphdb
#さっきNeoTest.javaで指定したパス
# Low-level graph engine tuning file
org.neo4j.server.db.tuning.properties=conf/neo4j.properties
#コメントアウトとる
...
編集が終わったら、neo4jサーバを起動する
neo4j/bin/neo4j start
起動したら、ブラウザで
http://localhost:7474
に行き、ユーザの設定やらを済ませ、
match all return all
と打って、NeoTest.java通りの結果が出れば完璧。
なお、neo4jサーバを起動させたままでeclipseで実行するとエラーが出るのでご注意を
#やってみて
再度述べると、このやり方はneo4jの標準のライブラリを使ったもの。
やってみるとわかるが実感としては動作がかなり遅い…
計算などに用いるのであればあまり問題はなさそうだが、実際にWebアプリケーションなどを開発するのであればRESTやBluePrintを使ったものの方が良いかもしれない。
※なぜ遅いのか考えてたが、いちいちgraphdbのサーバを立ち上げている(のかな?)のが時間食ってるのかも。
BluePrintを使ったものはやったことがあるので、次はREST APIをつかったものをやってみて、速度の比較などをしてみようと思う。