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
Как вы можете видеть, репозиторий содержит некоторые пользовательские операции, а также стандартные, унаследованные от базового класса.
Далее у нас есть более простой 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. Извлечение существующего объекта фильма по части заголовка
Можно выполнить поиск для поиска существующего фильма, используя часть заголовка:
Collectionresult = movieRepository.findByTitleContaining("Italian");
6.4. Извлечение всех фильмов
Все фильмы могут быть извлечены один раз и могут быть проверены на правильное количество:
Collectionresult = (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, поэтому его должно быть легко импортировать и запускать как есть.