Java組み込みでNeo4jを使う

Javaを使ってNeo4jをいじいじするための環境構築にめちゃくちゃ手間取ったので備忘録。

まず、neo4jをJavaでいじる方法は3つある。
1.Javaに組み込む
2.REST APIを使う
3.BluePrint APIを使う

今回は1.Javaに組み込むのやり方でやった。

#準備（使ったもの）
・Mac
・eclipse(Mars)
・Java 7
・maven

あと、[neo4j](http://neo4j.com/download/other-releases/)をダウンロードして展開しておく。
あとでサーバ立てて正常にグラフができてるのを確認するのに使う。


#プロジェクトの作成
maven使ったから瞬殺。
`mvn archetype:create -DgroupId=com.example -DartifactId=GraphTest`

pom.xmlに以下を追加する

```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を作成

```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 {
        	
        	//２つのノードと１つの関係を作成
            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を編集する

```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をつかったものをやってみて、速度の比較などをしてみようと思う。