Java Apache Jena SparQL查询在查询有效时返回Lexical错误

时间:2013-03-07 12:32:03

标签: java sparql jena lexical

我有以下SparQL查询:

SELECT ?b ?c WHERE {
ont:http\:\/\/test.com\/test\#com.test.test.test.2.3.4 ?b ?c}
返回成功的

OpenRDF Workbench 2.6.5 中返回正确的结果。但是在我使用 Jena 2.6.4 的Java中,当我使用以下代码运行查询时

private static ResultSet getQueryResults(String stringQuery, String service) {
    Query query = QueryFactory.create(stringQuery);
    QueryExecution qexec = QueryExecutionFactory.sparqlService(
            service, query);
    ResultSet results = qexec.execSelect(); 
    //ResultSetFormatter.out(System.out, results, query);
    return results;
}

public static ResultSet getDetails(String ID) {
    //we define our sparql query
    String sanatizedID = "ont:" +  sanitizeString(ID);
    String stringQuery = " SELECT ?b ?c WHERE" +
            " { " + sanatizedID + 
            //"{?a"+
            " ?b" +
            " ?c}";
    System.out.println(stringQuery);
    //we define our service
    String service = "http://test.test.com:8181/test-sesame/repositories/test";

    //We write the results of our query into a results set
    ResultSet results = getQueryResults(stringQuery, service);
    return results;
}

private static String sanitizeString(String s) {
    s = s.replace("/", "\\/");
    s = s.replace("#", "\\#");
    s = s.replace(":", "\\:");
    s = s.replace("\"", "\\\"");

    return s;
}

我收到以下错误

Exception in thread "main" com.hp.hpl.jena.query.QueryParseException: Lexical error at line 1, column 871.  Encountered: ":" (58), after : "\\" 

on line Query query = QueryFactory.create(stringQuery);

我已经尝试过更改Jena版本而没有运气,无法理解为什么查询在OpenRDF Workbench 2.6.5中有效而不在我的Java查询中(我认为它可以自己进行sanatization):/

非常感谢帮助!

2 个答案:

答案 0 :(得分:0)

"ont:" + sanitizeString(ID);

您需要在查询中使用ont:的前缀声明,或使用完整表单<...>

答案 1 :(得分:0)

您使用的是Sesame版本,该版本支持较旧版本的SPARQL 1.1规范,您的前缀名称实际上无效:

ont:http\:\/\/test.com\/test\#com.test.test.test.2.3.4

使用最新版本的SPARQL规范,现在允许在前缀名称中直接使用其他:个字符,并且无需使用\来转义此字符。因此,要使此查询与Jena一起使用,您只需在第二个\之前移除:

我不确定芝麻在哪里与最新的SPARQL 1.1规范保持一致,但如果你在更新版本的芝麻上尝试这个查询,你可能会看到与耶拿对齐的行为。