#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() . Я надеюсь, что это будет полезно.