如何配置Neo4j embedded来运行apoc程序?

Roy*_*ley 5 neo4j spring-data-neo4j neo4j-embedded neo4j-ogm

我使用最新的spring 1.5版本spring-data-neo4j 4.2和ogm驱动程序设置了Neo4j.配置使用没有URI的嵌入式驱动程序(如此无常的数据库存储)

这是spring @Configuration bean的内容:

@Bean
public org.neo4j.ogm.config.Configuration neo4jConfiguration() {
    org.neo4j.ogm.config.Configuration configuration = new org.neo4j.ogm.config.Configuration();
    configuration.driverConfiguration().setDriverClassName("org.neo4j.ogm.drivers.embedded.driver.EmbeddedDriver");
    // don't set the URI for embedded so we get an impermanent database
    return configuration;
}

@Bean
public SessionFactory getSessionFactory() {
    return new SessionFactory(
            neo4jConfiguration(),
            "xxx.yyy.springboot.neo4j.domain");
}

@Bean
public Neo4jTransactionManager transactionManager() {
    return new Neo4jTransactionManager(getSessionFactory());
}
Run Code Online (Sandbox Code Playgroud)

试图运行内置程序工作正常:

/**
 * Test we can call out to standard built-in procedures using cypher
 */
@Test
public void testNeo4jProcedureCalls() {

    Session session = sessionFactory.openSession();
    Result result = session.query("CALL dbms.procedures()", ImmutableMap.of());

    assertThat(result).isNotNull();
    List<Map<String, Object>> dataList = StreamSupport.stream(result.spliterator(), false)
            .collect(Collectors.toList());
    assertThat(dataList).isNotNull();
    assertThat(dataList.size()).isGreaterThan(0);
}
Run Code Online (Sandbox Code Playgroud)

现在我想安装并运行apoc程序,我已将其添加到类路径中:

/**
 * Test we can call out to https://neo4j-contrib.github.io/neo4j-apoc-procedures
 */
@Test
public void testNeo4jApocProcedureCalls() {

    Session session = sessionFactory.openSession();
    Result result = session.query("CALL apoc.help(\"apoc\")", ImmutableMap.of());

    assertThat(result).isNotNull();
    List<Map<String, Object>> dataList = StreamSupport.stream(result.spliterator(), false)
            .collect(Collectors.toList());
    assertThat(dataList).isNotNull();
    assertThat(dataList.size()).isGreaterThan(0);
}
Run Code Online (Sandbox Code Playgroud)

但是,上面的错误会失败 Description: There is no procedure with the name 'apoc.help' registered for this database instance

我找不到任何用于注册apoc过程以在嵌入模式下运行的文档.在OGM文档中找不到任何对注册程序的引用.任何提示或片段将不胜感激.

Roy*_*ley 5

谢谢指针迈克尔.您的示例适用于直接访问,此答案为我提供了通过neo4j-ogm层访问所需的详细信息:

使用嵌入式驱动程序时,将过程部署​​到Neo4J

所以这就是我通过spring-data-neo4j注册程序的结果

注意:isEmbedded()检查neo4j驱动程序属性值是否包含'embedded',并且Components.driver()调用是ogm层提供的静态方法.

public void registerProcedures(List<Class<?>> toRegister) {
    if(isEmbedded()) {
        EmbeddedDriver embeddedDriver = (EmbeddedDriver) Components.driver();
        GraphDatabaseService databaseService = embeddedDriver.getGraphDatabaseService();
        Procedures procedures = ((GraphDatabaseAPI) databaseService).getDependencyResolver().resolveDependency(Procedures.class);
        toRegister.forEach((proc) -> {
            try {
                procedures.registerProcedure(proc);
            } catch (KernelException e) {
                throw new RuntimeException("Error registering " + proc, e);
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

并在使用embedded运行时添加调用以在测试中注册过程:

@Test
public void testNeo4jApocProcedureCalls() {

    registerProcedures(asList(
            Help.class,
            Json.class,
            LoadJson.class,
            Xml.class,
            PathExplorer.class,
            Meta.class)
    );
    Session session = sessionFactory.openSession();
    Result result = session.query("CALL apoc.help('apoc')", ImmutableMap.of());
Run Code Online (Sandbox Code Playgroud)


Mic*_*ger 3

您必须使用 GraphDatabaseService 手动注册它们。

请参阅此处的示例:https://github.com/neo4j-contrib/rabbithole/blob/3.0/src/main/java/org/neo4j/community/console/Neo4jService.java#L55