Spring @DataNeo4jTest 支持过程
Spring @DataNeo4jTest with Procedure Support
我正在使用 @DataNeo4jTest
编写 Spring Data Neo4J 存储库测试,一切都很好,直到我针对使用过程的自定义查询编写测试,例如 apoc.coll.intersection
。错误声明过程 apoc.coll.intersection
未知。我在类路径上有 APOC JAR,所以我猜我需要找到一种方法来向 @DataNeo4jTest
使用的嵌入式 datasource/driver 注册该过程。
如有任何帮助,我们将不胜感激。谢谢。
了解情况的一些背景知识:@DataNeo4jTest
注释为您提供了 Spring 基于引导的自动配置。它将在您的 application.properties
中获取您的 Neo4j 连接配置(如果未定义测试属性,则为测试或生产)并为您创建具有匹配配置的 Neo4j-OGM SessionFactory
。
有两种方法可以解决您的问题:
使用嵌入式实例设置和配置自行定义 SessionFactory
bean:
@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");
}
或者在 "runtime" 期间使用已经存在的 SessionFactory
bean,例如在您的测试设置中(确保只执行一次)
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>
在纠结这个问题一段时间后,尝试不同的依赖版本,并按照@meistermeier 的建议使用配置代码,我找到了一个解决方案,即简单地使用正确版本的 2 个 Neo4J 测试 JAR正在引用。这是一个 Spring 引导项目,所以这里是我的 Maven POM 中解决问题的所有 Neo4J 依赖项:
<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 中指定的版本(它是传递引入的)。
我正在使用 @DataNeo4jTest
编写 Spring Data Neo4J 存储库测试,一切都很好,直到我针对使用过程的自定义查询编写测试,例如 apoc.coll.intersection
。错误声明过程 apoc.coll.intersection
未知。我在类路径上有 APOC JAR,所以我猜我需要找到一种方法来向 @DataNeo4jTest
使用的嵌入式 datasource/driver 注册该过程。
如有任何帮助,我们将不胜感激。谢谢。
了解情况的一些背景知识:@DataNeo4jTest
注释为您提供了 Spring 基于引导的自动配置。它将在您的 application.properties
中获取您的 Neo4j 连接配置(如果未定义测试属性,则为测试或生产)并为您创建具有匹配配置的 Neo4j-OGM SessionFactory
。
有两种方法可以解决您的问题:
使用嵌入式实例设置和配置自行定义 SessionFactory
bean:
@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");
}
或者在 "runtime" 期间使用已经存在的 SessionFactory
bean,例如在您的测试设置中(确保只执行一次)
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>
在纠结这个问题一段时间后,尝试不同的依赖版本,并按照@meistermeier 的建议使用配置代码,我找到了一个解决方案,即简单地使用正确版本的 2 个 Neo4J 测试 JAR正在引用。这是一个 Spring 引导项目,所以这里是我的 Maven POM 中解决问题的所有 Neo4J 依赖项:
<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 中指定的版本(它是传递引入的)。