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 + ', від 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 + ', від 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)
    }
}