2015-08-03 4 views
1

В моей машине каталог базы данных/данных содержит несколько репозиториев. Но когда я обращаюсь к этому каталогу данных из 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.

Мой системный репозиторий не обновляется, пожалуйста, предложите мне, как загрузить этот каталог данных в свой объект 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, название, местоположение), вышеуказанный код слишком сложный. Нет необходимости открывать подключение к репозиторию 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. –