我有以下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):/
非常感谢帮助!
答案 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规范保持一致,但如果你在更新版本的芝麻上尝试这个查询,你可能会看到与耶拿对齐的行为。