Рубрики
Без рубрики

Введение в Весенние данные Neo4j

Краткое и практичное введение в настройку и использование Neo4J с помощью Spring Data Neo4j.

Автор оригинала: baeldung.

1. Обзор

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

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

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

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

Давайте начнем с объявления зависимостей Spring Data Neo4j в pom.xml. Упомянутые ниже пружинные модули также необходимы для пружинных данных 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-тест и встроенный драйвер neo4j-ogm доступны в 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() {
    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 определит класс драйвера на основе протокола URL-адреса, в нашем случае “http”.

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

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

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

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

4.1. Создание роликапозиции и ПерсонОрепозиции

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

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

4.2. Настройка репозиториев Neo4j

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

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

Обратите внимание, как мы аннотировали Фильм с помощью @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 
}

Конечно, эти последние несколько классов имеют аналогичные аннотации, и ссылка-фильмы связывает Человека с Фильмом классом с помощью отношения “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.

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