2015-08-03 113 views
1

在我的机器中,base/data目录包含多个存储库。但是当我从java程序访问这个数据目录时,它只给我提供SYSTEM存储库记录。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

我NativeStoreConfig也试过,但没有奏效。 – sagarg

回答

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)); 
+0

谢谢Jeen。我将使用RepositoryProvider而不是LocalRepositoryManager。 – sagarg

+0

不用担心。顺便说一句,不要在评论中感谢我,如果您投票或接受对您有用的答案会更好。有关更多详细信息,请参阅StackOverflow帮助部分。 –