Neo4j – это графовая база данных NoSQL с открытым исходным кодом, которая использует полнофункциональную модель данных узлов, связанных полноправными отношениями, что лучше подходит для связанных больших данных, чем традиционные подходы с использованием РСУБД. Spring Boot предусматривает несколько вспомогательных средств для работы с Neo4j, включая "стартер" spring-boot-starter-data-neo4j.

Подключение к базе данных Neo4j

Чтобы получить доступ к серверу Neo4j, можно внедрить автоконфигурируемый org.neo4j.driver.Driver. По умолчанию экземпляр будет пытаться подключиться к серверу Neo4j по адресу localhost:7687, используя протокол Bolt. В следующем примере показано, как внедрить Driver для Neo4j, который даст доступ, помимо всего прочего, к Session:

Java
import org.neo4j.driver.Driver;
import org.neo4j.driver.Session;
import org.neo4j.driver.Values;
import org.springframework.stereotype.Component;
@Component
public class MyBean {
    private final Driver driver;
    public MyBean(Driver driver) {
        this.driver = driver;
    }
    // ...
    public String someMethod(String message) {
        try (Session session = this.driver.session()) {
            return session.writeTransaction((transaction) -> transaction
                    .run("CREATE (a:Greeting) SET a.message = $message RETURN a.message + ', from node ' + id(a)",
                            Values.parameters("message", message))
                    .single().get(0).asString());
        }
    }
}
Kotlin
import org.neo4j.driver.Driver
import org.neo4j.driver.Transaction
import org.neo4j.driver.Values
import org.springframework.stereotype.Component
@Component
class MyBean(private val driver: Driver) {
    // ...
    fun someMethod(message: String?): String {
        driver.session().use { session ->
            return@someMethod session.writeTransaction { transaction: Transaction ->
                transaction.run(
                    "CREATE (a:Greeting) SET a.message = \$message RETURN a.message + ', from node ' + id(a)",
                    Values.parameters("message", message)
                ).single()[0].asString()
            }
        }
    }
}

Можно добавить в конфигурацию различные аспекты драйвера с помощью свойств spring.neo4j.*. В следующем примере показано, как сконфигурировать используемые URI-идентификатор и учетные данные:

Properties
spring.neo4j.uri=bolt://my-server:7687
spring.neo4j.authentication.username=neo4j
spring.neo4j.authentication.password=secret
Yaml
spring:
  neo4j:
    uri: "bolt://my-server:7687"
    authentication:
      username: "neo4j"
      password: "secret"

Автоконфигурируемый Driver создается с помощью ConfigBuilder. Для более тонкой настройки его конфигурации объявите один или несколько бинов ConfigBuilderCustomizer. Каждый из них будет вызываться по порядку через ConfigBuilder, который используется для создания Driver.

Репозитории Spring Data Neo4j

Spring Data содержит средства поддержки репозиториев для Neo4j.

Spring Data Neo4j имеет общую с Spring Data JPA инфраструктуру, как и многие другие модули Spring Data. Можно взять пример для JPA из предыдущего раздела и определить City как @Node для Spring Data Neo4j, а не @Entity для JPA, при этом абстракция хранилища будет работать точно так же, как показано в следующем примере:

Java
import java.util.Optional;
import org.springframework.data.neo4j.repository.Neo4jRepository;
public interface CityRepository extends Neo4jRepository<City, Long> {
    Optional<City> findOneByNameAndState(String name, String state);
}
Kotlin
import org.springframework.data.neo4j.repository.Neo4jRepository
import java.util.Optional
interface CityRepository : Neo4jRepository<City?, Long?> {
    fun findOneByNameAndState(name: String?, state: String?): Optional<City?>?
}

"Стартер" spring-boot-starter-data-neo4j активирует поддержку репозиториев, а также управления транзакциями. Spring Boot поддерживает как классические, так и реактивные репозитории Neo4j через бины Neo4jTemplate или ReactiveNeo4jTemplate. Если Project Reactor доступен в classpath, реактивный стиль также автоматически конфигурируется.

Можно настроить местоположения, в которых будет осуществляться поиск репозиториев и сущностей, используя аннотацию @EnableNeo4jRepositories и @EntityScan соответственно на бине, помеченном аннотацией @Configuration.

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

Java
import org.neo4j.driver.Driver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.neo4j.core.ReactiveDatabaseSelectionProvider;
import org.springframework.data.neo4j.core.transaction.ReactiveNeo4jTransactionManager;
@Configuration(proxyBeanMethods = false)
public class MyNeo4jConfiguration {
    @Bean
    public ReactiveNeo4jTransactionManager reactiveTransactionManager(Driver driver,
            ReactiveDatabaseSelectionProvider databaseNameProvider) {
        return new ReactiveNeo4jTransactionManager(driver, databaseNameProvider);
    }
}
Kotlin
import org.neo4j.driver.Driver
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.data.neo4j.core.ReactiveDatabaseSelectionProvider
import org.springframework.data.neo4j.core.transaction.ReactiveNeo4jTransactionManager
@Configuration(proxyBeanMethods = false)
class MyNeo4jConfiguration {
    @Bean
    fun reactiveTransactionManager(driver: Driver,
            databaseNameProvider: ReactiveDatabaseSelectionProvider): ReactiveNeo4jTransactionManager {
        return ReactiveNeo4jTransactionManager(driver, databaseNameProvider)
    }
}