0
String queryString2 = "PREFIX service: <http://www.usa.gov/services/> "
        + " PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> "
        + " PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> "
        + " PREFIX owl: <http://www.w3.org/2002/07/owl#> "
        + " SELECT ?entity ?categoryname ?servicename ?description WHERE { "
        + "{ "
        + " ?entity a owl:Class; rdfs:subClassOf %s; rdfs:label ?categoryname. "
        + " OPTIONAL {?entity rdfs:description ?description}. "
        + "} "
        + "UNION "
        + " { "
        + "?entity rdf:type %s; service:name ?servicename. "
        + " OPTIONAL {?entity service:description ?description}. "
        + " } " + "}";

Query query = QueryFactory.create(queryString2);

大家好,

使用 Jena API 运行上述查询时,出现以下错误。有人可以帮我解决这个问题。

com.hp.hpl.jena.query.QueryParseException: Lexical error at line 1, column 315.  Encountered: "%" (37), after : ""
4

1 回答 1

3

根据 SPARQL 1.1 Recommendation,SPARQL 中的变量以问号(或美元符号)开头,但不是百分号:

4.1.3 查询变量的语法

使用“?”标记查询变量 或“$”;这 ”?” 或“$”不是变量名的一部分。在查询中,$abc 和 ?abc 标识相同的变量。SPARQL 语法中给出了变量的可能名称

作为关于构造将被解析为某些内容的字符串的一般说明(在本例中为 SPARQL 查询,但这通常适用),\n向它们添加换行符是一种很好的做法,以便更容易识别发生解析错误的位置。如果您在查询中添加了换行符,您将收到关于第 7 行的错误,

?entity a owl:Class; rdfs:subClassOf %s; rdfs:label ?categoryname.

这会使这更容易被发现。例如,如果您复制此查询:

PREFIX service: <http://www.usa.gov/services/> 
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX owl: <http://www.w3.org/2002/07/owl#> 
SELECT ?entity ?categoryname ?servicename ?description WHERE { 
  { 
    ?entity a owl:Class; rdfs:subClassOf %s; rdfs:label ?categoryname. 
    OPTIONAL {?entity rdfs:description ?description}. 
  } 
  UNION 
  { 
    ?entity rdf:type %s; service:name ?servicename. 
    OPTIONAL {?entity service:description ?description}. 
  }
}

进入sparql.org的验证器,您将获得更有用的输出:

输入:

  1 PREFIX service: <http://www.usa.gov/services/> 
  2 PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
  3 PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
  4 PREFIX owl: <http://www.w3.org/2002/07/owl#> 
  5 SELECT ?entity ?categoryname ?servicename ?description WHERE { 
  6   { 
  7     ?entity a owl:Class; rdfs:subClassOf %s; rdfs:label ?categoryname. 
  8     OPTIONAL {?entity rdfs:description ?description}. 
  9   } 
 10   UNION 
 11   { 
 12     ?entity rdf:type %s; service:name ?servicename. 
 13     OPTIONAL {?entity service:description ?description}. 
 14   }
 15 }

语法错误:

Lexical error at line 7, column 42.  Encountered: "%" (37), after : ""

如果您尝试使用在查询结果中将被忽略的值,则只需不在select变量列表中指定它就足够了。如果您真的不想将其绑定到查询中的变量,您可以使用空白节点来简单地说?entityis an rdfs:subClassOf something

?entity a owl:Class; rdfs:subClassOf []; rdfs:label ?categoryname. 

另一方面,如果您计划%s用某些特定资源替换,那么您应该考虑使用 Jena 的ParameterizedSparqlString,这已在

于 2013-10-17T12:15:39.943 回答