Я пытаюсь выполнить запрос с Apache Jena 3.13.1. Такой запрос использует блок VALUES , чтобы я мог назначить IRI многих ресурсов одному из его параметров. Пожалуйста, см. Пример ниже.
import java.util.List;
import org.apache.jena.query.ParameterizedSparqlString;
import org.apache.jena.query.Query;
List<Resource> selected = ...
final ParameterizedSparqlString pss = new ParameterizedSparqlString("PREFIX skos: <http://www.w3.org/2004/02/skos/core#> PREFIX dcterms: <http://purl.org/dc/terms/> SELECT DISTINCT ?r WHERE { VALUES ?c {?cValues} { ?r dcterms:subject ?d. ?c a skos:Concept ; skos:narrower+ ?d } UNION { ?r dcterms:subject ?c . }}");
pss.setValues("cValues", selected);
System.out.println(pss.toString());
final Query query = pss.asQuery();
Проблема, с которой я столкнулся, заключается в том, что я запускаю такой фрагмент кода 4-го числа. строка выводит на консоль следующий запрос:
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX dcterms: <http://purl.org/dc/terms/>
SELECT DISTINCT ?r WHERE {
VALUES ?c {(<http://a.url.com/x#a>)}
{ ?r dcterms:subject ?d. ?c a skos:Concept ; skos:narrower+ ?d }
UNION
{ ?r dcterms:subject ?c . }
}
Затем, когда выполняется 5-я строка, я получаю исключение, потому что у вас не должно быть скобок, разделяющих параметры VALUES в запросе выше.
PREFIX skos: <http://www.w3.org/2004/02/skos/core#> PREFIX dcterms: <http://purl.org/dc/terms/> SELECT DISTINCT ?r WHERE { VALUES ?c {(<http://a.url.com/x#a>)} { ?r dcterms:subject ?d. ?c a skos:Concept ; skos:narrower+ ?d } UNION { ?r dcterms:subject ?c . }}
org.apache.jena.query.QueryParseException: Encountered " "(" "( "" at line 1, column 135.
Was expecting one of:
<IRIref> ...
<PNAME_NS> ...
<PNAME_LN> ...
"undef" ...
"true" ...
"false" ...
<INTEGER> ...
<DECIMAL> ...
<DOUBLE> ...
<INTEGER_POSITIVE> ...
<DECIMAL_POSITIVE> ...
<DOUBLE_POSITIVE> ...
<INTEGER_NEGATIVE> ...
<DECIMAL_NEGATIVE> ...
<DOUBLE_NEGATIVE> ...
<STRING_LITERAL1> ...
<STRING_LITERAL2> ...
<STRING_LITERAL_LONG1> ...
<STRING_LITERAL_LONG2> ...
"}" ...
at org.apache.jena.sparql.lang.ParserSPARQL11.perform(ParserSPARQL11.java:100)
at org.apache.jena.sparql.lang.ParserSPARQL11.parse$(ParserSPARQL11.java:52)
at org.apache.jena.sparql.lang.SPARQLParser.parse(SPARQLParser.java:34)
at org.apache.jena.query.QueryFactory.parse(QueryFactory.java:147)
at org.apache.jena.query.QueryFactory.create(QueryFactory.java:79)
at org.apache.jena.query.QueryFactory.create(QueryFactory.java:52)
at org.apache.jena.query.ParameterizedSparqlString.asQuery(ParameterizedSparqlString.java:1435)
at org.apache.jena.query.ParameterizedSparqlString.asQuery(ParameterizedSparqlString.java:1422)
У меня вопрос: правильно ли я использую Jena API, чтобы делать то, что я хочу? Если я, это может быть ошибкой. Есть ли способ обойти это?