Как настроить встроенный Neo4j для запуска процедур apoc?

Я установил Neo4j, используя последнюю версию spring 1.5, spring-data-neo4j 4.2, с драйверами ogm. Конфигурация использует встроенный драйвер без 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());
}

Попытка запустить встроенную процедуру работает нормально:

/**
 * 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);
}

Теперь я хочу установить и запустить процедуры 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);
}

Однако вышеуказанное не удается с ошибкой Description: There is no procedure with the name 'apoc.help' registered for this database instance

Мне не удалось найти никакой документации для регистрации процедур apoc для запуска во встроенном режиме. Не удалось найти никаких ссылок на процедуры регистрации в документации OGM. Любые советы или фрагменты будут оценены.


person Roy Bailey    schedule 14.05.2017    source источник


Ответы (3)


Спасибо за указатель Майкл. Ваш пример хорош для прямого доступа, и этот ответ дал мне детали, необходимые для доступа через слой 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);
            }
        });
    }
}

и добавьте вызов для регистрации процедур в тесте при запуске со встроенным:

@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());
person Roy Bailey    schedule 15.05.2017

Вы должны зарегистрировать их вручную с помощью GraphDatabaseService.

См. Пример здесь: https://github.com/neo4j-contrib/rabbithole/blob/3.0/src/main/java/org/neo4j/community/console/Neo4jService.java#L55

person Michael Hunger    schedule 14.05.2017

С выпуском neo4j 4.0 некоторые вещи изменились (заметно Procedures по сравнению с GlobalProcedures), и поэтому я хочу поделиться своим решением.

Я хотел настроить встроенный neo4j вместе с neo4j для тестовых целей, и вот результаты:

  1. По какой-то причине при включении apoc из репозитория maven отсутствовали классы (например, пакет apoc.util содержал только один класс вместо ~ 20, также отсутствовали apoc.coll.Coll функции).

Чтобы исправить это, мне пришлось использовать этот ответ: Скомпилировать Jar из URL-адреса в Gradle

а затем в свой блок зависимостей я включил

    testImplementation(urlFile("https://github.com/neo4j-contrib/neo4j-apoc-procedures/releases/download/4.1.0.0/apoc-4.1.0.0-all.jar", "neo4j-apoc"))
  1. Когда все классы зарегистрируют все, что вам нужно, в моем случае я регистрирую только Coll функций:

EmbeddedNeo4jDriver.kt

val managementService = org.neo4j.dbms.api.DatabaseManagementServiceBuilder(TestConfiguration.Neo4j.directory)
       .setConfig(BoltConnector.enabled, true)
       .setConfig(BoltConnector.listen_address, SocketAddress(TestConfiguration.Neo4j.hostname, TestConfiguration.Neo4j.port))
       .build()
   

managementService.listDatabases().first()
       .let(managementService::database)
       .let { it as org.neo4j.kernel.internal.GraphDatabaseAPI }
       .dependencyResolver
       .resolveDependency(org.neo4j.kernel.api.procedure.GlobalProcedures::class.java)
       .registerFunction(apoc.coll.Coll::class.java)
person mightybruno    schedule 06.07.2020