用户定义函数
用户定义函数是过程的简化形式,它们返回单个值,并且是只读的。虽然它们的强大功能有限,但它们通常比过程更容易使用,并且对于许多常见任务来说更有效率。有关用户定义过程、函数和聚合函数的比较,请参见Neo4j 定制代码。
调用用户定义函数
用户定义函数的调用方式与任何其他 Cypher 函数相同。函数名称必须是完全限定的,因此在包 org.neo4j.examples
中定义的名为 join
的函数可以使用以下方式调用
MATCH (p: Person) WHERE p.age = 36
RETURN org.neo4j.examples.join(collect(p.names))
创建函数
用户定义函数的创建方式类似于过程的创建方式。但与过程不同的是,它们使用 @UserFunction
进行注释,并返回单个值而不是值流。
有关值和类型的详细信息,请参见值和类型。
有关更多详细信息,请参见Neo4j Javadocs for org.neo4j.procedure.UserFunction
。
从函数内部发出错误信号的正确方法是抛出 |
package example;
import java.util.List;
import org.neo4j.procedure.Description;
import org.neo4j.procedure.Name;
import org.neo4j.procedure.UserFunction;
public class Join
{
@UserFunction
@Description("example.join(['s1','s2',...], delimiter) - join the given strings with the given delimiter.")
public String join(
@Name("strings") List<String> strings,
@Name(value = "delimiter", defaultValue = ",") String delimiter) {
if (strings == null || delimiter == null) {
return null;
}
return String.join(delimiter, strings);
}
}
集成测试
用户定义函数的测试创建方式与过程的测试相同。
用于测试连接字符串列表的用户定义函数的模板。
package example;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInstance;
import org.neo4j.driver.Driver;
import org.neo4j.driver.GraphDatabase;
import org.neo4j.driver.Session;
import org.neo4j.harness.Neo4j;
import org.neo4j.harness.Neo4jBuilders;
import static org.assertj.core.api.Assertions.assertThat;
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
public class JoinTest {
private Neo4j embeddedDatabaseServer;
@BeforeAll
void initializeNeo4j() {
this.embeddedDatabaseServer = Neo4jBuilders.newInProcessBuilder()
.withDisabledServer()
.withFunction(Join.class)
.build();
}
@AfterAll
void closeNeo4j() {
this.embeddedDatabaseServer.close();
}
@Test
void joinsStrings() {
// This is in a try-block, to make sure we close the driver after the test
try(Driver driver = GraphDatabase.driver(embeddedDatabaseServer.boltURI());
Session session = driver.session()) {
// When
String result = session.run( "RETURN example.join(['Hello', 'World']) AS result").single().get("result").asString();
// Then
assertThat( result).isEqualTo(( "Hello,World" ));
}
}
}