Я пытаюсь создать новый запрос на основе заданного запроса (старый запрос — я не могу его изменить).
Предположим, мне дан простой действительный запрос SPARQL, SELECT ?s WHERE{ ?s ?p ?o }
. Допустим, я создаю объект запроса jena из вышеуказанного запроса и получаю шаблон запроса в виде ElementGroup в java следующим образом:
Query q = QueryFactory.create("SELECT ?s WHERE{ ?s ?p ?o }, Syntax.syntaxSPARQL_11);
ElementGroup oldQP = (ElementGroup)q.getQueryPattern();
Раньше я добавлял новые триплеты к старому шаблону запроса, используя следующий синтаксис:
Triple t = Triple.create(...);
oldQP.addTriplePattern(t);
Однако, когда вы переходите к созданию нового объекта запроса:
Query nq = q.cloneQuery();
nq.setQueryPattern(oldQP);
nq.setQuerySelectType();
nq.setQueryResultStar(false);
nq.addResultVar("s");
В итоге вы получите запрос, который выглядит как
SELECT ?s WHERE{
?s ?p ?o
?s2 ?p2 ?s.
}
потому что он не распознает/не заботится о том, чтобы первая тройка не заканчивалась точкой, когда вы устанавливаете QueryPattern объекта. Это приводит к ошибке синтаксического анализа при выполнении запроса...
Encountered " <VAR1> "?s2 "" at line 10, column 3.
Was expecting one of:
"graph" ...
"optional" ...
"minus" ...
"bind" ...
"service" ...
"let" ...
"exists" ...
"not" ...
"filter" ...
"{" ...
"}" ...
";" ...
"," ...
"." ...
потому что это явно недопустимый SPARQL. Итак, как избежать этой проблемы? Эта проблема не возникает, если у всех троек есть периоды закрытия, но я не могу найти способ заставить это работать.
Спасибо!