应用带有两个变量的 sparql 和 return java 变量中的结果

apply sparql with two variable and return the results in java variable

在耶拿我可以写一个程序可以运行这个查询并打印出结果

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

如何修改程序以应用此查询和 return 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();}


}

如果您特别希望将值作为数组,则可以通过多种方式获取它。

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 方法在聚合之前将您的解决方案转换为数组。