1

たとえば、4 つの結果を返すこのクエリがあります。このコードで私が行っていることは、後で別のクエリを実行できるように、整数を介してこれらの結果の 1 つを選択することです。私がやろうとしていて、まだできていないのは、複数の結果を選択して、それらを個別に再利用できるようにすることです。たとえば、このクエリは次を返します。

  1. 結果A
  2. 結果B
  3. 結果C
  4. 結果D

たとえば、1コンソールに入力して、その値を文字列で取得し、再利用できます。たとえば、1,2,3文字列配列に追加されたこれらの値を入力して取得する便利な方法は何ですか?

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

1 に答える 1

2

ResultSet を取得すると、そのソリューションは 1 回しか使用できず、その後消費されます。したがって、ソリューションを複数回反復するには、たとえば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 );
    }
}
于 2013-09-17T00:33:12.593 に答える