View
2.363
Download
0
Category
Preview:
DESCRIPTION
Neo4j をローカルまたはリモートで使うときの関係クラスを整理してみました (Java開発者向け・Neo4j初心者向け) 2013年5月25日(日) の「第2回Neo4j 勉強会」での発表資料です。
Citation preview
Neo4j を Javaプログラムから使う (ローカルとリモート)
初心者向け/Java開発者向け
@madgaoh
今日の登場人物
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
必要な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
ローカルで使う
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
ローカルで使う
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
ローカルで使う (ファクトリ経由で生成する)
<<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
ローカルで使う (ビルダーでカスタマイズする)
<<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
リードオンリーの指定
ローカルで使う (ビルダーでカスタマイズする)
<<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
もしまだ無ければ 例外発生!
書き込み操作はできない (例外発生!)
ローカルで使う (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
ローカルで使う (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
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
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
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
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
リモートで使う (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
リモートで使う (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
リモートで使う (ローカルの時と同じ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
<<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
<<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やリソースの開放)
リモートで使う (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
リモートで使う (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 ライブラリは使わない
リモートで使う (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
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のクエリで検索する)
ご清聴ありがとうございました
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
Recommended