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

3,185
-1

Published on

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

Published in: Technology
0 Comments
10 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
3,185
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
31
Comments
0
Likes
10
Embeds 0
No embeds

No notes for slide

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

  1. 1. Neo4j をJavaプログラムから使う(ローカルとリモート)初心者向け/Java開発者向け@madgaoh
  2. 2. 今日の登場人物ExecutionEngine<<interface>>GraphDatabaseServiceEmbeddedReadOnlyGraphDatabaseneo4j-server(HTTP)(RESTful)(JSON)CypherPlugInneo4j-rest-graphdbneo4j-cypher-pluginneo4j-cypherneo4j-kernelEmbeddedGraphDatabaseClient-SideServer-Sidedata<<interface>> RestAPI2RestGraphDatabaseRestAPIFacadeRestCypherQueryEngine
  3. 3. 必要な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
  4. 4. ローカルで使うdataEmbeddedGraphDatabaseneo4j-kernelEmbeddedGraphDatabase graphdb= new EmbeddedGraphDatabase("path/to/db/data");Node nodeA = graphdb.createNode();Node nodeB = graphdb.createNode();nodeA.createRelationshipTo(nodeB, MyTypeEnum.FRIEND);graphdb.shutdown();4
  5. 5. ローカルで使うdataEmbeddedGraphDatabaseneo4j-kernelEmbeddedGraphDatabase graphdb= new EmbeddedGraphDatabase("path/to/db/data");Node nodeA = graphdb.createNode();Node nodeB = graphdb.createNode();nodeA.createRelationshipTo(nodeB, MyTypeEnum.FRIEND);graphdb.shutdown();もしまだ無ければ新規作成される注意最後は必ずシャットダウン5
  6. 6. ローカルで使う(ファクトリ経由で生成する)<<interface>>GraphDatabaseServicedataEmbeddedGraphDatabaseneo4j-kernelGraphDatabaseService graphdb= new GraphDatabaseFactory().newEmbeddedDatabase (" path/to/db/data ");Node nodeA = graphdb.createNode();Node nodeB = graphdb.createNode();nodeA.createRelationshipTo(nodeB, MyTypeEnum.FRIEND);graphdb.shutdown();6
  7. 7. ローカルで使う(ビルダーでカスタマイズする)<<interface>>GraphDatabaseServiceEmbeddedReadOnlyGraphDatabasedataEmbeddedGraphDatabaseneo4j-kernelGraphDatabaseService graphdb= new GraphDatabaseFactory().newEmbeddedDatabaseBuilder(" path/to/db/data ").setConfig(GraphDatabaseSettings.read_only, "true").newGraphDatabase();Node nodeA = graphdb.createNode();graphdb.shutdown();7リードオンリーの指定
  8. 8. ローカルで使う(ビルダーでカスタマイズする)<<interface>>GraphDatabaseServiceEmbeddedReadOnlyGraphDatabasedataEmbeddedGraphDatabaseneo4j-kernelGraphDatabaseService graphdb= new GraphDatabaseFactory().newEmbeddedDatabaseBuilder(" path/to/db/data ").setConfig(GraphDatabaseSettings.read_only, "true").newGraphDatabase();Node nodeA = graphdb.createNode();graphdb.shutdown();8もしまだ無ければ例外発生!書き込み操作はできない(例外発生!)
  9. 9. ローカルで使う(Cypherのクエリで検索する)ExecutionEngine<<interface>>GraphDatabaseServiceEmbeddedReadOnlyGraphDatabaseneo4j-cypherneo4j-kernelEmbeddedGraphDatabasedataGraphDatabaseService 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
  10. 10. ローカルで使う(Cypherのクエリで検索する)ExecutionEngine<<interface>>GraphDatabaseServiceEmbeddedReadOnlyGraphDatabaseneo4j-cypherneo4j-kernelEmbeddedGraphDatabasedataGraphDatabaseService 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
  11. 11. RESTfulサーバとして起動するExecutionEngine<<interface>>GraphDatabaseServiceEmbeddedReadOnlyGraphDatabaseneo4j-server(HTTP)(RESTful)(JSON)neo4j-cypherneo4j-kernelEmbeddedGraphDatabaseClient-SideServer-Sidedata> 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/1Jetty (AppServer)+Jersey (JAX-RS)+Jackson (JSON)11
  12. 12. 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-binding12
  13. 13. 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
  14. 14. 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 forNeo4j</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
  15. 15. リモートで使う(neo4j-rest-graphdbを利用)ExecutionEngine<<interface>>GraphDatabaseServiceEmbeddedReadOnlyGraphDatabaseneo4j-server(HTTP)(RESTful)(JSON)neo4j-rest-graphdbneo4j-cypherneo4j-kernelEmbeddedGraphDatabaseClient-SideServer-SidedataRestAPI api = new RestAPIFacade("http://server:7474/db/data");Map<String, Object> props = new HashMap<>();api.createNode(props);api.close();<<interface>> RestAPI15RestAPIFacade
  16. 16. リモートで使う(neo4j-rest-graphdbを利用)ExecutionEngine<<interface>>GraphDatabaseServiceEmbeddedReadOnlyGraphDatabaseneo4j-server(HTTP)(RESTful)(JSON)neo4j-rest-graphdbneo4j-cypherneo4j-kernelEmbeddedGraphDatabaseClient-SideServer-SidedataRestAPI api = new RestAPIFacade("http://server:7474/db/data");Map<String, Object> props = new HashMap<>();api.createNode(props);api.close();<<interface>> RestAPI16注意最後は必ずクローズするRestAPIFacade
  17. 17. リモートで使う(ローカルの時と同じinterfaceで)ExecutionEngine<<interface>> RestAPI<<interface>>GraphDatabaseServiceEmbeddedReadOnlyGraphDatabaseneo4j-server(HTTP)(RESTful)(JSON)neo4j-rest-graphdbneo4j-cypherneo4j-kernelEmbeddedGraphDatabaseClient-SideServer-SidedataGraphDatabaseService graphdb = new RestGraphDatabase(api);// or new RestGraphDatabase ("http://...");// or GraphDatabaseFactory.databaseFor("http://...");RestGraphDatabaseRestAPIFacade17
  18. 18. <<interface>> RestAPI<<interface>>GraphDatabaseServiceEmbeddedReadOnlyGraphDatabaseneo4j-server(HTTP)(RESTful)(JSON)neo4j-rest-graphdbneo4j-cypherneo4j-kernelEmbeddedGraphDatabaseClient-SideServer-SidedataRestAPI 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();ExecutionEngineRestGraphDatabaseRestAPIFacadeリモートで使う(ローカルの時と同じInterfaceで)18
  19. 19. <<interface>> RestAPI<<interface>>GraphDatabaseServiceEmbeddedReadOnlyGraphDatabaseneo4j-server(HTTP)(RESTful)(JSON)neo4j-rest-graphdbneo4j-cypherneo4j-kernelEmbeddedGraphDatabaseClient-SideServer-SidedataRestAPI 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();ExecutionEngineRestGraphDatabaseRestAPIFacadeリモートで使う(ローカルの時と同じInterfaceで)19注意ここでも最後は必ずシャットダウン(サーバはシャットダウンされない。内部のRestAPIやリソースの開放)
  20. 20. リモートで使う(Cypherのクエリで検索する)ExecutionEngine<<interface>>GraphDatabaseServiceEmbeddedReadOnlyGraphDatabaseneo4j-server(HTTP)(RESTful)(JSON)neo4j-rest-graphdbneo4j-cypherneo4j-kernelEmbeddedGraphDatabaseClient-SideServer-Sidedata<<interface>> RestAPIGraphDatabaseService graphdb= new RestGraphDatabase(api);ExecutionEngine engine= new ExecutionEngine(graphdb);RestGraphDatabaseRestAPIFacadeExecutionEngine20
  21. 21. リモートで使う(Cypherのクエリで検索する)ExecutionEngine<<interface>>GraphDatabaseServiceEmbeddedReadOnlyGraphDatabaseneo4j-server(HTTP)(RESTful)(JSON)neo4j-rest-graphdbneo4j-cypherneo4j-kernelEmbeddedGraphDatabaseClient-SideServer-Sidedata<<interface>> RestAPIRestGraphDatabaseRestAPIFacadeExecutionEngine21GraphDatabaseService graphdb= new RestGraphDatabase(api);ExecutionEngine engine= new ExecutionEngine(graphdb);注意Client-Sideで Cypher クエリを使う場合にServer側の cypher ライブラリは使わない
  22. 22. リモートで使う(Cypherのクエリで検索する)ExecutionEngine<<interface>>GraphDatabaseServiceEmbeddedReadOnlyGraphDatabaseneo4j-server(HTTP)(RESTful)(JSON)CypherPlugInneo4j-rest-graphdbneo4j-cypher-pluginneo4j-cypherneo4j-kernelEmbeddedGraphDatabaseClient-SideServer-Sidedata<<interface>> RestAPIRestAPI api= new RestAPIFacade("URL…");RestCypherQueryEngine engine= new RestCypherQueryEngine(api);RestGraphDatabaseRestAPIFacadeRestCypherQueryEngine22
  23. 23. ExecutionEngineneo4j-server(HTTP)(RESTful)(JSON)CypherPlugInneo4j-rest-graphdbneo4j-cypher-pluginneo4j-cypherneo4j-kernelClient-SideServer-Side<<interface>> RestAPIRestAPI 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);RestGraphDatabaseRestAPIFacadeRestCypherQueryEngine23リモートで使う(Cypherのクエリで検索する)
  24. 24. ご清聴ありがとうございましたExecutionEngine<<interface>>GraphDatabaseServiceEmbeddedReadOnlyGraphDatabaseneo4j-server(HTTP)(RESTful)(JSON)CypherPlugInneo4j-rest-graphdbneo4j-cypher-pluginneo4j-cypherneo4j-kernelEmbeddedGraphDatabaseClient-SideServer-Sidedata<<interface>> RestAPI24RestGraphDatabaseRestAPIFacadeRestCypherQueryEngine
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×