1

我有以下 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 : "\\" 

在线查询查询 = QueryFactory.create(stringQuery);

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

帮助将不胜感激!

4

2 回答 2

0

"ont:" + sanitizeString(ID);

您需要ont:在查询中使用前缀声明或使用完整形式 and <...>

于 2013-03-08T13:42:33.163 回答
0

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

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

使用最新版本的 SPARQL 规范,现在允许:在前缀名称中直接使用附加字符,无需使用\. 因此,要使此查询与 Jena 一起使用,您只需\在第二个之前删除:

我不确定 Sesame 与最新 SPARQL 1.1 规范的一致性在哪里,但如果您在较新版本的 Sesame 上尝试此查询,您可能会看到与 Jena 一致的行为。

于 2013-03-08T17:15:57.210 回答