在我的机器中,base / data目录包含多个存储库。但是当我从java程序访问这个数据目录时,它只给我一个SYSTEM存储库记录。
检索存储库的代码:
String dataDir = "D:\\SesameStorage\\data\\"
LocalRepositoryManager localManager = new LocalRepositoryManager(new File(dataDir));
localManager.initialize();
// Get all repositories
Collection<Repository> repos = localManager.getAllRepositories();
System.out.println("LocalRepositoryManager All repositories : "
+ repos.size());
for (Repository repo : repos) {
System.out.println("This is : " + repo.getDataDir());
RepositoryResult<Statement> idStatementIter = repo
.getConnection().getStatements(null,
RepositoryConfigSchema.REPOSITORYID, null,
true, new Resource[0]);
Statement idStatement;
try {
while (idStatementIter.hasNext()) {
idStatement = (Statement) idStatementIter.next();
if ((idStatement.getObject() instanceof Literal)) {
Literal idLiteral = (Literal) idStatement
.getObject();
System.out.println("idLiteral.getLabel() : "
+ idLiteral.getLabel());
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
Output :
LocalRepositoryManager All repositories : 1
This is : D:\SemanticStorage\data\repositories\SYSTEM
idLiteral.getLabel() : SYSTEM
将存储库添加到LocalRepositoryManager:
String repositoryName = "data.ttl";
RepositoryConfig repConfig = new RepositoryConfig(repositoryName);
SailRepositoryConfig config = new SailRepositoryConfig(new MemoryStoreConfig());
repConfig.setRepositoryImplConfig(config);
manager.addRepositoryConfig(repConfig);
获取存储库对象:
Repository repository = manager.getRepository(repositoryName);
repository.initialize();
我已成功将新存储库添加到LocalRepositoryManager,它向我显示存储库计数为2.但是当我重新启动应用程序时,它只向我显示一个存储库,那就是SYSTEM存储库。
我的SYSTEM存储库没有得到更新,请建议我,如何在LocalRepositoryManager对象中加载该数据目录。
答案 0 :(得分:0)
您还没有提供全面的测试用例,只是单独的代码片段,没有明确指示它们执行的顺序,这使得有点难以弄清楚到底出了什么问题。
但是,我猜想,问题在于你没有正确关闭和关闭资源。首先,你得到一个RepositoryConnection
而没有关闭它:
RepositoryResult<Statement> idStatementIter = repo
.getConnection().getStatements(null,
RepositoryConfigSchema.REPOSITORYID, null,
true, new Resource[0]);
您需要将此更改为以下内容:
RepositoryConnection conn = repo.getConnection();
try {
RepositoryResult<Statement> idStatementIter =
conn.getStatements(null,
RepositoryConfigSchema.REPOSITORYID, null,
true, new Resource[0]);
(... do something with the result here ...)
}
finally {
conn.close();
}
顺便说一句:如果你的目标是检索存储库元信息(id,title,location),那么上面的代码太复杂了。无需打开与SYSTEM存储库的连接即可读取此信息,您可以直接从RepositoryManager
获取此信息。例如,您只需执行以下操作即可检索存储库标识符列表:
List<String> repoIds = localManager.getRepositoryIDs();
for (String id: repoIds) {
System.out.println("repository id: " + id);
}
或者,如果您还想获取文件位置和/或描述,请使用:
Collection<RepositoryInfo> infos = localManager.getAllRepositoryInfos();
for (RepositoryInfo info: infos) {
System.out.println("id: " + info.getId());
System.out.println("description: " + info.getDescription());
System.out.println("location: " + info.getLocation());
}
您的代码的另一个问题是我怀疑您从未正确地呼叫manager.shutDown()
或repository.shutDown()
。在程序退出时调用这些程序允许管理器和存储库正确关闭资源,保存状态并正常退出。由于您自己创建了一个RepositoryManager
对象,因此您也需要在程序退出时自行完成此操作。
创建自己的RepositoryManager
对象的替代方法是使用RepositoryProvider
代替(另请参阅Sesame Programmers Manual中的相关部分)。这是一个带有内置关闭钩子的实用程序类,使您不必处理这些管理器/存储库关闭问题。
所以不要这样:
LocalRepositoryManager localManager = new LocalRepositoryManager(new File(dataDir));
localManager.initialize();
这样做:
LocalRepositoryManager localManager =
RepositoryProvider.getRepositoryManager(new File(datadir));