Spring @ DataNeo4jTest с поддержкой процедур - PullRequest
0 голосов
/ 27 августа 2018

Я пишу тесты репозитория Spring Data Neo4J с @DataNeo4jTest, и все будет хорошо, пока я не напишу тест для пользовательского запроса, использующего процедуру, например apoc.coll.intersection.Ошибка объявляет процедуру apoc.coll.intersection неизвестной.У меня есть APOC JAR на пути к классам, поэтому я предполагаю, что мне нужно найти способ зарегистрировать процедуру со встроенным источником данных / драйвером, который использует @DataNeo4jTest.

Любая помощь будет принята с благодарностью.Спасибо.

Ответы [ 2 ]

0 голосов
/ 02 сентября 2018

Поработав с этим в течение некоторого времени, попробовав разные версии зависимостей, а также поигравшись с кодом конфигурации, предложенным @meistermeier, я нашел решение, которое заключалось в простом использовании правильной версии 2 тестовых JAR Neo4J, на которые я ссылался,Это проект Spring Boot, поэтому вот все зависимости Neo4J в моем POM Maven, которые решают проблему:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-neo4j</artifactId>
</dependency>

<dependency>
  <groupId>org.neo4j.test</groupId>
  <artifactId>neo4j-harness</artifactId>
  <version>${neo4j.ogm.version}</version>
  <scope>test</scope>
</dependency>

<dependency>
  <groupId>org.neo4j</groupId>
  <artifactId>neo4j-ogm-embedded-driver</artifactId>
  <version>${neo4j.ogm.version}</version>
  <scope>test</scope>
</dependency>

Я установил neo4j.ogm.version в соответствии с версией, указанной в spring-data-neo4j-parent POM (которая являетсявведено транзитивно).

0 голосов
/ 27 августа 2018

Немного предыстории для понимания ситуации: аннотация @DataNeo4jTest предоставляет вам автоматическую настройку на основе Spring Boot.Он подберет вашу конфигурацию соединения Neo4j в вашем application.properties (либо тестовом, либо производственном, если свойства теста не определены) и создаст Neo4j-OGM SessionFactory с соответствующей вам конфигурацией.

Существует два способаЧтобы решить вашу проблему:

Определите компонент SessionFactory самостоятельно с помощью установки и настройки встроенного экземпляра:

@Bean
public SessionFactory sessionFactory() {
  GraphDatabaseService graphDatabaseService = new GraphDatabaseFactory()
            .newEmbeddedDatabaseBuilder(Paths.get("pathToDb").toFile()).newGraphDatabase();

  registerProcedure(graphDatabaseService, MyProcedure.class);

  EmbeddedDriver driver = new EmbeddedDriver(graphDatabaseService);
  SessionFactory sessionFactory = new SessionFactory(driver, "package");
}

Или во время "выполнения" с уже существующим компонентом SessionFactory, например, вваши настройки теста (убедитесь, что вы сделали это только один раз)

EmbeddedDriver loadedDriver = (EmbeddedDriver) sessionFactory.getDriver();
registerProcedure(loadedDriver.getGraphDatabaseService(), MyProcedure.class);

оба вызовут такой метод

public static void registerProcedure(GraphDatabaseService db, Class<?>...procedures) throws KernelException {
    Procedures proceduresService = ((GraphDatabaseAPI) db).getDependencyResolver().resolveDependency(Procedures.class);
    for (Class<?> procedure : procedures) {
        proceduresService.registerProcedure(procedure,true);
        proceduresService.registerFunction(procedure, true);
        proceduresService.registerAggregationFunction(procedure, true);
    }
}

Обновление: добавлены примеры и определения версий.

GraphDatabaseService graphDatabaseService = new GraphDatabaseFactory()
    .newEmbeddedDatabaseBuilder(Paths.get("path/to/db").toFile()).newGraphDatabase();

// Option I
registerProcedure(graphDatabaseService, MyProcedure.class);

EmbeddedDriver driver = new EmbeddedDriver(graphDatabaseService);
SessionFactory sessionFactory = new SessionFactory(driver, "org.neo4j.ogmindex.domain");

// Option II if embedded driver is not directly accessible anymore
EmbeddedDriver loadedDriver = (EmbeddedDriver) sessionFactory.getDriver();
// register the apoc version function
registerProcedure(loadedDriver.getGraphDatabaseService(), Version.class);

// Test call to apoc.version
Session session = sessionFactory.openSession();
session.query("RETURN apoc.version()", emptyMap())
    .forEach(System.out::println); // outputs {apoc.version()=3.4.0.2}

pom.xml определение для приведенного выше примера:

<dependency>
    <groupId>org.neo4j.test</groupId>
    <artifactId>neo4j-harness-enterprise</artifactId>
    <version>3.4.6</version>
</dependency>
<dependency>
    <groupId>org.neo4j.procedure</groupId>
    <artifactId>apoc</artifactId>
    <version>3.4.0.2</version>
</dependency>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...