Java Jena sparql(Dbpedia)查询可选筛选器不提供结果,但(http://dbpedia.org/snorql/)同样的查询工作

Java Jena sparql(Dbpedia)查询可选筛选器不提供结果,但(http://dbpedia.org/snorql/)同样的查询工作,java,sparql,jena,dbpedia,Java,Sparql,Jena,Dbpedia,您好,我正在这个网站上进行此查询 但在我的jena queryFactory java类中,只有在以下行中删除缩略图的可选过滤器时,它才起作用: OPTIONAL {?author <http://dbpedia.org/ontology/thumbnail> ?thumb }. "<http://dbpedia.org/ontology/thumbnail> ?thumb.\n" + 下面是我的jena java方法: private String authorQu

您好,我正在这个网站上进行此查询

但在我的jena queryFactory java类中,只有在以下行中删除缩略图的可选过滤器时,它才起作用:

OPTIONAL {?author <http://dbpedia.org/ontology/thumbnail> ?thumb }.
"<http://dbpedia.org/ontology/thumbnail> ?thumb.\n" +
下面是我的jena java方法:

private String authorQuery(String entity, String keyWord, String language) {

        return addPrefix("rdfs: <http://www.w3.org/2000/01/rdf-schema#>") +
                addPrefix("rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>") +
                addPrefix("dbpprop: <http://dbpedia.org/property/>") +
                addPrefix("ontology: <http://dbpedia.org/ontology/>") +

                addQuery("SELECT DISTINCT ?author ?name ?wiki  ?desc ?thumb WHERE {\n" +
                        "?author a ontology:" + entity + ";\n" +
                        "rdfs:label ?name;\n" +
                        "ontology:wikiPageID ?wiki;\n" +
                        "ontology:abstract ?desc;\n" +
                        "<http://dbpedia.org/ontology/thumbnail> ?thumb.\n" +
                        "FILTER (lang(?name) = '" + language + "') " +
                        "FILTER (regex(?name,  \"" + keyWord + "\") || regex(?desc,  \"" + keyWord + "\"))\n" +
                        " FILTER (lang(?desc) = '" + language + "')." +
                        "}\n" +
                        "ORDER BY ?name\n" +
                        "LIMIT 40000");
    }
但只要我在这行中添加optionnal关键字:

OPTIONAL {?author <http://dbpedia.org/ontology/thumbnail> ?thumb }.
"<http://dbpedia.org/ontology/thumbnail> ?thumb.\n" +
没有返回结果,有人能告诉我原因吗

PS:它在没有可选过滤器的情况下运行良好

编辑:整个DbpediaQuery类

public class DbPediaQuery {
    //array of authors
    private DbPediaQuery() {
    }

    public static DbPediaQuery createDbPediaQuery() {
        return new DbPediaQuery();
    }

    public LinkedList<Entity> queryAuthor(String entity, String keyWord, String language) {
        LinkedList<Entity> temp = new LinkedList<>();
        Query query = QueryFactory.create(authorQuery(entity, keyWord, language));

        QueryExecution qexec = QueryExecutionFactory.sparqlService("http://dbpedia.org/sparql", query);
        try {
            temp.addAll(collectAuthors(qexec.execSelect()));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return temp;
    }

    private String authorQuery(String entity, String keyWord, String language) {

        return addPrefix("rdfs: <http://www.w3.org/2000/01/rdf-schema#>") +
                addPrefix("rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>") +
                addPrefix("dbpprop: <http://dbpedia.org/property/>") +
                addPrefix("ontology: <http://dbpedia.org/ontology/>") +

                addQuery("SELECT DISTINCT ?author ?name ?wiki  ?desc ?thumb WHERE {\n" +
                        "?author a ontology:" + entity + ";\n" +
                        "rdfs:label ?name;\n" +
                        "ontology:wikiPageID ?wiki;\n" +
                        "ontology:abstract ?desc;\n" +
                        "<http://dbpedia.org/ontology/thumbnail> ?thumb.\n" +
                        "FILTER (lang(?name) = '" + language + "') " +
                        "FILTER (regex(?name,  \"" + keyWord + "\") || regex(?desc,  \"" + keyWord + "\"))\n" +
                        " FILTER (lang(?desc) = '" + language + "')." +
                        "}\n" +
                        "ORDER BY ?name\n" +
                        "LIMIT 40000");
    }

    private LinkedList<Entity> collectAuthors(ResultSet results) {
        LinkedList<Entity> temp = new LinkedList<>();
        while (results.hasNext()) {
            Entity a = new Entity();
            QuerySolution row = results.next();
            String fullName = row.get("name").toString().substring(0, row.get("name").toString().indexOf("@"));
            String biography = row.get("desc").toString().substring(0, row.get("desc").toString().indexOf("@"));
            a.setTitle(fullName);
            a.setWikiID(Integer.parseInt(row.get("wiki").toString().substring(0, row.get("wiki").toString().indexOf("^"))));
            if (!row.get("thumb").toString().isEmpty())
                a.setPictureURL(row.get("thumb").toString());
            else
                a.setPictureURL("http://www.google.fr/imgres?imgurl=http%3A%2F%2Fwww.elated.com%2Fres%2FImage%2Farticles%2Fmanagement%2Fapache%2Fmaking-a-custom-error-page%2Fapache_404_default.gif&imgrefurl=https%3A%2F%2Fgithub.com%2Fjdorn%2Fphp-reports%2Fissues%2F43&h=241&w=400&tbnid=KQI5AbkkVp3-uM%3A&zoom=1&docid=6Bd7CTaQ291_UM&ei=5AU0VceoI87WPYOvgCg&tbm=isch&iact=rc&uact=3&dur=3255&page=1&start=0&ndsp=20&ved=0CDYQrQMwBw");
            a.setBiography(biography);
            temp.add(a);
            System.out.println("FAAT" + a.getTitle());
        }
        return temp;
    }

    private String addPrefix(String prefix) { return "PREFIX " + prefix + "\n"; }

    private String addQuery(String query) { return query; }
}

好吧,我在记录了几件事后发现了。。。首先,我记录了结果集的大小,使用可选的过滤器,它给了我比没有可选过滤器时更多的结果。。。2383对2103,不带选装件。。然后我注意到如果

a、 setPictureURLrow.getthumb2.toString;如果为空或null,循环将不会继续。。。它在14次结果后停止,并没有给我这种方法的回报:

private LinkedList<Entity> collectAuthors(ResultSet results) {
        LinkedList<Entity> temp = new LinkedList<>();
        while (results.hasNext()) {
            Entity a = new Entity();
            QuerySolution row = results.next();
            String fullName = row.get("name").toString().substring(0, row.get("name").toString().indexOf("@"));
            String biography = row.get("desc").toString().substring(0, row.get("desc").toString().indexOf("@"));
            a.setTitle(fullName);
            a.setWikiID(Integer.parseInt(row.get("wiki").toString().substring(0, row.get("wiki").toString().indexOf("^"))));
            if (!row.get("thumb").toString().isEmpty())
                a.setPictureURL(row.get("thumb").toString());

            a.setBiography(biography);
            temp.add(a);
            System.out.println("FAAT" + a.getTitle());
        }
        return temp;
    }
然后循环问题就解决了


谢谢大家的提示,请注意空的reslutset列,以Jena

作为旁白,连接字符串的方式非常容易出错。如果语言或关键字包含字符,会发生什么情况?另外,您不应该将语言标记与lang…=。。。,但是使用langMatcheslang…,…谢谢你的建议,我会修改它,但我目前的主要问题是这个可选的,我还希望返回没有拇指的实体:就像在snorql示例中一样…使用本体更改可选的:缩略图。这可能会得到解决。还有,它会产生什么样的错误?@Artemis我同意ontology:thumbnail是更好的样式,因为前缀是定义的,但它是相同的URI,所以这不会有什么区别。你认为结果为零吗,或者你有什么错误吗?你应该接受你自己的答案,以备将来参考。我需要等两天,因为我没有得到足够的贡献。。。但你也应该接受它:@StackItEasy你是唯一能接受你问题答案的人;我们其他人只能投赞成票或反对票;在这个问题上我看不到拇指2;只要拇指。拇指2是在哪里起作用的?