LoginSignup
6
6

More than 5 years have passed since last update.

Java組み込みでNeo4jを使う

Last updated at Posted at 2015-08-12

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に以下を追加する

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 {

            //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を編集する

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

6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6