我正在尝试使用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();
我遇到的问题是,当我第四次运行这样的代码时。将以下查询行输出到控制台:
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 . }
}
然后,当执行第五行时,我得到一个异常,因为在上面的查询中您不应该使用括号来分隔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来完成自己想要的事情?如果我是,这可能是一个错误。有办法解决吗?