Как выполнить операцию множественного добавления apache jena tdb

#java #sparql #jena #semantic-web #tdb

#java #sparql #jena #семантический веб #tdb

Вопрос:

Мне нужно сериализовать некоторые конкретные свойства (около десяти свойств film) для набора из 1500 объектов из DBpedia. Итак, для каждого объекта я запускаю запрос sparql, чтобы получить их, и после этого для каждого результирующего набора я сохраняю все данные в наборе данных tdb, используя API apache jena tdb по умолчанию. Я создаю один оператор для каждого свойства и добавляю их, используя этот код:

 public void addSolution(QuerySolution currSolution, String subjectURI) {
    if(isWriteMode) {
        Resource currResource = datasetModel.createResource(subjectURI);

        Property prop = datasetModel.createProperty(currSolution.getResource("?prop").toString());
        Statement stat = datasetModel.createStatement(currResource, prop, currSolution.get("?value").toString());
        datasetModel.add(stat);
    }
}
  

Что я могу сделать, чтобы выполнить несколько операций добавления для одного набора данных? Какую стратегию я должен использовать?

Редактировать:

Я могу выполнить весь код без ошибок, но TDBFactory не создал ни одного файла. Почему это происходит? Я думаю, что мне нужна помощь Джошуа Тейлора

Ответ №1:

Похоже, запрос выполняется через удаленную конечную точку dbpedia. Предполагая, что это правильно, вы можете сделать несколько вещей.

Сначала оберните обновление в транзакцию:

 dataset.begin(ReadWrite.WRITE);
try {
  for (QuerySolution currSolution: results) {
    addSolution(...);
  }
  dataset.commit();
} finally {
  dataset.end();
}
  

Во-вторых, вы могли бы сэкономить себе работу, используя CONSTRUCT для возврата модели, вместо того, чтобы перебирать результаты. Однако я не понимаю, что происходит subjectURI , но это может быть так просто, как:

 CONSTRUCT { <subjectURI> ?prop ?value }
WHERE
... existing query body ...
  

Комментарии:

1. Да, он запущен на конечной точке dbpedia. Я уже это делаю. Фиксация после проверки каждого результирующего набора, но сколько коммитов я могу сделать, прежде чем получу сообщение об ошибке?

2. Размер не важен. Проблема в том, что набор данных закрывается с незавершенной транзакцией, т.Е. dataset.end() Где-то отсутствует.

3. Но когда мне нужно это сделать? В конце всего процесса? Или когда я закончу один набор результатов?

4. Зависит от того, что имеет смысл для вашего приложения. Вы хотите иметь частичные данные, если что-то пойдет не так, или вернуться к тому, что ничего не добавлено? Для первого коммита после каждого набора результатов.

5. Я получаю эту ошибку при попытке фиксации в первый раз: 06.04.1919:09:09 ПРЕДУПРЕЖДЕНИЕ impl.Log4jLoggerAdapter: Несоответствие: base.allocOffset() = 5532 : allocOffset = 0 Во второй раз: исключение в потоке «main» com.hp.hpl.jena.sparql.JenaTransactionException: Нев транзакции (местоположение:—mem—/) После этого исключение не разрешает мне продолжать…

Ответ №2:

Я решил свою проблему, и я хочу изложить здесь проблему, с которой я столкнулся, у любого будет то же самое. Для каждой транзакции, которую вы выполняете, вам необходимо повторно получить модель набора данных и не использовать ее для всех транзакций.

Таким образом, для каждой транзакции, которую вы запускаете, вам необходимо получить модель набора данных сразу после вызова begin() . Я надеюсь, что это будет полезно.