Введение в Spring Data Neo4j

Введение в Spring Data Neo4j

1. обзор

Эта статья - популярная база данных графовan introduction to Spring Data Neo4j.

Spring Data Neo4j обеспечивает разработку на основе POJO для графической базы данных Neo4j и использует знакомые концепции Spring, такие как шаблоны классов для использования базового API, и предоставляет модель программирования на основе аннотаций.

Кроме того, многие разработчики не знают, действительно ли Neo4j подходит для их конкретных нужд; вотa solid overview на Stackoverflow, обсуждает, почему использовать Neo4j, а также плюсы и минусы.

2. Maven Зависимости

Давайте начнем с объявления зависимостей Spring Data Neo4j вpom.xml.. Для Spring Data Neo4j также требуются указанные ниже модули Spring:


    org.springframework.data
    spring-data-neo4j
    5.0.1.RELEASE


    org.neo4j
    neo4j-ogm-test
    3.1.2
    test

Эти зависимости включают в себя также необходимые модули для тестирования.

Обратите внимание, что последняя зависимость определена как «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 очень прямолинейна и определяет настройку соединения для приложения для подключения к серверу. Подобно большинству других модулей данных Spring, это конфигурация Spring, которая может быть определена как конфигурация XML или Java.

В этом руководстве мы будем использовать только конфигурацию на основе 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.example.spring.data.neo4j.domain");
}

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

Как уже упоминалось выше, конфигурация проста и содержит только две настройки. Во-первых,SessionFactory is ссылается на модели, которые мы создали для представления объектов данных. Затем свойства соединения с конечными точками сервера и учетными данными доступа.

Neo4j выведет класс драйвера на основе протокола URI, в нашем случае «http».

Обратите внимание, что в этом примере свойства, связанные с подключением, настраиваются непосредственно на сервере; однако в производственном приложении они должны быть надлежащим образом оформлены и являться частью стандартной конфигурации проекта.

4. Репозитории Neo4j

В соответствии с платформой Spring Data, Neo4j поддерживает поведение абстракции репозитория Spring Data. Это означает, что доступ к базовому постоянному механизму абстрагируется во встроенномNeo4jRepository, где проект может напрямую расширять его и использовать предоставленные операции "из коробки".

Репозитории расширяются с помощью аннотированных, именованных или производных методов поиска. Поддержка репозиториев Spring Data Neo4j также основана наNeo4jTemplate, поэтому базовая функциональность идентична.

4.1. СозданиеMovieRepository &PersonRepository

В этом руководстве мы используем два репозитория для сохранения данных:

@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 - это просто стандартный интерфейс Spring Data. Это связано с тем, что в этом простом примере почти достаточно использовать встроенные операции в основном, поскольку наш набор операций связан с сущностьюMovie. Однако вы всегда можете добавить пользовательские операции, которые могут обернуть одну / несколько встроенных операций.

4.2. Настройка Neo4jRepositories

В качестве следующего шага мы должны сообщить Spring о соответствующем репозитории, указав это в классеNeo4jConfiguration, созданном в разделе 3:

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

5. Полная модель данных

Мы уже начали изучать модель данных, поэтому давайте теперь изложим все - полныеMovie, Role иPerson. СущностьPerson ссылается на сущностьMovie через отношениеRole.

@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
}

Обратите внимание, как мы аннотировалиMovie с помощью@NodeEntity, чтобы указать, что этот класс напрямую отображается на узел в Neo4j.

@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 связываетPerson с классомMovie отношением «ACTED_IN».

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"));

После удаления вставленного фильма мы можем выполнить поиск объекта фильма и убедиться, что результат равен нулю:

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

6.7. Удалить все вставленные данные

Можно удалить все элементы в базе данных, сделав базу данных пустой:

movieRepository.deleteAll();

Результат этой операции быстро удаляет все данные из таблицы.

7. Заключение

В этом уроке мы рассмотрели основы Spring Data Neo4j на очень простом примере.

Однако Neo4j способен обслуживать очень сложные и сложные приложения, имеющие огромный набор связей и сетей. А Spring Data Neo4j также предлагает расширенные функции для сопоставления аннотированных классов сущностей с графической базой данных Neo4j.

Реализация приведенных выше фрагментов кода и примеров можно найти вthe GitHub project - это проект на основе Maven, поэтому его должно быть легко импортировать и запускать как есть.