将sparql应用于两个变量并将结果返回到java变量中

问题描述 投票:0回答:1

在jena中,我可以编写一个可以运行此查询并打印出结果的程序

select distinct  ?class where {?s rdf:type ?class }

如何修改程序以应用此查询并在java数组中返回结果

select distinct  ?s ?class where {?s rdf:type ?class }

该程序

private void runQuer(String query, Model model) {
    //create Buffer
    StringBuffer queryStr = new StringBuffer();
    // Establish Prefixes
    queryStr.append("PREFIX esco" + ": <" + defaultNameSpace + "> ");
    queryStr.append("PREFIX rdfs" + ": <" + "http://www.w3.org/2000/01/rdf-schema#" + "> ");
    queryStr.append("PREFIX rdf" + ": <" + "http://www.w3.org/1999/02/22-rdf-syntax-ns#" + "> ");
    //Now add query
    queryStr.append(query);
    Query queryExec = QueryFactory.create(queryStr.toString());
    QueryExecution qexec = QueryExecutionFactory.create(queryExec, model);
    try {
    ResultSet response = qexec.execSelect();

    while( response.hasNext()){
        QuerySolution soln = response.nextSolution();
        RDFNode name = soln.get("?class");
        if( name != null ){
            System.out.println(  name.toString() );
                }
                else
                    System.out.println("No Friends found!");
                }
            } finally { qexec.close();}


}
java sparql jena
1个回答
1
投票

如果您希望将值作为数组,那么有几种方法可以获得它。

final QuerySolution[] solutionsAsArray;
try(final QueryExecution exec = QueryExecutionFactory.create(query, model)) {
  final Iterable<QuerySolution> execAsIterable = exec::execSelect;
  solutionsAsArray = StreamSupport
      .stream(execAsIterable.spliterator(), false)
      .toArray(count -> new QuerySolution[count]);
}

如果可能,您可能希望避免这样的模式。一个好的通用设计会将sparql查询的结果数视为无限流,而不是试图保留所有结果。

请注意,如果要保留一些java对象而不是QuerySolution,可以使用Stream.map方法在聚合到数组之前转换解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.