我有一个项目,我可以成功地测试我的用户程序编写使用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方法,例如:
- https://github.com/Lukasmp3/neo4j-apoc-testing/commit/6ff0b3e92c4ca1b04f190638a6dcf280270a5f50
- https://github.com/michael-simons/neo4j-examples-and-tips/blob/master/examples/testing-ogm-against-embedded-with-apoc/src/test/java/org/neo4j/tips/testing/testing_ogm_against_embedded_with_apoc/ApplicationTests.java
- https://github.com/neo4j-contrib/rabbithole/blob/3.0/src/main/java/org/neo4j/community/console/Neo4jService.java#L55
但没有成功。
我怎样才能修改这个
var builder = Neo4jBuilders.newInProcessBuilder()
.withDisabledServer()
.withProcedure(GetNode.class);
在我的initializeNeo 4j方法中包含apoc?
1条答案
按热度按时间2ul0zpep1#
首先,您应该确保您的neo4j依赖项具有兼容的版本。您目前正在使用不同的版本:
neo4j
的版本5.12.0neo4j-java-driver
的5.3.0版apoc
的4.4.0.1版本。为了保持所有3个依赖项的一致性,后2个工件的正确依赖项如下所示(请注意,在5.x中,核心apoc的
artifactId
是apoc-core
):通常,要在嵌入式服务器中使用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)
。