有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java无法从此SPARQL查询中获得任何结果

我以前问过一个问题

Generate an incremental SPARQL query

感谢上帝,我设法解决了这个问题

以下是我的解决方案:

private String completeQuery(String coreQuery){
    String completeQuery = "";
    completeQuery += "SELECT * WHERE {"+ "\n";
    completeQuery += coreQuery + "\n";
    completeQuery =completeQuery + "}" + "\n" +"limit 5" ;
    return completeQuery;
}

public String link(String object1, String object2, int distance){
    if(distance == 1){
        String Quer = "<http://dbpedia.org/resource/"+object1+">" + " ?pre1 " +"<http://dbpedia.org/resource/"+object2+">";
        return completeQuery(Quer);
    } 
    else {
        String query = "<http://dbpedia.org/resource/"+object1+">" + " ?pre1 ?obj1 " + ".\n";
        for(int i = 1; i < distance-1; i++){
            query += "?obj" + i + " ?pre" + (i+1) + " ?obj" + (i+1) + ".\n" ;

        }
        query  += "?obj" + (distance-1) + " ?pre" + distance + " " + "<http://dbpedia.org/resource/"+object2+">";
        return completeQuery(query);
    }
}

在main中,我只是尝试打印查询字符串,以确定它是否正确:

String queryString = "";

    int maxDistance =2;
    PathFinder pf = new PathFinder();

    for (int distance = 1; distance<=maxDistance ; distance ++)
    {
        System.out.println("\nQueries for distance: "+distance);
        queryString = pf.link("Lionel_Messi","Spanish_language",distance);
        System.out.println(queryString);}

到目前为止,结果是好的

Queries for distance1: SELECT * WHERE {<http://dbpedia.org/resource/Lionel_Messi> ?pre1 <http://dbpedia.org/resource/Spanish_language>}limit 5

Queries for distance2: SELECT * WHERE { <http://dbpedia.org/resource/Lionel_Messi> ?pre1 ?obj1 . ?obj1 ?pre2 <http://dbpedia.org/resource/Spanish_language> }limit 5

现在,我正在尝试执行这些查询,但我不知道如何执行 如果是一个简单的查询,比如(选择?抽象where…)执行将是例如:

QueryExecution qe = QueryExecutionFactory.sparqlService(service, query);

                ResultSet results = qe.execSelect();
                for (; results.hasNext();){
                    QuerySolution sol = (QuerySolution) results.next();
                    System.out.println(sol.get("?abstract"));
                }

但是,如果查询是(选择*where),在不知道要打印的特定元素的情况下,如何获得结果?这一切都取决于我的距离和它将返回什么查询


共 (1) 个答案

  1. # 1 楼答案

    这不是仅通过SPARQL就可以解决的问题-您需要使用API工具包的功能来处理查询和结果。因为您使用的是Jena,所以应该查看Jena的ResultSet对象的文档。它有一个方法getResultVars(),该方法为您提供一个包含结果中所有变量名的列表。然后,您可以使用它来迭代结果并获取每个解决方案中的变量绑定,例如,简单地打印它们:

     List<String> varNames = results.getResultVars();
    
     while(results.hasNext()) {
           QuerySolution sol = (QuerySolution) results.next();
           for (String var: varNames) {
                  System.out.println("value of " + var + ": " + sol.get(var));
           }
     }