データ]


1概要

この記事は、人気の高いグラフデータベースであるSpring Data Neo4jの紹介です。

Spring Data Neo4jは、Neo4j Graph DatabaseのPOJOベースの開発を可能にし、コアAPIを使用するためのテンプレートクラスなどのよく知られたSpringの概念を使用し、アノテーションベースのプログラミングモデルを提供します。

また、多くの開発者はNeo4jが実際に彼らの特定のニーズに合っているかどうかを本当に知りません。 Neo4jを使用する理由と長所と短所については、Stackoverflowのhttp://stackoverflow.com/questions/1000162/has-anyone-used-graph-based-databases-http-neo4j-org[solid overview]をご覧ください。


2 Mavenの依存関係

__pom.xmlでSpring Data Neo4jの依存関係を宣言することから始めましょう。Spring Data Neo4jには、下記のSpringモジュールも必要です。

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-neo4j</artifactId>
    <version>5.0.1.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.neo4j</groupId>
    <artifactId>neo4j-ogm-test</artifactId>
    <version>3.1.2</version>
    <scope>test</scope>
</dependency>

これらの依存関係には、テストに必要なモジュールも含まれています。

最後の依存関係の範囲は ‘test’です。しかし、実際のアプリケーション開発では、フルのNeo4Jサーバーが稼働している可能性が高いことにも注意してください。

組み込みサーバーを使用したい場合は、依存関係も追加する必要があります。

<dependency>
    <groupId>org.neo4j</groupId>
    <artifactId>neo4j-ogm-embedded-driver</artifactId>
    <version>3.1.2</version>
</dependency>


spring-data-neo4j

、https://search.maven.org/search?q=a:neo4j-ogm- test[neo4j-ogm-test]およびhttps://search.maven.org/search?q=a:neo4j-ogm-embedded-driver[neo4j-ogm-embedded-driver]依存関係はMaven Centralで利用できます。


3 Neo4Jjの設定

Neo4jの設定は非常に簡単で、アプリケーションがサーバーに接続するための接続設定を定義します。他のほとんどのSpringデータモジュールと同様に、これはXMLまたはJava設定として定義できるSpring設定です。

このチュートリアルでは、Javaベースの設定のみを使用します。

public static final String URL =
  System.getenv("NEO4J__URL") != null ?
  System.getenv("NEO4J__URL") : "http://neo4j:[email protected]:7474";

@Bean
public org.neo4j.ogm.config.Configuration getConfiguration() {
    org.neo4j.ogm.config.Configuration config = new Builder().uri(URL).build();
    return config;
}

@Bean
public SessionFactory getSessionFactory() {
    return new SessionFactory(getConfiguration(),
      "com.baeldung.spring.data.neo4j.domain");
}

@Bean
public Neo4jTransactionManager transactionManager() {
    return new Neo4jTransactionManager(getSessionFactory());
}

前述のように、設定は単純で、2つの設定しか含まれていません。

まず、__SessionFactoryは、データオブジェクトを表すために作成したモデルを参照します。次に、サーバーエンドポイントとの接続プロパティとアクセス資格情報。

Neo4jはURIのプロトコルに基づいてドライバクラスを推論します。ここでは“ http”です

この例では、接続関連のプロパティはサーバーに直接設定されています。ただし、本番アプリケーションでは、これらは正しく外部化され、プロジェクトの標準構成の一部になります。


4 Neo4jリポジトリ

Spring Dataフレームワークと連携して、Neo4jはSpring Dataリポジトリ抽象化動作をサポートします。つまり、基盤となる永続的なメカニズムへのアクセスは、プロジェクトが直接それを拡張して提供された操作をそのまま使用できる組み込みの

Neo4jRepository

で抽象化されます。

リポジトリは、注釈付き、名前付き、または派生のファインダメソッドによって拡張可能です。 Spring Data Neo4jリポジトリのサポートも

Neo4jTemplate

に基づいているため、基本的な機能は同じです。

** 4.1.

MovieRepository

を作成する

このチュートリアルでは、データの永続化のために2つのリポジトリを使用します。

@Repository
public interface MovieRepository extends Neo4jRepository<Movie, Long> {

    Movie findByTitle(@Param("title") String title);

    @Query("MATCH (m:Movie) WHERE m.title =~ ('(?i).** '+{title}+'.** ') RETURN m")
    Collection<Movie>
      findByTitleContaining(@Param("title") String title);

    @Query("MATCH (m:Movie)<-[:ACTED__IN]-(a:Person)
      RETURN m.title as movie, collect(a.name) as cast LIMIT {limit}")
    List<Map<String,Object>> graph(@Param("limit") int limit);
}

あなたができるように、リポジトリは基本クラスから継承された標準のものと同様にいくつかのカスタム操作を含みます。

次に、私たちはより単純な

PersonRepository

を持っています。

@Repository
public interface PersonRepository extends Neo4jRepository <Person, Long> {
   //}

あなたはすでに

PersonRepository

が標準のSpring Dataインターフェースであることに気づいたかもしれません。これは、この単純な例では、操作セットは

Movie

エンティティに関連しているため、基本的に組み込み操作を使用すれば十分だからです。ただし、ここでカスタム操作をいつでも追加できます。これにより、1つまたは複数の組み込み操作をラップできます。


4.2. Neo4j


_リポジトリの設定

_


次のステップとして、セクション3で作成した

Neo4jConfiguration

クラスで、それを示す関連リポジトリをSpringに知らせる必要があります。

@Configuration
@ComponentScan("com.baeldung.spring.data.neo4j")
@EnableNeo4jRepositories(
  basePackages = "com.baeldung.spring.data.neo4j.repository")
public class MovieDatabaseNeo4jConfiguration {
   //}


5フルデータモデル

私たちはすでにデータモデルを見始めているので、それをすべてレイアウトしてみましょう – 完全な

Movie、Role



Person



Person

エンティティは、

Role

関係を通じて

Movie

エンティティを参照します。

@NodeEntity
public class Movie {

    @Id @GeneratedValue
    Long id;

    private String title;

    private int released;

    private String tagline;

    @Relationship(type="ACTED__IN", direction = Relationship.INCOMING)

    private List<Role> roles;

   //standard constructor, getters and setters
}

このクラスがNeo4jのノードに直接マッピングされていることを示すために、

Movie



@ NodeEntity

というアノテーションを付けたことに注目してください。

@JsonIdentityInfo(generator=JSOGGenerator.class)
@NodeEntity
public class Person {

    @Id @GeneratedValue
    Long id;

    private String name;

    private int born;

    @Relationship(type = "ACTED__IN")
    private List<Movie> movies;

   //standard constructor, getters and setters
}

@JsonIdentityInfo(generator=JSOGGenerator.class)
@RelationshipEntity(type = "ACTED__IN")
public class Role {

    @Id @GeneratedValue
    Long id;

    private Collection<String> roles;

    @StartNode
    private Person person;

    @EndNode
    private Movie movie;

   //standard constructor, getters and setters
}

もちろん、これら最後の2つのクラスにも同様の注釈が付けられており、-movies

__ –


参照は、 “ACTED

IN”の関係によって

Person



Movie

クラスにリンクしています。



6. MovieRepositoryを使用したデータアクセス



6.1. 新しいムービーオブジェクトを保存する

まず最初に、新しいMovie、次にPerson、そしてもちろんRoleというように、私たちが持っているすべてのリレーションデータを含むいくつかのデータを保存しましょう。

Movie italianJob = new Movie();
italianJob.setTitle("The Italian Job");
italianJob.setReleased(1999);
movieRepository.save(italianJob);

Person mark = new Person();
mark.setName("Mark Wahlberg");
personRepository.save(mark);

Role charlie = new Role();
charlie.setMovie(italianJob);
charlie.setPerson(mark);
Collection<String> roleNames = new HashSet();
roleNames.add("Charlie Croker");
charlie.setRoles(roleNames);
List<Role> roles = new ArrayList();
roles.add(charlie);
italianJob.setRoles(roles);
movieRepository.save(italianJob);


6.2. タイトルによる既存のムービーオブジェクトの取得

カスタム操作である定義済みのタイトルを使用して検索して、挿入したムービーを確認しましょう。

Movie result = movieRepository.findByTitle(title);


6.3. タイトルの一部による既存のムービーオブジェクトの取得

タイトルの一部を使って既存の映画を検索することができます。

Collection<Movie> result = movieRepository.findByTitleContaining("Italian");


6.4. すべての映画を検索する

すべての映画は一度取得することができ、正しい数をチェックすることができます。

Collection<Movie> result = (Collection<Movie>) movieRepository.findAll();

ただし、税関の要件に役立つデフォルトの動作が提供されているfindメソッドがいくつかあり、ここではそのすべてを説明するわけではありません。


6.5. 既存のムービーオブジェクトを数える

複数のムービーオブジェクトを挿入した後、ムービーカウントを終了することができます。

long movieCount = movieRepository.count();


6.6. 既存の映画を削除する

movieRepository.delete(movieRepository.findByTitle("The Italian Job"));

assertNull(movieRepository.findByTitle("The Italian Job"));


6.7. 挿入されたデータをすべて削除する

データベースを空にして、データベース内のすべての要素を削除することは可能です。

movieRepository.deleteAll();

この操作の結果、テーブルからすべてのデータが素早く削除されます。


7. 結論

このチュートリアルでは、非常に簡単な例を使用してSpring Data Neo4jの基本を説明しました。

しかしNeo4jは、膨大な関係とネットワークを持つ非常に高度で複雑なアプリケーションにも対応できます。また、Spring Data Neo4jは、注釈付きエンティティクラスをNeo4j Graph Databaseにマッピングするための高度な機能も提供します。

上記のコードスニペットと例の実装はhttps://github.com/eugenp/tutorials/tree/master/persistence-modules/spring-data-neo4j[GitHubプロジェクト]にあります。したがって、そのままインポートして実行するのは簡単なはずです。