SYSTEM 存储库不显示存储库详细信息
SYSTEM repository not showing repository details
在我的机器中,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 对象中加载该数据目录。
您没有提供全面的测试用例,只是单独的代码片段,没有明确指示它们的执行顺序,这使得很难弄清楚到底出了什么问题。
不过,我敢猜测,问题是您没有正确关闭和关闭资源。首先,您将获得 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();
}
顺便说一句:如果您的目标是检索存储库 meta-information (id, title, location),上面的代码就太复杂了。根本不需要打开与 SYSTEM 存储库的连接来读取这些信息,您可以直接从 RepositoryManager
中获取这些东西。例如,您只需执行以下操作即可检索存储库标识符列表:
List<String> repoIds = localManager.getRepositoryIDs();
for (String id: repoIds) {
System.out.println("repository id: " + id);
}
或者如果您还想获取文件位置 and/or 描述,请使用:
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
object,因此您也需要注意自己在程序退出时执行此操作。
创建您自己的 RepositoryManager
object 的替代方法是使用 RepositoryProvider
(另请参阅 Sesame Programmers Manual 中的相关部分)。这是一个带有 built-in 关闭钩子的实用程序 class,使您不必处理这些 manager/repository 关闭问题。
所以不是这个:
LocalRepositoryManager localManager = new LocalRepositoryManager(new File(dataDir));
localManager.initialize();
这样做:
LocalRepositoryManager localManager =
RepositoryProvider.getRepositoryManager(new File(datadir));
在我的机器中,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 对象中加载该数据目录。
您没有提供全面的测试用例,只是单独的代码片段,没有明确指示它们的执行顺序,这使得很难弄清楚到底出了什么问题。
不过,我敢猜测,问题是您没有正确关闭和关闭资源。首先,您将获得 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();
}
顺便说一句:如果您的目标是检索存储库 meta-information (id, title, location),上面的代码就太复杂了。根本不需要打开与 SYSTEM 存储库的连接来读取这些信息,您可以直接从 RepositoryManager
中获取这些东西。例如,您只需执行以下操作即可检索存储库标识符列表:
List<String> repoIds = localManager.getRepositoryIDs();
for (String id: repoIds) {
System.out.println("repository id: " + id);
}
或者如果您还想获取文件位置 and/or 描述,请使用:
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
object,因此您也需要注意自己在程序退出时执行此操作。
创建您自己的 RepositoryManager
object 的替代方法是使用 RepositoryProvider
(另请参阅 Sesame Programmers Manual 中的相关部分)。这是一个带有 built-in 关闭钩子的实用程序 class,使您不必处理这些 manager/repository 关闭问题。
所以不是这个:
LocalRepositoryManager localManager = new LocalRepositoryManager(new File(dataDir));
localManager.initialize();
这样做:
LocalRepositoryManager localManager =
RepositoryProvider.getRepositoryManager(new File(datadir));