簡體   English   中英

耶拿sparql(dbpedia)查詢可選過濾器未提供任何結果,但(http://dbpedia.org/snorql/)相同的查詢有效

[英]Jena sparql (Dbpedia) query OPTIONAL filter gives no results but (http://dbpedia.org/snorql/) same query works

您好,在此網站上使用http://dbpedia.org/snorql/進行的查詢

   PREFIX ontology: <http://dbpedia.org/ontology/>

SELECT DISTINCT ?author ?name ?wiki  ?desc ?thumb WHERE {
?author a ontology:Book;
rdfs:label ?name;
ontology:wikiPageID ?wiki;
ontology:abstract ?desc.
OPTIONAL {?author <http://dbpedia.org/ontology/thumbnail> ?thumb }.
FILTER (lang(?name) = 'en')
FILTER (regex(?name,  "lo") || regex(?desc, "lo"))
FILTER (lang(?desc) = 'en').
}ORDER BY ?name LIMIT 100

但是在我的耶拿(Jena)queryFactory Java類中,僅當我在此行刪除縮略圖的可選過濾器時,它才起作用:

OPTIONAL {?author <http://dbpedia.org/ontology/thumbnail> ?thumb }.

這是我的耶拿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關鍵字:

"<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 vs 2103(無可選)..如果

a.setPictureURL(row.get("thumb2").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;
    }

所以我只是像這樣檢查if(row.getResource("thumb2")!=null)

    if(row.getResource("thumb")!=null)
   a.setPictureURL(row.get("thumb").toString());

然后循環繼續--->問題解決了

謝謝大家的提示,並注意使用耶拿(Jena)清空reslutset列

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM