【问题标题】:SPARQL Jena iterative to get results about more subjectsSPARQL Jena 迭代以获得更多主题的结果
【发布时间】:2014-01-11 11:04:21
【问题描述】:

我正在尝试获取有关 DBpedia 上一些概念的信息。我发现了如何获得 1,但更多它失败了。有人告诉我过滤应该会有所帮助,但是处理时间太长而且我会超时。

我不能做的是 VALUES ?s { dbpedia:Facebook dbpedia:Google }

所以我一直在寻找另一种方法,但它仍然无法正常工作。这是我现在的位置:

public static String concepts[] = { "Facebook", "Google" };

    public static String getQuery(String concept) {
        return "prefix dbpediaowl: <http://dbpedia.org/ontology/>"
                + " prefix dbpedia: <http://dbpedia.org/resource/>"
                + " prefix owl: <http://www.w3.org/2002/07/owl#>"
                + " prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> "
                + " PREFIX dbpprop: <http://dbpedia.org/property/>"
                + " prefix dbpedia-owl: <http://dbpedia.org/ontology/>"
                + " select ?s ?p ?o where { "
                + " values ?web {  dbpedia:"
                + "Facebook"
                + " } "
                + " { ?web ?p ?o bind( ?web as ?s ) } " + " union "
                + " { ?s ?p ?web bind( ?web as ?o ) } " + " filter( ?p in ( "
                + "dbpprop:available, " + "dbpprop:company, "
                + "dbpprop:inventor, " + "dbpedia-owl:foundedBy, "
                + "dbpedia-owl:subsidiary, " + "dbpprop:foundation, "
                + "dbpprop:founder, " + "dbpprop:industry, "
                + "dbpprop:programmingLanguage, " + "dbpedia-owl:successor )) ";

    }

    public static void main(String[] args) {
        OutputStream os;
        PrintStream printStream;

        try {
            os = new FileOutputStream("C:/Users/alex/Desktop/data.txt");
            printStream = new PrintStream(os);
            printStream.println("am scris");
            for (int i = 0; i < concepts.length; i++) {
                printStream.println(i+ " concept");
                Query query = QueryFactory.create(getQuery(concepts[i])); 

                QueryExecution qExe = QueryExecutionFactory.sparqlService(
                        "http://lod.openlinksw.com/sparql", query);
                ResultSet results = qExe.execSelect();

                while (results.hasNext()) {
                    printStream.println(results.nextSolution().toString());
                }

            }

            printStream.close();
            os.close();


        } catch (Exception e) {
            e.printStackTrace();
            System.out.println(e.getCause());
        }

    }

对于一个概念,在 SPARQL 中它运行良好,但我需要调用其中的大约 50 个。所以我需要知道如何以编程方式做到这一点。此外,如果您也可以帮助我选择谓词(没有过滤),那就太好了,因为我还需要允许大约 30-40 个谓词。

非常感谢!希望你能帮忙。

【问题讨论】:

    标签: sparql jena dbpedia


    【解决方案1】:

    我以为我们已经解决了您上一个问题Sparql about dbpedia:World_Wide_Web 中的VALUES ?s { dbpedia:Facebook dbpedia:Google } 的问题。您可以使用filter( ?s in (dbpedia:Facebook, dbpedia:Google) },而不是使用values ?s { dbpedia:Facebook dbpedia:Google }。这适用于主题和属性。例如,如果您想获取 Google 和 Facebook 的英文摘要和标签,您可以使用如下查询:

    select ?s ?p ?o where {
      ?s ?p ?o
      filter( ?s in (dbpedia:Google, dbpedia:Facebook) )
      filter( ?p in (rdfs:label, dbpedia-owl:abstract) )
      filter( !isLiteral(?o) || langMatches(lang(?o),"en") ) 
    }
    

    SPARQL results

    现在,如果您可以摆脱 union(如果您真的只是从某些主题中寻找某些属性的值,您也许可以做到),那么您实际上可以使用 @987654329 @ 以您想要的方式阻止。 (真的,我认为在您的另一个问题中看到的有问题的行为是由于 DBpedia 错误造成的;我认为您应该能够同时使用 valuesunion。)也就是说,选择非文字和文字一些指定属性的英文标签,你可以这样做:

    select ?s ?p ?o where {
      values ?s { dbpedia:Google dbpedia:Facebook }
      values ?p { rdfs:label dbpedia-owl:abstract }
      ?s ?p ?o
      filter( !isLiteral(?o) || langMatches(lang(?o),"en") ) 
    }
    

    SPARQL results

    【讨论】:

    • 过滤器的问题是它们的工作速度往往较慢,而 DBpedia 给了我超时。我找到了一个更好的端点来镜像 DBpedia,但它仍然有其局限性,我需要检查大约 30-40-50 个资源。
    • @AlexDoro 如果您只是查询某些属性的值,您应该可以摆脱union 并使用values,对吗?那还有超时问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    相关资源
    最近更新 更多