从查询中选择多个结果

时间:2013-09-16 23:26:32

标签: java sparql jena

我有这个查询,例如返回四个结果。我正在用这个代码做的是通过一个整数选择其中一个结果,这样我以后可以再做一个查询。我一直在尝试做的,而且还没有做到,只选择一个结果,以便我可以单独重复使用它们。例如,此查询将返回:

  1. 结果A
  2. 结果B
  3. 结果C
  4. 结果D
  5. 我可以在控制台中键入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);
    

1 个答案:

答案 0 :(得分:2)

当你得到一个ResultSet时,你只能使用它的解决方案一次,然后它们被消耗掉了。因此,为了多次迭代解决方案,您需要使用例如ResultSetFactory.copyResults复制结果。然后,您可以多次访问查询解决方案。您可以使用类似"1,2,3"的输入字符串,并使用类似

的答案获取字符串数组["1", "2", "3"]

然后,您可以遍历索引并仅选择所需的查询解决方案并将其添加到列表中。例如:

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 );
    }
}