首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Spring @DataNeo4jTest支持过程

Spring @DataNeo4jTest支持过程
EN

Stack Overflow用户
提问于 2018-08-27 12:14:38
回答 2查看 487关注 0票数 0

我正在使用@DataNeo4jTest编写Spring Data Neo4J存储库测试,在针对使用过程的自定义查询(例如apoc.coll.intersection )编写测试之前,一切都很顺利。该错误声明过程apoc.coll.intersection未知。我在类路径中有APOC JAR,所以我猜我需要找到一种方法来将过程注册到@DataNeo4jTest使用的嵌入式数据源/驱动程序中。

任何帮助都将不胜感激。谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-03 00:40:10

在尝试了很长一段时间后,尝试了不同的依赖版本,并按照@meistermeier的建议尝试了配置代码,我找到了一个解决方案,那就是简单地使用我引用的两个Neo4J测试JAR的正确版本。这是一个Spring Boot项目,下面是我的Maven POM中解决这个问题的所有Neo4J依赖项:

代码语言:javascript
复制
<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
EN

Stack Overflow用户

发布于 2018-08-27 16:45:24

了解这种情况的一些背景知识:@DataNeo4jTest注释为您提供了基于Spring Boot的自动配置。它将获取application.properties中的Neo4j连接配置(如果未定义测试属性,则为测试或生产),并为您创建具有匹配配置的Neo4j-OGM的SessionFactory

有两种方法可以解决你的问题:

使用嵌入式实例设置和配置自行定义SessionFactory bean:

代码语言:javascript
复制
@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 bean的“运行时”期间,例如在你的测试设置中(确保只做一次)

代码语言:javascript
复制
EmbeddedDriver loadedDriver = (EmbeddedDriver) sessionFactory.getDriver();
registerProcedure(loadedDriver.getGraphDatabaseService(), MyProcedure.class);

两者都将调用如下所示的方法

代码语言:javascript
复制
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);
    }
}

更新:添加了示例和版本定义。

代码语言:javascript
复制
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定义:

代码语言:javascript
复制
<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>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52032489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档