使用VALUES块执行SPARQL查询时,Apache Jena引发异常

时间:2020-01-31 17:49:28

标签: sparql jena

我正在尝试使用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来完成自己想要的事情?如果我是,这可能是一个错误。有办法解决吗?

0 个答案:

没有答案