rdf4j не удается выполнить запрос - PullRequest
1 голос
/ 21 января 2020

Я пытаюсь выполнить конструкционный запрос над Wikidata, используя следующий фрагмент кода:

construct = "CONSTRUCT { " +
            "   ?s <http://schema.org/about> ?wikipedia ." +
            "} where { " +
            "   OPTIONAL{ " +
            "      ?wikipedia <http://schema.org/about> ?s ; <http://schema.org/inLanguage> ?language ; <http://schema.org/isPartOf> <https://en.wikipedia.org/> . " +
            "   } "+
            "   ?s ?p1 <http://www.wikidata.org/entity/Q12136> . " +
            "}";
            repo = new SPARQLRepository("https://query.wikidata.org/sparql");
            repositoryConnection = repo.getConnection();
            query = repositoryConnection.prepareGraphQuery(construct);
            rs = query.evaluate();
            while (rs.hasNext()) {
                Statement statement = rs.next();
            }

К сожалению, это приводит к ошибке разбора:

WARN org.eclipse.rdf4j.rio.helpers.ParseErrorLogger - [Rio error] IRI included an unencoded space: '32' (7730, -1)
org.eclipse.rdf4j.query.QueryEvaluationException: org.eclipse.rdf4j.query.QueryEvaluationException: org.eclipse.rdf4j.rio.RDFParseException: IRI included an unencoded space: '32' [line 7730]
    at org.eclipse.rdf4j.query.impl.QueueCursor.convert(QueueCursor.java:58)
    at org.eclipse.rdf4j.query.impl.QueueCursor.convert(QueueCursor.java:22)
    at org.eclipse.rdf4j.common.iteration.QueueIteration.checkException(QueueIteration.java:165)
    at org.eclipse.rdf4j.common.iteration.QueueIteration.getNextElement(QueueIteration.java:134)
    at org.eclipse.rdf4j.common.iteration.LookAheadIteration.lookAhead(LookAheadIteration.java:81)
    at org.eclipse.rdf4j.common.iteration.LookAheadIteration.hasNext(LookAheadIteration.java:49)
    at org.eclipse.rdf4j.common.iteration.IterationWrapper.hasNext(IterationWrapper.java:63)
    at eu.qanswer.mapping.mappings.informa.Refactor.main(Refactor.java:227)

Насколько я понять, что в викидате есть некоторые Uris, которые не закодированы правильно, то есть место есть. Так что парсер rdf4j жалуется. Есть ли способ настроить парсер менее строгим образом?

Спасибо D063520

1 Ответ

1 голос
/ 22 января 2020

Как вы обнаружили, проблема здесь в том, что ваш запрос истекает на стороне сервера. Сообщение об ошибке, которое вы получаете от RDF4J, сбивает с толку, но причина в том, что конечная точка сервера неправильно сообщает о наличии проблемы: она просто создает ответ HTTP 200 (поэтому RDF4J считает, что все в порядке и начинает обрабатывать тело ответа). На полпути через сервер внезапно выдается ошибка в теле ответа, которая затем заставляет анализатор RDF4J выдать эту ошибку.

...