Java 使用嵌入式数据库的单元测试中的Graphaware时间树过程
更新:我在neo4j时间树源代码中发现了一些类似的测试,但使用了GraphaReintegrationTest,它扩展了ServerIntegrationTest。所以我尝试用下面的代码为我的测试创建一个GraphDatabaseService Bean,但仍然没有成功。我发现没有为该数据库实例注册名为ga.timetree.events.attach的过程。这不可能吗Java 使用嵌入式数据库的单元测试中的Graphaware时间树过程,java,unit-testing,spring-data,spring-data-neo4j,graphaware,Java,Unit Testing,Spring Data,Spring Data Neo4j,Graphaware,更新:我在neo4j时间树源代码中发现了一些类似的测试,但使用了GraphaReintegrationTest,它扩展了ServerIntegrationTest。所以我尝试用下面的代码为我的测试创建一个GraphDatabaseService Bean,但仍然没有成功。我发现没有为该数据库实例注册名为ga.timetree.events.attach的过程。这不可能吗 @Bean public GraphDatabaseService graphDatabaseService() {
@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、graphaware和时间树。我有自动事件附件设置,我看到事件被保存到时间树中,但我不能使用cypher使用过程调用进行查询。我得到一个错误:
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。我可以在过程调用中定义自定义根树id的任何帮助或指向cypher的指针也将非常感谢。谢谢你的帮助
测试:
目前回购硬编码开始/结束:
public interface WorkoutRepository extends Neo4jRepository<Workout, Long> {
@Query("CALL ga.timetree.range({start: 1506826887000, end: 1512097287, create: false})")
Iterable<Workout> findWorkouts();
}
pom.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>
我最终能够通过在neo4j源代码中调试使其工作。测试和使用过程的测试在中,它使用ClassPathProcedureUtils类从target/classes目录加载类。它寻找@Procedure注释,并将处理这些类,从而使这些过程变得可用。如果不修改它以从JAR加载类以及目标/类,我唯一能让它工作的方法就是将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;
}
@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;
}