SpringData Neo4j 소개

1. 개요

이 기사는 인기있는 그래프 데이터베이스 인 SpringData Neo4j에 대한 소개 입니다.

SpringData Neo4j는 Neo4j Graph Database를위한 POJO 기반 개발을 가능하게하며, 핵심 API 사용을위한 템플릿 클래스와 같은 친숙한 Spring 개념을 사용하고 주석 기반 프로그래밍 모델을 제공합니다.

또한 많은 개발자들은 Neo4j가 실제로 자신의 특정 요구에 잘 맞는지 알지 못합니다. Neo4j를 사용하는 이유와 장단점을 설명하는 Stackoverflow에 대한 확실한 개요가 있습니다.

2. Maven 종속성

pom.xml 에서 SpringData Neo4j 종속성을 선언하여 시작하겠습니다 . 아래 언급 된 Spring 모듈은 SpringData Neo4j에도 필요합니다.

 org.springframework.data spring-data-neo4j 5.0.1.RELEASE   org.neo4j neo4j-ogm-test 3.1.2 test 

이러한 종속성에는 테스트에 필요한 모듈도 포함됩니다.

마지막 종속성은 '테스트'로 범위가 지정됩니다. 그러나 실제 응용 프로그램 개발에서는 전체 Neo4J 서버가 실행될 가능성이 더 큽니다.

임베디드 서버를 사용하려면 종속성도 추가해야합니다.

 org.neo4j neo4j-ogm-embedded-driver 3.1.2 

spring-data-neo4j, neo4j-ogm-test 및 neo4j-ogm-embedded-driver 종속성은 Maven Central에서 사용할 수 있습니다.

3. Neo4Jj 구성

Neo4j 구성은 매우 간단하며 애플리케이션이 서버에 연결하기위한 연결 설정을 정의합니다. 대부분의 다른 스프링 데이터 모듈과 유사하게 XML 또는 Java 구성으로 정의 할 수있는 스프링 구성입니다.

이 자습서에서는 Java 기반 구성 만 사용합니다.

public static final String URL = System.getenv("NEO4J_URL") != null ? System.getenv("NEO4J_URL") : "//neo4j:[email protected]:7474"; @Bean public org.neo4j.ogm.config.Configuration getConfiguration() { return new Builder().uri(URL).build(); } @Bean public SessionFactory getSessionFactory() { return new SessionFactory(getConfiguration(), "com.baeldung.spring.data.neo4j.domain"); } @Bean public Neo4jTransactionManager transactionManager() { return new Neo4jTransactionManager(getSessionFactory()); }

위에서 언급했듯이 구성은 간단하며 두 가지 설정 만 포함합니다. 첫째 – SessionFactory는 데이터 개체를 나타 내기 위해 만든 모델을 참조합니다. 그런 다음 서버 끝점 및 액세스 자격 증명이있는 연결 속성입니다.

Neo4j는 URI의 프로토콜 (여기서는 "http")을 기반으로 드라이버 클래스를 추론합니다.

이 예에서 연결 관련 속성은 서버에 직접 구성됩니다. 그러나 프로덕션 애플리케이션에서는 적절하게 외부화되어야하며 프로젝트의 표준 구성의 일부 여야합니다.

4. Neo4j 저장소

SpringData 프레임 워크에 맞춰 Neo4j는 SpringData 저장소 추상화 동작을 지원합니다. 즉, 기본 영구 메커니즘에 액세스하는 것은 프로젝트가 직접 확장하고 제공된 작업을 즉시 사용할 수 있는 내장 Neo4jRepository 에서 추상화됩니다 .

리포지토리는 주석이 추가되거나 이름이 지정되거나 파생 된 파인더 메서드로 확장 할 수 있습니다. SpringData Neo4j Repositories에 대한 지원도 Neo4jTemplate을 기반으로 하므로 기본 기능이 동일합니다.

4.1. MovieRepositoryPersonRepository 만들기

이 자습서에서는 데이터 지속성을 위해 두 개의 저장소를 사용합니다.

@Repository public interface MovieRepository extends Neo4jRepository { Movie findByTitle(@Param("title") String title); @Query("MATCH (m:Movie) WHERE m.title =~ ('(?i).*'+{title}+'.*') RETURN m") Collection 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 graph(@Param("limit") int limit); } 

가능한 한 저장소에는 기본 클래스에서 상속 된 표준 작업뿐 아니라 일부 사용자 지정 작업이 포함되어 있습니다.

다음으로 표준 작업 만 있는 더 간단한 PersonRepository 가 있습니다.

@Repository public interface PersonRepository extends Neo4jRepository  { // }

PersonRepository 가 표준 스프링 데이터 인터페이스라는 것을 이미 눈치 채 셨을 것 입니다. 이것은이 간단한 예제에서 우리의 작업 세트가 Movie 엔티티 와 관련되어 있으므로 기본적으로 내장 작업을 사용하는 것으로 거의 충분하기 때문입니다 . 그러나 여기에 단일 / 다중 내장 작업을 래핑 할 수있는 사용자 지정 작업을 항상 추가 할 수 있습니다.

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. 전체 데이터 모델

우리는 이미 데이터 모델을 살펴보기 시작 했으므로 이제 전체 영화, 역할사람을 모두 배치 해 보겠습니다 . 사람 엔티티 참조합니다 영화 의 관통 엔티티 역할 관계.

@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 roles; // standard constructor, getters and setters }

이 클래스가 Neo4j의 노드에 직접 매핑되었음을 나타 내기 위해 @NodeEntityMovie 에 주석 을 달았 습니다.

@JsonIdentityInfo(generator=JSOGGenerator.class) @NodeEntity public class Person { @Id @GeneratedValue Long id; private String name; private int born; @Relationship(type = "ACTED_IN") private List movies; // standard constructor, getters and setters } @JsonIdentityInfo(generator=JSOGGenerator.class) @RelationshipEntity(type = "ACTED_IN") public class Role { @Id @GeneratedValue Long id; private Collection roles; @StartNode private Person person; @EndNode private Movie movie; // standard constructor, getters and setters }

물론이 마지막 두 개의 클래스는 유사하게 주석이 달려 있으며 -movies 참조는 "ACTED_IN"관계에 의해 PersonMovie 클래스를 연결 합니다.

6. MovieRepository를 사용한 데이터 액세스

6.1. 새 영화 개체 저장

우리가 가지고있는 모든 관계 데이터를 포함하여 일부 데이터 (먼저 새 영화, 사람, 물론 역할)를 저장해 보겠습니다.

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 roleNames = new HashSet(); roleNames.add("Charlie Croker"); charlie.setRoles(roleNames); List roles = new ArrayList(); roles.add(charlie); italianJob.setRoles(roles); movieRepository.save(italianJob);

6.2. 제목으로 기존 영화 개체 검색

이제 사용자 지정 작업 인 정의 된 제목을 사용하여 검색하여 삽입 된 영화를 확인하겠습니다.

Movie result = movieRepository.findByTitle(title);

6.3. 타이틀의 일부로 기존 영화 개체 검색

제목의 일부를 사용하여 기존 영화를 검색 할 수 있습니다.

Collection result = movieRepository.findByTitleContaining("Italian");

6.4. 모든 영화 검색

모든 영화는 한 번만 검색 할 수 있으며 정확한 개수를 확인할 수 있습니다.

Collection result = (Collection) movieRepository.findAll();

그러나 세관 요구 사항에 유용한 기본 동작과 함께 제공되는 많은 찾기 방법이 있으며 여기에 모두 설명되어 있지는 않습니다.

6.5. 기존 영화 개체 계산

여러 영화 개체를 삽입 한 후 종료 영화 수를 얻을 수 있습니다.

long movieCount = movieRepository.count();

6.6. 기존 영화 삭제

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

삽입 된 영화를 삭제 한 후 영화 객체를 검색하여 결과가 null인지 확인할 수 있습니다.

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

6.7. 삽입 된 모든 데이터 삭제

데이터베이스의 모든 요소를 ​​삭제하여 데이터베이스를 비울 수 있습니다.

movieRepository.deleteAll();

이 작업의 결과는 테이블에서 모든 데이터를 빠르게 제거합니다.

7. 결론

이 튜토리얼에서는 매우 간단한 예제를 사용하여 SpringData Neo4j의 기본 사항을 살펴 보았습니다.

그러나 Neo4j는 엄청난 양의 관계와 네트워크를 가진 매우 진보되고 복잡한 애플리케이션을 수용 할 수 있습니다. 또한 SpringData Neo4j는 주석이 달린 엔티티 클래스를 Neo4j 그래프 데이터베이스에 매핑하는 고급 기능을 제공합니다.

위의 코드 스 니펫 및 예제의 구현은 GitHub 프로젝트에서 찾을 수 있습니다. 이것은 Maven 기반 프로젝트이므로 그대로 가져 와서 실행하기 쉽습니다.