Как настроить встроенный Neo4j для запуска процедур apoc?
Я настроил Neo4j, используя последнюю версию spring 1.5, spring-data-neo4j 4.2, с драйверами ogm. Конфигурация использует встроенный драйвер без URI (поэтому постоянное хранилище базы данных)
Вот содержимое bean-компонента @Configuration:
@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, которые я добавил в classpath:
/**
* 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. Любые советы или фрагменты будут оценены.
2 ответа
Спасибо за указатель Майкл. Ваш пример хорош для прямого доступа, и этот ответ дал мне детали, необходимые для доступа через слой neo4j-ogm:
Разверните процедуру на Neo4J при использовании встроенного драйвера
так вот что я закончил, чтобы зарегистрировать процедуры через spring-data-neo4j
Замечания: isEmbedded()
проверяет, что значение свойства драйвера neo4j содержит встроенный 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());
Вы должны зарегистрировать их вручную в вашем GraphDatabaseService.
Смотрите здесь для примера: https://github.com/neo4j-contrib/rabbithole/blob/3.0/src/main/java/org/neo4j/community/console/Neo4jService.java#L55
С выпуском neo4j 4.0 кое-что изменилось (заметно Procedures
против GlobalProcedures
), и поэтому я хочу поделиться своим решением.
Я хотел установить встроенный neo4j вместе с neo4j в тестовых целях, и вот результаты:
- По какой-то причине при включении 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"))
- После того, как все классы зарегистрируют все, что вам нужно, в моем случае я регистрируюсь только
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)