Используйте разные базы данных, встроенные в Neo4j с Java

Я пытаюсь оценить различные модели данных в Neo4j. По этой причине я создал две базы данных с разными моделями и сохранил их в одном каталоге:

path/to/database/graphModel1
path/to/database/graphModel2

Следующим шагом является то, что я создал приложение с Java, где я могу выбрать модель данных и запрос, который я хочу оценить (есть только несколько предопределенных запросов). В зависимости от того, какая модель была выбрана, я хочу использовать экземпляр встроенной базы данных. На данный момент я использую следующее условие if, чтобы различать их:

if (model.equals("G1")) {
    graph = new GraphDatabaseFactory().newEmbeddedDatabase(DB_PATH_1);
} else if (model.equals("G2")) {
    graph = new GraphDatabaseFactory().newEmbeddedDatabase(DB_PATH_2);
} 
registerShutdownHook(graph);

Но используя этот фрагмент кода, я получил следующее исключение после того, как выполнил первый запрос с моделью 1 и хочу вычислить тот же запрос с моделью 2:

Caused by: org.neo4j.kernel.lifecycle.LifecycleException: Component 'org.neo4j.kernel.StoreLockerLifecycleAdapter@1f1e9b8' was successfully initialized, but failed to start. Please see attached cause exception.
at org.neo4j.kernel.lifecycle.LifeSupport$LifecycleInstance.start(LifeSupport.java:513)
at org.neo4j.kernel.lifecycle.LifeSupport.start(LifeSupport.java:115)
at org.neo4j.kernel.InternalAbstractGraphDatabase.run(InternalAbstractGraphDatabase.java:330)
... 69 more
Caused by: org.neo4j.kernel.StoreLockException: Unable to obtain lock on store lock file: path/to/database/graphModel1/store_lock. Please ensure no other process is using this database, and that the directory is writable (required even for read-only access)
at org.neo4j.kernel.StoreLocker.checkLock(StoreLocker.java:78)
at org.neo4j.kernel.StoreLockerLifecycleAdapter.start(StoreLockerLifecycleAdapter.java:44)
at org.neo4j.kernel.lifecycle.LifeSupport$LifecycleInstance.start(LifeSupport.java:507)
... 71 more
Caused by: java.io.IOException: Couldn't lock lock file path/to/database/graphModel1/lock because another process already holds the lock.
at org.neo4j.io.fs.FileLock.getLockFileBasedFileLock(FileLock.java:126)
at org.neo4j.io.fs.FileLock.getOsSpecificFileLock(FileLock.java:70)
at org.neo4j.io.fs.DefaultFileSystemAbstraction.tryLock(DefaultFileSystemAbstraction.java:85)
at org.neo4j.kernel.StoreLocker.checkLock(StoreLocker.java:74)
... 73 more

Я понял, что уже есть store_lock и lock на первой базе данных, но как это влияет на запуск второй встроенной базы данных? кто-нибудь знает, как решить эту проблему?

Заранее спасибо!

2 ответа

Вполне возможно, что ваш экземпляр GraphDatabase не был должным образом закрыт - оставив его в заблокированном состоянии. Я вижу в вашем коде выше, что вы регистрируете ловушку отключения, но для graphDB не graph, Это может объяснить, как экземпляр не был правильно закрыт.

Если вы знаете, что нет других экземпляров, указывающих на каталог Neo4j, вы можете попробовать вручную удалить graph.db/lock а также graph.db/store_lock файлы и запуск вашего кода снова.

В структуре каталогов для (встроенного) хранилища базы данных существует давнее распространенное недопонимание. Дизайнеры отправляют «корневую» папку БД в API, в то время как требуется отправить папку дочернего репозитория.

      new GraphDatabaseFactory().newEmbeddedDatabase( "path/to/db" ) // wrong
new GraphDatabaseFactory().newEmbeddedDatabase( "path/to/db/repository" ) // correct

В описанном случае рассмотрите возможность расширения путей к созданным/повторно используемым местоположениям базы данных с помощью папки «репозиторий» (это имя может быть изменено):

      path/to/database/graphModel1/repository
path/to/database/graphModel2/repository

Когда оба экземпляра БД запустятся одновременно, вы увидите следующие созданные элементы файловой системы:

      path/to/database/graphModel1/repository
path/to/database/graphModel1/logs
path/to/database/graphModel1/store_lock

path/to/database/graphModel2/repository
path/to/database/graphModel2/logs
path/to/database/graphModel2/store_lock

Как видим, никаких конфликтов «store_lock» здесь нет. Проверено с Neo4j версии 3.5.17, "встроенная" установка.

Другие вопросы по тегам