2014-01-11 21 views
1

我试图获取有关DBpedia上某些概念的信息。我发现如何获得1,但更多失败。我被告知过滤应该有帮助,但处理时间太长,我得到超时。SPARQL Jena迭代以获取有关更多主题的结果

我不能做的事情是值S {DBpedia中:Facebook的DBpedia中:谷歌}

所以我找了一个替代方式,但它仍然ISN;吨的工作?这里就是我现在:

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个谓词。

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

回答

0

我想我们已经解决了您的上一个问题中的VALUES ?s { dbpedia:Facebook dbpedia:Google }问题Sparql about dbpedia:World_Wide_Web。您可以使用filter(?s in (dbpedia:Facebook, dbpedia:Google) }而不是values ?s { dbpedia:Facebook dbpedia: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的(你可能可以做到,如果你真的只是从某些主题寻找某些属性的值),那么你实际上可以按照你喜欢的方式使用values块。 (真的,我认为在另一个问题中出现的问题行为是由于DBpedia bug;我认为你应该可以同时使用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

+0

问题过滤器是他们往往工作较慢和DBpedia的给我超时。我发现了一个更好的端点,它反映了DBpedia,但它仍然有其局限性,我需要检查大约30-40-50个资源。 –

+0

另一个端点位于:“http://lod.openlinksw.com/sparql” –

+0

@AlexDoro如果您只是查询某些属性的值,则应该能够摆脱“union”并使用'价值',对吧?这仍然有超时问题? –