Apache Jena выдает исключение при выполнении запроса SPARQL с блоком VALUES - PullRequest
0 голосов
/ 31 января 2020

Я пытаюсь выполнить запрос с 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, чтобы делать то, что я хочу? Если я, это может быть ошибкой. Есть ли способ обойти это?

...