Я пытаюсь выполнить набор запросов SPARQL на http://lod.openlinksw.com/sparql из моего кода Java, используя Jena 2.11.
Вот мой пример кода:
Try{
String SPARQLquery = "SELECT (COUNT(DISTINCT ?P) AS ?COUNT) "
+"WHERE{"
+" values ?S {<"+MyResource1+">}."
+" values ?O {<"+MyResource2+">}."
+" ?S ?P ?O."
+ "}";
QueryExecution qe =QueryExecutionFactory.sparqlService("http://lod.openlinksw.com/sparql", SPARQLquery);
com.hp.hpl.jena.query.ResultSet results = queryExec.execSelect();
} catch (Exception e){
e.printStackTrace();
System.exit(1);
}
Проблема в том, что, когда сервер OpenLink отключается на какое-то время, он возвращает неправильный результат (неправильный? COUNT в моем примере) вместо того, чтобы возвращать код ошибки.
В моей задаче важно определить, верен ли возвращаемый результат или нет, поскольку мне приходится выполнять тысячи запросов, не имея времени на проверку результата каждого из них.
Для меня было бы идеально остановить цикл при обнаружении первого неправильного результата.
Спасибо
кстати, Virtuoso имеет поведение в любое время, поэтому вы можете получить значение счетчика того, что можно было найти до тайм-аута. это называется частичным результатом и указывается в заголовке ответа HTTP, но явно не в API Jena.
Причем Jena 2.11 - с 2015 года ...
Агрегатная функция count
будет оцениваться на стороне сервера. Как сказал @AKSW, если вы получаете какой-либо ответ, это потому, что ответил сервер. Если вы получаете разные ответы, это не связано с подключением.
Итак, как узнать, был ли возвращенный результат полным или частичным решением? В обоих случаях кажется, что сервер возвращает код 200. Есть ли способ узнать реальный статус запроса?
Я прочитал здесь: medium.com/virtuoso-blog/…, что Virtuoso включает «X-SQL-Message» в заголовок ответа, чтобы указать, что это неполные результаты. Однако я не могу получить доступ к заголовкам ответов. Любая помощь, пожалуйста?
Да @RobHall. Теперь я понимаю принцип «Anytime Query». Теперь я хочу прочитать заголовки ответа, чтобы проверить, содержит ли он «X-SQL-Message: RC ...: возврат неполных результатов, запрос прерван тайм-аутом результата».
В этом случае вы должны использовать API «нижнего уровня» Jena, т.е. создать новый HttpQuery httpQuery = ...
, выполнить его с помощью InputStream in = httpQuery.exec()
, проверить заголовок ответа через httpQuery.getResponseMessage
, а затем проанализировать поток с помощью ResultSetMgr.read(in, lang);
.
В конце концов я решил решить свою проблему, добавив queryExec.setTimeout (30000), таким образом, когда выбрасывается тайм-аут, программа останавливается вместо того, чтобы вставлять неправильный неполный результат. Что вы думаете об этом решении @AKSW. Спасибо за ваши ответы.
Как только запрос имеет кешированный и полный результат, он вернется почти за нулевое время. До тех пор ваш queryExec.setTimeout(30000)
может быть жизнеспособным МКФ вы также включили значение тайм-аута выше в сам запрос (так, чтобы ваш локальный тайм-аут был первым). И, что больший тайм-аут запроса ниже, чем установленный сервером временной лимит (поэтому функция Anytime Query не срабатывает).
как вы хотите обнаружить "неправильный счет"? если служба не работает, будет возвращена ошибка 503, но не неправильное значение счетчика.