java - 系统存储库未显示存储库详细信息

标签 java sesame

在我的机器中,base/data 目录包含多个存储库。但是当我从 java 程序访问这个数据目录时,它只给我系统存储库记录。

检索存储库的代码:

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 存储库。

我的系统存储库没有更新,请建议我,我应该如何在我的 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();
  }

顺便说一句:如果您的目标是检索存储库元信息(id、标题、位置),则上述代码就太复杂了。根本不需要打开到 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 中的相关部分)。这是一个带有内置关闭 Hook 的实用程序类,使您不必处理这些管理器/存储库关闭问题。

所以代替这个:

LocalRepositoryManager localManager = new LocalRepositoryManager(new File(dataDir));
localManager.initialize();

这样做:

LocalRepositoryManager localManager = 
       RepositoryProvider.getRepositoryManager(new File(datadir));

关于java - 系统存储库未显示存储库详细信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31787034/

相关文章:

java - 如何设置 Sesame 2.8.0 RepositoryConnection 超时

concurrency - OpenRDF 芝麻 : how to handle locking?

java - arraylist 到数组唯一顺序

java - 如果使用Spring和Junit 4,如何编写内部测试类?或者我还能如何构建我的测试?

java - 为什么这个递归方法超出了我的预期

java - Java 中的堆栈溢出和递归

tomcat - OpenRDF 芝麻 - 404 错误

sparql - 使用 SPARQL UPDATE 添加个人的推荐方法是什么?

rdf - 将 Notation3 加载到数据库中

java - 在其他 arraylist 上执行 addAll 时,两个 arraylists 引用相同的元素