代码之家  ›  专栏  ›  技术社区  ›  marco

使用两个变量应用sparql并在java变量中返回结果

  •  0
  • marco  · 技术社区  · 8 年前

    在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();}
    
    
    }
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   Rob Hall    8 年前

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

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