2017-05-14 55 views
0

我使用最新的spring 1.5发行版,spring-data-neo4j 4.2,使用ogm驱动程序设置Neo4j。该配置是使用嵌入式驱动程序,而不URI(所以无常数据库存储)如何配置Neo4j嵌入式运行apoc程序?

这里是春天@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程序:

/** 
* 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层来访问所需要的细节:

Deploy a Procedure to Neo4J when using the embedded driver

所以这里就是我结束了注册通过弹簧数据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());