SYSTEM存储库未显示存储库详细信息

时间:2015-08-03 12:15:50

标签: java sesame

在我的机器中,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对象中加载该数据目录。

1 个答案:

答案 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));