通过Java使用Neo4j中嵌入的不同数据库

tktrz96b  于 2022-11-05  发布在  Java
关注(0)|答案(2)|浏览(289)

我试图在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);

但是,在使用model 1执行第一个查询并希望使用model 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,但是这对启动第二个嵌入式数据库有什么影响呢?有人知道如何解决这个问题吗?
提前感谢!

ou6hu8tu

ou6hu8tu1#

可能是您的GraphDatabase示例没有正确关闭-使其处于锁定状态。我在上面的代码中看到您注册了一个关闭挂钩,但对于graphDB不是graph。这可能解释了该示例为什么没有正确关闭。
如果您知道没有其他示例指向您的Neo4j目录,则可以尝试手动删除graph.db/lockgraph.db/store_lock文件,然后再次运行代码。

xjreopfe

xjreopfe2#

长期以来,对于(嵌入式)数据库存储位置的目录结构存在着普遍的误解,设计人员在API中提交“根”DB文件夹,而要求提交子存储库文件夹。

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

对于所描述的情况,请考虑通过“repository”文件夹(此名称可能不同)将路径扩展到已创建/重用的数据库位置:

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

当两个DB示例同时启动时,您将看到创建的下一个文件系统项:

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,“嵌入式”设置验证。

相关问题