通过螺栓公开嵌入式 Neo4J OGM 数据库
Exposing embedded Neo4J OGM database via bolt
我将 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/
谁能解释我如何通过 bolt 公开我的嵌入式数据库或使用 Neo4J 浏览器以其他方式访问它?
非常感谢!
解决方案
在 meistermeier 的帮助下,我能够创建一个真正的嵌入式数据库并将我的 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);
首先:Neo4j-OGM 除了创建与它的连接之外,不负责任何更复杂的数据库启动。
提供具有自定义配置的 Neo4j 实例将使您的应用程序负责正确设置它。
其次:你想要达到的目标是不可能的。至少不会与另一个服务于 Neo4j 浏览器的服务器实例一起使用,该浏览器一旦启动就可以连接到任何 bolt 协议服务器。你可以启动一个嵌入式实例,如果你真的想要这个,打开螺栓端口。但是不会部署内置的Neo4j浏览器。
但毕竟让我解释一下为什么您会看到临时数据库文件夹消息:
在您的设置片段中,我可以看到创建了两个实例:一个是通过创建 GraphDatabaseService
的显式实例,另一个是通过配置创建的。
第一个很明显,第二个不是那么多。
我只是假设您没有使用最新版本的 Neo4j-OGM(在撰写此答案时为 3.1.8)。
method/parameter uris
仅用于关于因果集群和路由的附加 uris(3.1.8 之前)。在您的情况下,您必须将 uri
与单个 uri(bolt://....
或 file:///...
)一起使用。 Neo4j-OGM 在未定义的情况下的行为 uri
是退回到临时嵌入实例。
此问题的另一个解决方案是不提供 Configuration
,而是 SessionFactory
的 EmbeddedDriver
实例。这可以像 new SessionFactory(new EmbeddedDriver(graphDatabaseService), ...)
一样包装已经配置的 GraphDatabaseService
。然后你会有暴露的螺栓端口但不幸的是不是 运行 浏览器。
我将 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/
谁能解释我如何通过 bolt 公开我的嵌入式数据库或使用 Neo4J 浏览器以其他方式访问它?
非常感谢!
解决方案
在 meistermeier 的帮助下,我能够创建一个真正的嵌入式数据库并将我的 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);
首先:Neo4j-OGM 除了创建与它的连接之外,不负责任何更复杂的数据库启动。 提供具有自定义配置的 Neo4j 实例将使您的应用程序负责正确设置它。
其次:你想要达到的目标是不可能的。至少不会与另一个服务于 Neo4j 浏览器的服务器实例一起使用,该浏览器一旦启动就可以连接到任何 bolt 协议服务器。你可以启动一个嵌入式实例,如果你真的想要这个,打开螺栓端口。但是不会部署内置的Neo4j浏览器。
但毕竟让我解释一下为什么您会看到临时数据库文件夹消息:
在您的设置片段中,我可以看到创建了两个实例:一个是通过创建 GraphDatabaseService
的显式实例,另一个是通过配置创建的。
第一个很明显,第二个不是那么多。
我只是假设您没有使用最新版本的 Neo4j-OGM(在撰写此答案时为 3.1.8)。
method/parameter uris
仅用于关于因果集群和路由的附加 uris(3.1.8 之前)。在您的情况下,您必须将 uri
与单个 uri(bolt://....
或 file:///...
)一起使用。 Neo4j-OGM 在未定义的情况下的行为 uri
是退回到临时嵌入实例。
此问题的另一个解决方案是不提供 Configuration
,而是 SessionFactory
的 EmbeddedDriver
实例。这可以像 new SessionFactory(new EmbeddedDriver(graphDatabaseService), ...)
一样包装已经配置的 GraphDatabaseService
。然后你会有暴露的螺栓端口但不幸的是不是 运行 浏览器。