Введение в 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
Как вы можете, репозиторий содержит некоторые пользовательские операции, а также стандартные операции, унаследованные от базового класса.
Далее у нас есть более простой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, поэтому его должно быть легко импортировать и запускать как есть.