neo4j程序测试与apoc不编译

ghg1uchk  于 2023-10-18  发布在  其他
关注(0)|答案(1)|浏览(139)

我有一个项目,我可以成功地测试我的用户程序编写使用neo4j遍历框架的基础上,测试项目的例子。
pom文件的相关部分是

...
  <neo4j.version>5.12.0</neo4j.version>
  <neo4j-java-driver.version>5.3.0</neo4j-java-driver.version>
</properties>
  <dependencies>
    <dependency>
      <groupId>org.neo4j</groupId>
      <artifactId>neo4j</artifactId>
      <version>${neo4j.version}</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.neo4j.test</groupId>
      <artifactId>neo4j-harness</artifactId>
      <version>${neo4j.version}</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.neo4j.driver</groupId>
      <artifactId>neo4j-java-driver</artifactId>
      <version>${neo4j-java-driver.version}</version>
      <scope>test</scope>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.neo4j.procedure/apoc -->
    <dependency>
      <groupId>org.neo4j.procedure</groupId>
      <artifactId>apoc</artifactId>
      <version>4.4.0.1</version>
      <scope>test</scope>
    </dependency>
...

我已经像这样设置了嵌入式数据库服务器

@BeforeEach
void initializeNeo4j() throws IOException {
    
    var sw = new StringWriter();
    try (var in = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("/getNode/tvlike_test_data.cypher")))) {
        in.transferTo(sw);
        sw.close();
    }
    //split into each statement so can be run one by one
    List<String> statements = Arrays.asList(sw.toString().split(";\r\n"));

    var builder = Neo4jBuilders.newInProcessBuilder()
            .withDisabledServer()
            .withProcedure(GetNode.class);

    for (String statement : statements) {
        builder.withFixture(statement);
    }
    
    this.embeddedDatabaseServer = builder.build();
}

并且测试成功运行,例如,

@Test
void TryIt() {
            try (
                    var driver = GraphDatabase.driver(embeddedDatabaseServer.boltURI());
                    var session = driver.session()
    
            ) {
    
                var results = session.run("""
                                match(u:User{userId:'u1'})
                                where u.isEnabled = true
                                match(n:Trial{id: 'tr1'})
                                call cctc.getNode(n, u, { includeFoundPermissions : true }) 
                                    yield allNodePerms, allPropPerms
                                return allNodePerms, allPropPerms""")
                        .single();
                var resMap = results.asMap();
    
                //
                var allNodePerms = (List<Map<String, Object>>) resMap.get("allNodePerms");
                assertThat(allNodePerms.size()).isEqualTo(1);
            }
        }

我想在我的测试中包括apoc过程和功能,但我不能成功地添加必要的基础设施。例如,运行此

@Test
void TryIt2() {
    try (
            var driver = GraphDatabase.driver(embeddedDatabaseServer.boltURI());
            var session = driver.session()

    ) {

        var results = session.run("""
                        return apoc.text.code(103) AS output""")
                .single();

        assertThat(results.get("output")).isEqualTo("g");
    }}

给出了错误
org.neo4j.driver.exceptions.ClientException:未知函数“apoc.text.code”(第1行,第8列(偏移量:7))“return apoc.text.code(102)AS output”
正如你所料
问题是如何在设置步骤中将apoc库添加到嵌入式服务器中?我试过许多例子中发现的各种样品,但没有成功。
pom文件已经包含apoc过程的依赖项。我试过用各种方式修改@BeforeEach方法,例如:

但没有成功。
我怎样才能修改这个

var builder = Neo4jBuilders.newInProcessBuilder()
                .withDisabledServer()
                .withProcedure(GetNode.class);

在我的initializeNeo 4j方法中包含apoc?

2ul0zpep

2ul0zpep1#

首先,您应该确保您的neo4j依赖项具有兼容的版本。您目前正在使用不同的版本:

  • neo4j的版本5.12.0
  • neo4j-java-driver的5.3.0版
  • apoc的4.4.0.1版本。

为了保持所有3个依赖项的一致性,后2个工件的正确依赖项如下所示(请注意,在5.x中,核心apoc的artifactIdapoc-core):

<dependency>
    <groupId>org.neo4j.driver</groupId>
    <artifactId>neo4j-java-driver</artifactId>
    <version>${neo4j.version}</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.neo4j.procedure</groupId>
    <artifactId>apoc-core</artifactId>
    <version>${neo4j.version}</version>
    <scope>test</scope>
</dependency>

通常,要在嵌入式服务器中使用APOC核心函数(或过程),需要找到实现该函数(或过程)的APOC核心类。为此,您可以:
1.在APOC core github repo中选择您正在使用的版本的Tag
1.搜索函数(或过程)的名称。例如,对于apoc.text.code,查找类似于@UserFunction("apoc.text.code")的匹配项。
1.获取实现所需内容的APOC类(包括包)的名称。例如,apoc.text.Strings
1.在调用newInProcessBuilder的类中,添加该APOC类的import
1.调用构建器的withFunction(或withProcedure)方法并将APOC类传递给它。例如,withFunction(Strings.class)

相关问题