例如,我有此查询返回四个结果。我在用此代码执行的操作是通过整数选择这些结果之一,以便稍后可以对其进行另一个查询。我一直想做但还没有做的就是选择多个结果,以便我可以分别重用它们。例如,此查询将返回:
结果A
结果B
结果C
结果D
例如,我可以在控制台中键入1
并以字符串形式获取该值并重新使用它。例如,键入1,2,3
并将这些值添加到String数组的便捷方法是什么?
public static String[] path = new String[30];
String queryString =
"PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> " +
"PREFIX owl: <http://www.w3.org/2002/07/owl#> " +
"PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> " +
"PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> " +
"PREFIX bio: <http://www.semanticweb.org/vassilis/ontologies/2013/5/Onto#> " +
" SELECT DISTINCT ?Animal " +
" WHERE { ?Animal rdf:type bio:Animal } " ;
Query query = QueryFactory.create(queryString);
QueryExecution qe= QueryExecutionFactory.create(query, model);
ResultSet resultset = qe.execSelect();
ResultSet results = ResultSetFactory.copyResults(resultset);
ResultSet results2 = ResultSetFactory.copyResults(results);
ResultSetFormatter.out(System.out, results, query);
List<QuerySolution> e = ResultSetFormatter.toList(results2);
String next;
System.out.println("Select Animal: ");
next = user_input.next( );
int i = Integer.parseInt(next);
QuerySolution e1 = e.get(i);
RDFNode rd = e1.get("");
String rds = rd.toString();
String phrase = rds;
String delims = "[#]";
String[] tokens = phrase.split(delims);
newStr = tokens[1].replaceAll("_","");
path[1] = newStr;
编辑,更新代码:
final Scanner input = new Scanner( System.in );
String selec2;
selec2 = input.next();
final String[] indices = selec2.split("\\s*,\\s*");
final List<QuerySolution> selectedSolutions = new ArrayList<QuerySolution>( indices.length ) {{
final List<QuerySolution> solutions = ResultSetFormatter.toList( results2 );
for ( final String index : indices ) {
add( solutions.get( Integer.valueOf( index )));
}
}};
System.out.println( "== Selected Solutions ==" );
System.out.println(selectedSolutions);
int k = 0;
while (input.hasNext()) {
int i = Integer.parseInt(selec2);
QuerySolution e1 = selectedSolutions.get(i);
RDFNode rd = e1.get("Ani");
String rds = rd.toString();
String phrase = rds;
String delims = "[#]";
String[] tokens = phrase.split(delims);
newStr = tokens[1].replaceAll("_", "");
path[k]= newStr;
k++;
}
System.out.println(path);
最佳答案
获得ResultSet时,只能使用其解决方案一次,然后使用它们。因此,为了多次遍历解决方案,您需要使用例如ResultSetFactory.copyResults复制结果。然后,您可以多次访问查询解决方案。您可以使用诸如"1,2,3"
之类的输入字符串并使用类似于以下内容的答案获得字符串数组["1", "2", "3"]
how to get numbers separated by comma entered in a line into an array in Java
然后,您可以遍历索引并仅选择所需的查询解决方案并将其添加到列表中。例如:
import java.io.ByteArrayInputStream;
import java.util.ArrayList;
import java.util.List;
import com.hp.hpl.jena.query.QueryExecutionFactory;
import com.hp.hpl.jena.query.QuerySolution;
import com.hp.hpl.jena.query.ResultSet;
import com.hp.hpl.jena.query.ResultSetFactory;
import com.hp.hpl.jena.query.ResultSetFormatter;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.ModelFactory;
public class QuerySolutionsFromIndicesExample {
final static String modelText = "" +
"@prefix bio: <http://www.semanticweb.org/vassilis/ontologies/2013/5/Onto#>.\n" +
"@prefix ex: <http://example.org/>.\n" +
"\n" +
"ex:Giraffe a bio:Animal .\n" +
"ex:Dog a bio:Animal .\n" +
"ex:Cat a bio:Animal . \n" +
"ex:WoollyMammoth a bio:Animal.\n" +
"";
final static String sparqlQuery = "" +
"prefix bio: <http://www.semanticweb.org/vassilis/ontologies/2013/5/Onto#>\n" +
"\n" +
"select ?animal where {\n" +
" ?animal a bio:Animal\n" +
"}\n" +
"";
public static void main(String[] args) {
final Model model = ModelFactory.createDefaultModel();
model.read( new ByteArrayInputStream( modelText.getBytes()), null, "TTL" );
final ResultSet results = ResultSetFactory.copyResults( QueryExecutionFactory.create( sparqlQuery, model ).execSelect() );
System.out.println( "== All Solutions ==" );
ResultSetFormatter.out( results );
// based on https://stackoverflow.com/q/10565335/1281433
final String input = "0,3";
final String[] indices = input.split("\\s*,\\s*");
final List<QuerySolution> selectedSolutions = new ArrayList<QuerySolution>( indices.length ) {{
final List<QuerySolution> solutions = ResultSetFormatter.toList( results );
for ( final String index : indices ) {
add( solutions.get( Integer.valueOf( index )));
}
}};
System.out.println( "== Selected Solutions ==" );
System.out.println( selectedSolutions );
}
}