通过Bolt

时间:2019-02-27 14:33:36

标签: java neo4j neo4j-ogm neo4j-browser neo4j-embedded

我正在将Neo4J嵌入式数据库与OGM一起使用,并通过OGM SessionFactory 在目录中创建数据库服务:

Configuration configuration = new Configuration.Builder()
                .uris("C:\neoEmbeddedDb")
                .build();

        factory = new SessionFactory(configuration, packages);

这很好用,但是现在我想用Neo4J浏览器工具浏览创建的数据库。如我所读,我必须通过Bolt公开我的数据库才能访问它。

Neo4J Embedded documentation中,他们使用 GraphDatabaseService 并只需指定其他螺栓驱动程序即可公开数据库:

GraphDatabaseService graphDb = new GraphDatabaseFactory()
                .newEmbeddedDatabaseBuilder( DB_PATH )
                .setConfig( bolt.type, "BOLT" )
                .setConfig( bolt.enabled, "true" )
                .setConfig( bolt.address, "localhost:7687" )
                .newGraphDatabase();

但是不幸的是,使用OGM SessionFactory时我没有此选项。 我尝试使用多个URI调用配置生成器:

Configuration configuration = new Configuration.Builder()
                .uris(new String[]{this.databasePath.toUri().toString(), "localhost:7687"})
                .build();

但是似乎忽略了第一个URI(我的文件位置),而是在一个临时位置创建了数据库。

调试输出将相应的消息记录到控制台:

Creating temporary file store: file:/C:/Temp/neo4jTmpEmbedded.db2736315981519762299/database/

任何人都可以解释我如何通过螺栓公开我的嵌入式数据库或如何使用Neo4J浏览器访问它吗?

非常感谢!


解决方案

在meistermeier的帮助下,我能够创建一个真实的EmbeddedDatabase并将其OGM连接到它。我添加了Bolt连接选项,因为它们在文档中找到了。现在,数据库已创建并通过Bolt正确公开。我可以连接Neo4J桌面Windows浏览器。

最终代码是

BoltConnector boltConnector = new BoltConnector(_BOLT_CONNECTION_STRING);

GraphDatabaseService graphDb = new GraphDatabaseFactory()
        .newEmbeddedDatabaseBuilder(databasePath.toFile())
        .setConfig(boltConnector.type, "BOLT" )
        .setConfig(boltConnector.enabled, "true" )
        .setConfig(boltConnector.listen_address, "localhost:7687" )
        .setConfig(GraphDatabaseSettings.auth_enabled, "false")
        .newGraphDatabase();

registerShutdownHook(graphDb);

// connect OGM session factory to embedded database
EmbeddedDriver driver = new EmbeddedDriver(graphDb);
final String[] packages = new String[] {
        "Entity domain package",
};

factory = new SessionFactory(driver, packages);

1 个答案:

答案 0 :(得分:1)

首先:Neo4j-OGM除了创建与其连接之外,不负责任何更复杂的数据库启动。 为Neo4j实例提供自定义配置将使您的应用程序负责正确设置它。

第二:您无法实现的目标。至少与服务Neo4j浏览器的另一个服务器实例不同,该服务器实例一旦启动就可以连接到任何bolt协议服务器。您可以启动一个嵌入式实例,如果确实需要,可以打开螺栓端口。但是将不会部署内置的Neo4j浏览器。

但是毕竟让我解释一下为什么您看到临时数据库文件夹消息: 在设置摘要中,我可以看到创建了两个实例:一个通过创建GraphDatabaseService的显式实例,另一个通过配置创建。 第一个很明显,第二个没有那么多。 我只是假设您没有使用Neo4j-OGM的最新版本(撰写此答案时为3.1.8)。

方法/参数uris仅用于有关因果群集和路由的其他问题(3.1.8之前)。在这种情况下,您必须将uri与单个uri(bolt://....file:///...)一起使用。在未定义uri的情况下,Neo4j-OGM的行为将退回到临时的嵌入式实例。

此问题的另一种解决方案是不提供Configuration的{​​{1}}实例,而提供EmbeddedDriver实例。这样可以像SessionFactory一样包装已经配置的GraphDatabaseService。然后,您将拥有裸露的螺栓端口,但是不幸的是,没有运行的浏览器。