经过数小时的调试,我在这里写..以下代码没有
public String search(@QueryParam("query") String search_string, @QueryParam("match_type") @DefaultValue("") String match_type, @QueryParam("terminology") @DefaultValue("") List<String> terminology_list)
throws ServletException, IOException
{
VirtGraph set = new VirtGraph (hostURL, userName, password);
ByteArrayOutputStream out = new ByteArrayOutputStream();
search_string = search_string.replaceAll(java.util.regex.Pattern.quote(" "), " and ") ;
String text="";
for(String term_items:terminology_list) {
if(!match_type.equals("exact")) {
text="select ?uri, ?label where { " +
"quad map virtrdf:DefaultQuadMap " +
"{ graph ?g { ?uri ?p ?label . ?label bif:contains '" +
search_string +
"' option ( score ?sc ) . }}} " +
"order by desc ( ?sc * 3e-1 + sql:rnk_scale ( <LONG::IRI_RANK> ( ?uri ) ) ) limit 20 offset 0";
}
else if(match_type.equals("exact")) {
text="select ?uri, ?label where { quad map virtrdf:DefaultQuadMap { graph <"
+term_items+"> { ?uri ?p ?label.FILTER (?label = '"+search_string+"'@en) .}}}";
}
VirtuosoQueryExecution vqe = VirtuosoQueryExecutionFactory.create(text, set);
ResultSet results = vqe.execSelect();
ResultSetFormatter.outputAsJSON(out, results);
}
return out.toString();
}
问题出现在else if
语句中,因为无论我在链接中声明的列表中有多少项,执行结束时的结果集都是空的。例如,如果我在链接中输入&terminology=test这将转换为:
text="select ?uri, ?label where { quad map virtrdf:DefaultQuadMap { graph <**test**> { ?uri ?p ?label.FILTER (?label = '"+search_string+"'@en) .}}}";
有趣的是,在端点上运行该 sparql 查询确实会返回结果。只有在eclipse中运行它时,它才不会!
也不能说语句之后的代码中有任何错误,else
因为语句使用了相同的代码if
并且它运行正常。