24
Neo4j Javaプログラムから使う (ローカルとリモート) 初心者向け/Java開発者向け @madgaoh

Neo4j を Javaプログラムから使う

Embed Size (px)

DESCRIPTION

Neo4j をローカルまたはリモートで使うときの関係クラスを整理してみました (Java開発者向け・Neo4j初心者向け) 2013年5月25日(日) の「第2回Neo4j 勉強会」での発表資料です。

Citation preview

Page 1: Neo4j を Javaプログラムから使う

Neo4j を Javaプログラムから使う (ローカルとリモート)

初心者向け/Java開発者向け

@madgaoh

Page 2: Neo4j を Javaプログラムから使う

今日の登場人物

ExecutionEngine

<<interface>> GraphDatabaseService

EmbeddedReadOnly GraphDatabase

neo4j-server (HTTP)

(RESTful) (JSON)

CypherPlugIn

neo4j-rest-graphdb

neo4j-cypher-plugin

neo4j-cypher

neo4j-kernel

EmbeddedGraphDatabase

Client-Side

Server-Side

data

<<interface>> RestAPI

2

RestGraphDatabase

RestAPIFacade

RestCypherQueryEngine

Page 3: Neo4j を Javaプログラムから使う

必要なjarファイルを classpathに通す

http://docs.neo4j.org/chunked/stable/tutorials-java-embedded-setup.html

• Neo4jをダウンロードして libディレクトリの下にあるjarを全部classpathに通す

• Mavenを使って依存jar一式を取得する <dependencies> <dependency> <groupId>org.neo4j</groupId> <artifactId>neo4j</artifactId> <version>1.8.2</version> </dependency> </dependencies>

3

Page 4: Neo4j を Javaプログラムから使う

ローカルで使う

data EmbeddedGraphDatabase

neo4j-kernel

EmbeddedGraphDatabase graphdb = new EmbeddedGraphDatabase("path/to/db/data"); Node nodeA = graphdb.createNode(); Node nodeB = graphdb.createNode(); nodeA.createRelationshipTo(nodeB, MyTypeEnum.FRIEND); graphdb.shutdown();

4

Page 5: Neo4j を Javaプログラムから使う

ローカルで使う

data EmbeddedGraphDatabase

neo4j-kernel

EmbeddedGraphDatabase graphdb = new EmbeddedGraphDatabase("path/to/db/data"); Node nodeA = graphdb.createNode(); Node nodeB = graphdb.createNode(); nodeA.createRelationshipTo(nodeB, MyTypeEnum.FRIEND); graphdb.shutdown();

もしまだ無ければ 新規作成される

注意 最後は必ずシャットダウン

5

Page 6: Neo4j を Javaプログラムから使う

ローカルで使う (ファクトリ経由で生成する)

<<interface>> GraphDatabaseService

data EmbeddedGraphDatabase

neo4j-kernel

GraphDatabaseService graphdb = new GraphDatabaseFactory() .newEmbeddedDatabase (" path/to/db/data "); Node nodeA = graphdb.createNode(); Node nodeB = graphdb.createNode(); nodeA.createRelationshipTo(nodeB, MyTypeEnum.FRIEND); graphdb.shutdown();

6

Page 7: Neo4j を Javaプログラムから使う

ローカルで使う (ビルダーでカスタマイズする)

<<interface>> GraphDatabaseService

EmbeddedReadOnly GraphDatabase

data EmbeddedGraphDatabase

neo4j-kernel

GraphDatabaseService graphdb = new GraphDatabaseFactory() .newEmbeddedDatabaseBuilder(" path/to/db/data ") .setConfig(GraphDatabaseSettings.read_only, "true") .newGraphDatabase(); Node nodeA = graphdb.createNode(); graphdb.shutdown();

7

リードオンリーの指定

Page 8: Neo4j を Javaプログラムから使う

ローカルで使う (ビルダーでカスタマイズする)

<<interface>> GraphDatabaseService

EmbeddedReadOnly GraphDatabase

data EmbeddedGraphDatabase

neo4j-kernel

GraphDatabaseService graphdb = new GraphDatabaseFactory() .newEmbeddedDatabaseBuilder(" path/to/db/data ") .setConfig(GraphDatabaseSettings.read_only, "true") .newGraphDatabase(); Node nodeA = graphdb.createNode(); graphdb.shutdown();

8

もしまだ無ければ 例外発生!

書き込み操作はできない (例外発生!)

Page 9: Neo4j を Javaプログラムから使う

ローカルで使う (Cypherのクエリで検索する)

ExecutionEngine

<<interface>> GraphDatabaseService

EmbeddedReadOnly GraphDatabase

neo4j-cypher

neo4j-kernel

EmbeddedGraphDatabase data

GraphDatabaseService graphdb = new GraphDatabaseFactory() .newEmbeddedDatabaseBuilder(" path/to/db/data ") .newGraphDatabase(); ExecutionEngine engine = new ExecutionEngine(graphdb); Map<String, Object> params = new HashMap<>(); params.put("id", 1); ExecutionResult result = engine.execute("START n = node({id}) RETURN n", params);

9

Page 10: Neo4j を Javaプログラムから使う

ローカルで使う (Cypherのクエリで検索する)

ExecutionEngine

<<interface>> GraphDatabaseService

EmbeddedReadOnly GraphDatabase

neo4j-cypher

neo4j-kernel

EmbeddedGraphDatabase data

GraphDatabaseService graphdb = new GraphDatabaseFactory() .newEmbeddedDatabaseBuilder(" path/to/db/data ") .newGraphDatabase(); ExecutionEngine engine = new ExecutionEngine(graphdb); Map<String, Object> params = new HashMap<>(); params.put("id", 1); ExecutionResult result = engine.execute("START n = node({id}) RETURN n", params);

注意 Cypher は Scala で書かれており、 ExecutionEngine は同名のクラスでも Scala 用と Java 用があるので、正解は Package名に .javacompat と付く方

10

Page 11: Neo4j を Javaプログラムから使う

RESTfulサーバとして起動する

ExecutionEngine

<<interface>> GraphDatabaseService

EmbeddedReadOnly GraphDatabase

neo4j-server (HTTP)

(RESTful) (JSON)

neo4j-cypher

neo4j-kernel

EmbeddedGraphDatabase

Client-Side

Server-Side

data

> curl -X POST http://server:7474/db/data/node -d {"last_name": "satake", "first_name": "masahiro"}' > curl -X GET http://server:7474/db/data/node/1

Jetty (AppServer) +

Jersey (JAX-RS) +

Jackson (JSON)

11

Page 12: Neo4j を Javaプログラムから使う

neo4j-rest-graphdb とは

• Neo4jのREST-APIをラップしてくれるクライアントサイド用Javaライブラリ

• Mavenリポジトリが別になっている – セントラルに登録されていない

• pom.xml に リポジトリの追加の設定が必要

• GitHubで見ると java-rest-binding という名前になっている – 寄贈されたもの・・・(だけど neo4j-contrib でもない・・・?) – 本体のバージョンと完全には同期していない

• 5/22 現在の最新は1.8.1

– Branch 1.8.1を見ると1.8.2を追いかけてはいる • 同時に1.9-SNAPTSHOT 2.0-SNAPSHOT もある

https://github.com/neo4j/java-rest-binding

12

Page 13: Neo4j を Javaプログラムから使う

neo4j-rest-graphdb (Mavenリポジトリを追加)

<repositories> <repository> <id>neo4j-public-repository</id> <name>Publically available Maven 2 repository for Neo4j</name> <url>http://m2.neo4j.org</url> </repository> </repositories> : <dependencies> <dependency> <groupId>org.neo4j</groupId> <artifactId>neo4j-rest-graphdb</artifactId> <version>1.8.1</version> </dependency> </dependencies>

13

Page 14: Neo4j を Javaプログラムから使う

neo4j-rest-graphdb (Server側と本体バージョン合わせる)

1) 本体のライブラリだけ明示的に1.8.2にする <dependencies> : <dependency> <groupId>org.neo4j</groupId> <artifactId>server-api</artifactId> <version>1.8.2</version> </dependency> <dependency> <groupId>org.neo4j</groupId> <artifactId>neo4j-kernel</artifactId> <version>1.8.2</version> </dependency> <dependency> <groupId>org.neo4j</groupId> <artifactId>neo4j-lucene-index</artifactId> <version>1.8.2</version> </dependency> : </dependencies>

2) 1.9-SNAPSHOT(RC2) に上げてしまう <repositories> <repository> <id>neo4j-public-repository</id> <name>Publically available Maven 2 repository for

Neo4j</name> <url>http://m2.neo4j.org</url> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories> : <dependencies> <dependency> <groupId>org.neo4j</groupId> <artifactId>neo4j-rest-graphdb</artifactId> <version>1.9-SNAPSHOT</version> </dependency> </dependencies>

3) ブランチ最新ソースからビルド

14

Page 15: Neo4j を Javaプログラムから使う

リモートで使う (neo4j-rest-graphdbを利用)

ExecutionEngine

<<interface>> GraphDatabaseService

EmbeddedReadOnly GraphDatabase

neo4j-server (HTTP)

(RESTful) (JSON)

neo4j-rest-graphdb

neo4j-cypher

neo4j-kernel

EmbeddedGraphDatabase

Client-Side

Server-Side

data

RestAPI api = new RestAPIFacade("http://server:7474/db/data"); Map<String, Object> props = new HashMap<>(); api.createNode(props); api.close();

<<interface>> RestAPI

15

RestAPIFacade

Page 16: Neo4j を Javaプログラムから使う

リモートで使う (neo4j-rest-graphdbを利用)

ExecutionEngine

<<interface>> GraphDatabaseService

EmbeddedReadOnly GraphDatabase

neo4j-server (HTTP)

(RESTful) (JSON)

neo4j-rest-graphdb

neo4j-cypher

neo4j-kernel

EmbeddedGraphDatabase

Client-Side

Server-Side

data

RestAPI api = new RestAPIFacade("http://server:7474/db/data"); Map<String, Object> props = new HashMap<>(); api.createNode(props); api.close();

<<interface>> RestAPI

16

注意 最後は必ずクローズする

RestAPIFacade

Page 17: Neo4j を Javaプログラムから使う

リモートで使う (ローカルの時と同じinterfaceで)

ExecutionEngine

<<interface>> RestAPI

<<interface>> GraphDatabaseService

EmbeddedReadOnly GraphDatabase

neo4j-server (HTTP)

(RESTful) (JSON)

neo4j-rest-graphdb

neo4j-cypher

neo4j-kernel

EmbeddedGraphDatabase

Client-Side

Server-Side

data

GraphDatabaseService graphdb = new RestGraphDatabase(api); // or new RestGraphDatabase ("http://..."); // or GraphDatabaseFactory.databaseFor("http://...");

RestGraphDatabase

RestAPIFacade

17

Page 18: Neo4j を Javaプログラムから使う

<<interface>> RestAPI

<<interface>> GraphDatabaseService

EmbeddedReadOnly GraphDatabase

neo4j-server (HTTP)

(RESTful) (JSON)

neo4j-rest-graphdb

neo4j-cypher

neo4j-kernel

EmbeddedGraphDatabase

Client-Side

Server-Side

data

RestAPI api = new RestAPIFacade("http://server:7474/db/data"); GraphDatabaseService graphdb = new RestGraphDatabase(api); // or new RestGraphDatabase ("http://..."); // or GraphDatabaseFactory.databaseFor("http://..."); Node nodeA = graphdb.createNode(); graphdb.shutdown();

ExecutionEngine

RestGraphDatabase

RestAPIFacade

リモートで使う (ローカルの時と同じInterfaceで)

18

Page 19: Neo4j を Javaプログラムから使う

<<interface>> RestAPI

<<interface>> GraphDatabaseService

EmbeddedReadOnly GraphDatabase

neo4j-server (HTTP)

(RESTful) (JSON)

neo4j-rest-graphdb

neo4j-cypher

neo4j-kernel

EmbeddedGraphDatabase

Client-Side

Server-Side

data

RestAPI api = new RestAPIFacade("http://server:7474/db/data"); GraphDatabaseService graphdb = new RestGraphDatabase(api); // or new RestGraphDatabase ("http://..."); // or GraphDatabaseFactory.databaseFor("http://..."); Node nodeA = graphdb.createNode(); graphdb.shutdown();

ExecutionEngine

RestGraphDatabase

RestAPIFacade

リモートで使う (ローカルの時と同じInterfaceで)

19

注意 ここでも最後は必ずシャットダウン (サーバはシャットダウンされない。 内部のRestAPIやリソースの開放)

Page 20: Neo4j を Javaプログラムから使う

リモートで使う (Cypherのクエリで検索する)

ExecutionEngine

<<interface>> GraphDatabaseService

EmbeddedReadOnly GraphDatabase

neo4j-server (HTTP)

(RESTful) (JSON)

neo4j-rest-graphdb

neo4j-cypher

neo4j-kernel

EmbeddedGraphDatabase

Client-Side

Server-Side

data

<<interface>> RestAPI

GraphDatabaseService graphdb = new RestGraphDatabase(api); ExecutionEngine engine = new ExecutionEngine(graphdb);

RestGraphDatabase

RestAPIFacade

ExecutionEngine

20

Page 21: Neo4j を Javaプログラムから使う

リモートで使う (Cypherのクエリで検索する)

ExecutionEngine

<<interface>> GraphDatabaseService

EmbeddedReadOnly GraphDatabase

neo4j-server (HTTP)

(RESTful) (JSON)

neo4j-rest-graphdb

neo4j-cypher

neo4j-kernel

EmbeddedGraphDatabase

Client-Side

Server-Side

data

<<interface>> RestAPI RestGraphDatabase

RestAPIFacade

ExecutionEngine

21

GraphDatabaseService graphdb = new RestGraphDatabase(api); ExecutionEngine engine = new ExecutionEngine(graphdb);

注意 Client-Sideで Cypher クエリを使う場合に Server側の cypher ライブラリは使わない

Page 22: Neo4j を Javaプログラムから使う

リモートで使う (Cypherのクエリで検索する)

ExecutionEngine

<<interface>> GraphDatabaseService

EmbeddedReadOnly GraphDatabase

neo4j-server (HTTP)

(RESTful) (JSON)

CypherPlugIn

neo4j-rest-graphdb

neo4j-cypher-plugin

neo4j-cypher

neo4j-kernel

EmbeddedGraphDatabase

Client-Side

Server-Side

data

<<interface>> RestAPI

RestAPI api = new RestAPIFacade("URL…"); RestCypherQueryEngine engine = new RestCypherQueryEngine(api);

RestGraphDatabase

RestAPIFacade

RestCypherQueryEngine

22

Page 23: Neo4j を Javaプログラムから使う

ExecutionEngine neo4j-server (HTTP)

(RESTful) (JSON)

CypherPlugIn

neo4j-rest-graphdb

neo4j-cypher-plugin

neo4j-cypher

neo4j-kernel

Client-Side

Server-Side

<<interface>> RestAPI

RestAPI api = new RestAPIFacade("URL…"); RestCypherQueryEngine engine = new RestCypherQueryEngine(api); Map<String, Object> params = new HashMap<>(); params.put("id", 1); QueryResult result = engine.query ("START n = node({id}) RETURN n", params);

RestGraphDatabase

RestAPIFacade

RestCypherQueryEngine

23

リモートで使う (Cypherのクエリで検索する)

Page 24: Neo4j を Javaプログラムから使う

ご清聴ありがとうございました

ExecutionEngine

<<interface>> GraphDatabaseService

EmbeddedReadOnly GraphDatabase

neo4j-server (HTTP)

(RESTful) (JSON)

CypherPlugIn

neo4j-rest-graphdb

neo4j-cypher-plugin

neo4j-cypher

neo4j-kernel

EmbeddedGraphDatabase

Client-Side

Server-Side

data

<<interface>> RestAPI

24

RestGraphDatabase

RestAPIFacade

RestCypherQueryEngine