Процедуры Graphaware TimeTree в модульном тесте с использованием встроенной базы данных

ОБНОВЛЕНИЕ: я нашел похожий тест в исходном дереве временного дерева neo4j, но с использованием GraphAwareIntegrationTest, который расширяет ServerIntegrationTest. Итак, я попытался создать Bean-компонент GraphDatabaseService для своего теста со следующим, но все равно не повезло. Я получаю «Для этого экземпляра базы данных не зарегистрирована процедура с именем ga.timetree.events.attach». Разве это невозможно?

@Bean
  public GraphDatabaseService graphDatabaseService() {
    GraphDatabaseService gds = new TestGraphDatabaseFactory().newImpermanentDatabaseBuilder().newGraphDatabase();
    Procedures procedures = (Procedures)((GraphDatabaseFacade) gds).getDependencyResolver().resolveDependency(Procedures.class);
    try {
        ClassPathProcedureUtils.registerAllProceduresAndFunctions(procedures);
    }catch (Exception ex) {
        log.error("error", ex);
    }
    return gds;
}

=====================

Подобно этой проблеме, но я использую Spring Boot 2, SDN5 с neo4j 3.2.5, графическое ПО и дерево времени. У меня есть автоматическая настройка прикрепления событий, и я вижу, что события сохраняются в дереве времени, но я не могу выполнить запрос, используя вызов процедуры с помощью шифра. Я получаю сообщение об ошибке:

Caused by: org.neo4j.ogm.exception.CypherException: Error executing Cypher; Code: Neo.ClientError.Procedure.ProcedureNotFound; Description: There is no procedure with the name `ga.timetree.range` registered for this database instance. Please ensure you've spelled the procedure name correctly and that the procedure is properly deployed.
at org.neo4j.ogm.drivers.embedded.request.EmbeddedRequest.executeRequest(EmbeddedRequest.java:176)

Я не вижу класс TimeTreeProcedures, как указано в связанной проблеме. Это все еще поддерживается во встроенном/модульном тестировании?

Кроме того, если он поддерживается, я хотел бы использовать CustomRootTimeTree. Любая помощь или указатель на шифрование, с помощью которого я могу определить пользовательский идентификатор корневого дерева в вызове процедуры, также будут очень признательны. Спасибо за любую помощь!

Тест:

    @Test
    public void testSingleTimeTree() {

        User user = new User("[email protected]", "alper", "alper");
        userRepository.save(user);
        Collection<User> found = userRepository.findByEmail("[email protected]");
        user = found.iterator().next();
        Workout workout = new Workout(new DateTime().plusMonths(2).getMillis());
        workoutRepository.save(workout);
        GraphUnit.printGraph(graphDb);
        Iterable<Workout> workouts = workoutRepository.findWorkouts();

        for(Workout workout1 : workouts) {
            log.info("workout: {}", workout1);
        }
    }

Репо (жестко закодированное начало/конец на данный момент):

    public interface WorkoutRepository extends Neo4jRepository<Workout, Long> {

        @Query("CALL ga.timetree.range({start: 1506826887000, end: 1512097287, create: false})")
        Iterable<Workout> findWorkouts();

    }

пом.xml:

  <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>2.0.0.BUILD-SNAPSHOT</version>
      <relativePath/> <!-- lookup parent from repository -->
  </parent>

  <properties>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      <java.version>1.8</java.version>
      <spring-data-releasetrain.version>Kay-RELEASE</spring-data-releasetrain.version>
      <!--<neo4j-ogm.version>3.0.0</neo4j-ogm.version>-->
  </properties>

  <dependencyManagement>
      <dependencies>
          <dependency>
              <groupId>org.springframework.data</groupId>
              <artifactId>spring-data-releasetrain</artifactId>
              <version>${spring-data-releasetrain.version}</version>
              <scope>import</scope>
              <type>pom</type>
          </dependency>
      </dependencies>
  </dependencyManagement>

  <dependencies>
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-data-neo4j</artifactId>
      </dependency>
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-data-rest</artifactId>
      </dependency>
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-web</artifactId>
      </dependency>
      <dependency>
          <groupId>org.neo4j</groupId>
          <artifactId>neo4j-ogm-embedded-driver</artifactId>
          <version>${neo4j-ogm.version}</version>
      </dependency>
      <dependency>
          <groupId>org.neo4j</groupId>
          <artifactId>neo4j</artifactId>
          <version>3.2.5</version>
          <scope>runtime</scope>
      </dependency>

      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-test</artifactId>
          <scope>test</scope>
      </dependency>

      <!-- added by me -->
      <dependency>
          <groupId>org.neo4j</groupId>
          <artifactId>neo4j-kernel</artifactId>
          <version>3.2.5</version>
          <type>test-jar</type>
      </dependency>
      <dependency>
          <groupId>com.graphaware.neo4j</groupId>
          <artifactId>graphaware-framework-embedded</artifactId>
          <version>3.2.5.51</version>
          <type>pom</type>
      </dependency>
      <dependency>
          <groupId>com.graphaware.neo4j</groupId>
          <artifactId>timetree</artifactId>
          <version>3.2.1.51.27</version>
      </dependency>
      <dependency>
          <groupId>org.neo4j</groupId>
          <artifactId>neo4j-graphdb-api</artifactId>
          <version>3.2.5</version>
      </dependency>
      <dependency>
          <groupId>org.neo4j</groupId>
          <artifactId>neo4j-io</artifactId>
          <version>3.2.5</version>
          <type>test-jar</type>
      </dependency>
      <dependency>
          <groupId>com.graphaware.neo4j</groupId>
          <artifactId>tests</artifactId>
          <version>3.2.5.51</version>
      </dependency>
  </dependencies>

person Alper Akture    schedule 20.10.2017    source источник


Ответы (1)


Я смог, наконец, заставить его работать, отладив исходный код neo4j. Тесты, которые проверяют и используют процедуры, находятся в https://github.com/graphaware/neo4j-timetree, и он использует класс ClassPathProcedureUtils для загрузки классов из каталога target/classes. Он ищет аннотации @Procedure и обрабатывает эти классы, и процедуры становятся доступными. Без изменения этого для загрузки классов из банок, а также цели/классов, единственный способ, которым я мог бы заставить его работать (хотя и хак), - это скопировать выходные данные цели/классов из проекта neo4j-timetree в мой выходной каталог цели/классов проекта .

ОБНОВЛЕНИЕ: мне также удалось заставить его работать, просто зарегистрировав необходимые процедуры напрямую, используя:

@Bean
public GraphDatabaseService graphDatabaseService() {
    GraphDatabaseService gds = new TestGraphDatabaseFactory().newImpermanentDatabaseBuilder().newGraphDatabase();
    try {
        ClassPathProcedureUtils.registerAllProceduresAndFunctions(procedures);
        Procedures procedures = ((GraphDatabaseFacade)gds).getDependencyResolver().resolveDependency(Procedures.class);
        procedures.registerProcedure(TimedEventsProcedure.class);
        procedures.registerProcedure(TimeTreeProcedure.class);
        procedures.registerFunction(TimedEventsProcedure.class);
        procedures.registerFunction(TimeTreeProcedure.class);
      }catch (Exception ex) {
        log.error("error", ex);
      }
      return gds;
}
person Alper Akture    schedule 27.10.2017