1. ホーム
  2. Java

Neo4jにアクセスする spring-data-neo4j 入門編 (I)

2022-03-02 17:18:39
<パス

Spring-data-neo4j入門編

この記事では、spring-data-neo4jを使用してneo4jデータベースにアクセスする方法を、簡単なムービーとアクターの例で簡単に説明します。

グラフデータベースに関する理論や利用シーンは、グラフデータベースとリレーショナルデータベースの比較と同様に、この記事の範囲外です。人物と映画の関係には、俳優と監督があり、映画には俳優として複数の人物、監督として複数の監督が存在することがある。つまり、人物と映画の間には、ACTED _INとDIRECTEDの関係が存在する。グラフデータベースでは、1人の人物が複数の映画を指し示すことがあり、同じ映画を指し示す2本の線がそれぞれACTED_INとDIRECTEDの関係で存在することがある。

  • neo4jデータベースのインストール
  • Mavenプロジェクトにspring-data-neo4jと関連する依存関係を追加します。
  • ドメインオブジェクトを書き込む
  • Neo4jRepository インターフェースを継承する。
  • サービスの実装
  • コントローラでアクセスする
  • スクリーンショットの実行
  • 概要

1, neo4jデータベースのインストール
neo4jデータベースのインストール方法については、インターネット上にたくさん情報があるので、今回は割愛します。私はデフォルトのインストールを使用しています。アクセスアドレスはhttp://127.0.0.1:7474/browser/、データベースアクセスのプロトコルはbolt://localhostです。

2、javaプロジェクトの依存関係を追加します。
メインはspring-boot-starter-data-neo4jで、この依存関係を追加するには、以下を参照してください。 スプリングブートガイド .

<?xml version="1.0" encoding="UTF-8"? >
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>com.yq</groupId>
	<artifactId>demo-data-neo4j</artifactId>
	<version>0.1.0</version>
...

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-neo4j</artifactId>
		</dependency>
		<dependency>
			<groupId>org.neo4j</groupId>
			<artifactId>neo4j</artifactId>
			<version>3.2.9</version>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>org.neo4j</groupId>
			<artifactId>neo4j-ogm-embedded-driver</artifactId>
			<version>${neo4j-ogm.version}</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.neo4j</groupId>
			<artifactId>neo4j-ogm-bolt-driver</artifactId>
			<version>${neo4j-ogm.version}</version>
		</dependency>

		<! -- lombok-->
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
		</dependency>
	</dependencies>

...

</project>



3、ドメインオブジェクトを書き込む
今回は、MovieとPersonの2つのオブジェクトがありますが、どちらも比較的単純なものです。コードは以下の通りです。なお、@NoArgsConstructorを追加する必要があります。
NoArgsConstructorは自動的に引数のないコンストラクタを作成し、spring-ogmはそれを使用します。NodeEntityは、これがneo4jデータベースのノードであることを示します。

//つまり、アクターはムービーを指します。
@Relationship(type = "DIRECTED", direction = Relationship.OUTGOING)
private List dMovies;

は、俳優から映画への関係があること、つまり、人が映画を指し示すことを示します。この関係には属性を追加していませんが、今後の例でどのような役割を果たすか、あるいは主監督か副監督かなど、拡張することが可能です。

@lombok.Data
@NoArgsConstructor
@NodeEntity
public class Movie{
    @Id
    @GeneratedValue
    private Long id;
    private String title;
    private String category;
    private int revenue;

    public Movie (String title, String category, int revenue) {
        this.title = title;
        this.category = category;
        this.revenue = revenue;
    }
}

@lombok.Data
@NoArgsConstructor
@NodeEntity
public class Person{
    @Id
    @GeneratedValue
    private Long id;

    private String firstName;
    private String lastName;
    private int height;

    public Person (String firstName, String lastName, int height) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.height = height;
    }
    
    @Relationship(type = "ACTED_IN", direction = Relationship.OUTGOING)
    private List<Movie> aMovies;

    // that is, actors point to movies
    @Relationship(type = "DIRECTED", direction = Relationship.OUTGOING)
    private List<Movie> dMovies;

    //Entities handled by the OGM must have one empty public constructor to allow the library to construct the objects.
    public void addActMovie(Movie movie) {
        if (this.aMovies == null) {
            this.aMovies = new ArrayList<>();
        }
        this.aMovies.add(movie);
    }

    public void addDirectMovie(Movie movie) {
        if (this.dMovies == null) {
            this.dMovies = new ArrayList<>();
        }
        this.dMovies.add(movie);
    }
}



public interface MovieRepository extends Neo4jRepository<Movie, Long> {

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

    Collection<Movie> findByRevenueGreaterThan(int revenue);

}


4, Neo4jRepository インターフェイスを継承する。
Neo4jRepositoryは、ちょうどspring jpaのJpaRepositoryのようなもので、すでにsave, delete, findAll, findOne, pagingなど多くの機能を実装するのに役立っています。また、メソッド名とクエリ関係文字列に基づいて、自動的にAndやGT LTなどを構成することができます。

MovieRepositoryのfindByTitleメソッドは、自動的にタイトルでMovieを探す手助けをしてくれます。これは、MATCH (n:Movie) WHERE n.title = {title}と同等です。RETURN n

また、findByRevenueGreaterThan(int revenue); メソッドは、MATCH (n:Movie) WHERE n.revenue > {revenue} と同じ意味になります。RETURN n

@RestController
@RequestMapping("/movie")
public class MovieController {

    @Autowired
    MovieRepository movieRepository;
    
    @GetMapping("/all")
    public Iterable<Movie> findAll() {
        return movieRepository.findAll();
    }

    @GetMapping("/findByReveueGT")
    public Iterable<Movie> findByRevenueGT(@RequestParam Integer revenue) {
        return movieRepository.findByRevenueGreaterThan(revenue);
    }
}


PersonRepository と MovieRepository は類似しているので、ここでは紹介しません。 コード . スタートとフォークは自由に追加してください。

5, サービスの実装
一般的に言えば、単一のリポジトリは、オブジェクト自体のCRUDを実装して、我々はビジネスロジックを実現したい場合、我々はこのような俳優と追加する映画の関係を完了するように、サービスの中で、メソッドaddActor2Movieがあります完了する必要があります。このメソッドは、まずPersonRepositoryを呼び出して人が存在するかどうかを確認し、次にMovieRepositoryを呼び出して映画が存在するかどうかを確認し、両方が存在する場合は、人のメソッドaddActMovieを呼び出し、人オブジェクトを保存し、それ以外はエラーを報告しています。

6, コントローラーでアクセス
データを表示するためだけにコントローラを使用しています。
最初のコントローラであるPersonControllerには、初期化とデータの挿入を行うためのinitメソッドがあり、findAllやfindByfirstNameといった
2つ目のコントローラであるMovieControllerは、すべての映画を表示し、収益によって映画を照会します。

コード例

@SpringBootApplication
@EnableNeo4jRepositories
public class Application {

	private final static Logger log = LoggerFactory.getLogger(Application.class);

	public static void main(String[] args) throws Exception {
		SpringApplication.run(Application.class, args);
	}

}


PersonController のコードは github で見ることができます。 コード . .

7、@EnableNeo4jRepositoriesアノテーションを追加します。
SpringBootApplicationでアノテーションされたクラスにEnableNeo4jRepositoriesを追加する必要があります。

spring.data.neo4j.uri=bolt://localhost
spring.data.neo4j.username=neo4j
spring.data.neo4j.password=neo4j


8、スクリーンショットを実行する
実行する前に、application.propertiesを設定する必要があります。

spring.data.neo4j.uri=bolt://localhost
spring.data.neo4j.username=neo4j
spring.data.neo4j.password=neo4j


最初のものは、データの初期化を完了し、likeNameによるクエリを実行しているところです。

2つ目はneo4jのデータです

映画「REVENUE」による3つ目のクエリ。

スクリーンショットを追加してください。データベースにムービーオブジェクトが既に存在するかどうかを確認し、http://127.0.0.1:8080/movie/all看看是否有数据。

概要
spring-data-neo4jを使ったneo4jデータベースへのアクセスは、ドメイン(nodeEntiryアノテーション)とNeo4jRepositoryを使って、データベースにアクセスし操作することになります。

続きはこちら
この記事は、名前と大小関係に基づく単純なクエリですが、複雑なクエリについては、@Queryアノテーションを追加します。 Neo4jへのアクセス Spring-data-neo4j入門 (2) 複雑なクエリのための@Query Queryの書き方については、後ほど詳しく説明します。