Как справиться с отключением конечной точки Sparql в Йене

Я пытаюсь выполнить набор запросов 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 в моем примере) вместо того, чтобы возвращать код ошибки.

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

Для меня было бы идеально остановить цикл при обнаружении первого неправильного результата.

Спасибо

как вы хотите обнаружить "неправильный счет"? если служба не работает, будет возвращена ошибка 503, но не неправильное значение счетчика.

UninformedUser 10.08.2018 07:59

кстати, Virtuoso имеет поведение в любое время, поэтому вы можете получить значение счетчика того, что можно было найти до тайм-аута. это называется частичным результатом и указывается в заголовке ответа HTTP, но явно не в API Jena.

UninformedUser 10.08.2018 08:01

Причем Jena 2.11 - с 2015 года ...

UninformedUser 10.08.2018 08:02

Агрегатная функция count будет оцениваться на стороне сервера. Как сказал @AKSW, если вы получаете какой-либо ответ, это потому, что ответил сервер. Если вы получаете разные ответы, это не связано с подключением.

Rob Hall 10.08.2018 14:58

Итак, как узнать, был ли возвращенный результат полным или частичным решением? В обоих случаях кажется, что сервер возвращает код 200. Есть ли способ узнать реальный статус запроса?

Moh_BOB 10.08.2018 15:06

Я прочитал здесь: medium.com/virtuoso-blog/…, что Virtuoso включает «X-SQL-Message» в заголовок ответа, чтобы указать, что это неполные результаты. Однако я не могу получить доступ к заголовкам ответов. Любая помощь, пожалуйста?

Moh_BOB 10.08.2018 17:37

Да @RobHall. Теперь я понимаю принцип «Anytime Query». Теперь я хочу прочитать заголовки ответа, чтобы проверить, содержит ли он «X-SQL-Message: RC ...: возврат неполных результатов, запрос прерван тайм-аутом результата».

Moh_BOB 10.08.2018 17:41

В этом случае вы должны использовать API «нижнего уровня» Jena, т.е. создать новый HttpQuery httpQuery = ..., выполнить его с помощью InputStream in = httpQuery.exec(), проверить заголовок ответа через httpQuery.getResponseMessage, а затем проанализировать поток с помощью ResultSetMgr.read(in, lang);.

UninformedUser 11.08.2018 12:35

В конце концов я решил решить свою проблему, добавив queryExec.setTimeout (30000), таким образом, когда выбрасывается тайм-аут, программа останавливается вместо того, чтобы вставлять неправильный неполный результат. Что вы думаете об этом решении @AKSW. Спасибо за ваши ответы.

Moh_BOB 11.08.2018 16:07

Как только запрос имеет кешированный и полный результат, он вернется почти за нулевое время. До тех пор ваш queryExec.setTimeout(30000) может быть жизнеспособным МКФ вы также включили значение тайм-аута выше в сам запрос (так, чтобы ваш локальный тайм-аут был первым). И, что больший тайм-аут запроса ниже, чем установленный сервером временной лимит (поэтому функция Anytime Query не срабатывает).

TallTed 13.08.2018 18:57
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
10
50
0

Другие вопросы по теме