Предоставление встроенной базы данных Neo4J OGM через болт
Я использую встроенную базу данных Neo4J с OGM и создаю службу базы данных в каталоге через OGM SessionFactory:
Configuration configuration = new Configuration.Builder()
.uris("C:\neoEmbeddedDb")
.build();
factory = new SessionFactory(configuration, packages);
Это хорошо работает, но теперь я хочу просмотреть созданную базу данных с помощью инструмента браузера Neo4J. Когда я читаю, я должен открыть свою базу данных через Bolt, чтобы иметь доступ к ней.
В документации по Neo4J Embedded они используют 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. Я могу подключиться к своему Neo4J Desktop Windows Browser.
Окончательный код
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 ответ
Прежде всего: Neo4j-OGM не отвечает за более сложный запуск базы данных, кроме создания подключения к ней. Предоставление экземпляра Neo4j с пользовательской конфигурацией сделает ваше приложение ответственным за правильную настройку.
Во-вторых: то, что вы пытаетесь достичь, невозможно. По крайней мере, не с другим экземпляром сервера, который обслуживает браузер Neo4j, который может подключиться к любому серверу протокола болтов после запуска. Вы можете запустить встроенный экземпляр и, если вы действительно этого хотите, открыть порт болта. Но встроенный браузер Neo4j не будет развернут.
Но, в конце концов, позвольте мне объяснить, почему вы видите сообщение о временной папке в БД: в ваших установочных фрагментах я вижу, как создаются два экземпляра: один путем создания явного экземпляра GraphDatabaseService
а другой через конфигурацию. Первое очевидно, второе не так много. Я просто предполагаю, что вы не используете самую последнюю версию Neo4j-OGM (3.1.8 на момент написания этого ответа).
Метод / параметр uris
только для дополнительного Uris (до 3.1.8) относительно причинного кластера и маршрутизации. Вы должны использовать uri
с одним URI (либо bolt://....
или же file:///...
) в твоем случае. Поведение Neo4j-OGM в случае неопределенного uri
это вернуться к временному встроенному экземпляру.
Другое решение этой проблемы - не предоставлять Configuration
но EmbeddedDriver
экземпляр для SessionFactory
, Это может обернуть уже настроенный GraphDatabaseService
лайк new SessionFactory(new EmbeddedDriver(graphDatabaseService), ...)
, Тогда у вас будет открытый порт болта, но, к сожалению, не запущенный браузер.