2014-01-11 2 views
1

DBpedia에 대한 몇 가지 개념에 대한 정보를 얻으려고합니다. 나는 1을 얻는 방법을 알아 냈지만 더 많이 실패하면 실패합니다. 필터링이 도움이된다고 들었지만 처리 시간이 너무 길어 타임 아웃이 발생합니다. ?SPARQL 더 많은 과목에 대한 결과를 얻는 반복적 인 반복.

내가 할 수없는 것은의 {: 페이스 북 dbpedia : dbpedia 구글} VALUES입니다 그래서 다른 방법을 검토 한

,하지만 여전히 외설; t의 작업을. 여기에 내가 지금이야 어디 :

잘 작동하지만 약 50 그들에게 전화하는 데 필요한 SPARQL에서 한 번에 하나 개의 개념에 대한
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()); 
     } 

    } 

. 그래서 나는 그것을 프로그램으로 할 수있는 방법을 알아야합니다. 또한 약 30-40 개를 허용해야하기 때문에 필터링없이 조건자를 선택할 때 도움이된다면 좋을 것입니다.

고맙습니다. 당신이 도울 수 있기를 바랍니다.

답변

0

이전 질문에서 VALUES ?s { dbpedia:Facebook dbpedia:Google }의 문제를 해결했다고 생각했습니다. Sparql about dbpedia:World_Wide_Web. values ?s { dbpedia:Facebook dbpedia:Google }을 수행하는 대신 filter(?s in (dbpedia:Facebook, dbpedia:Google) }을 사용할 수 있습니다. 피사체와 속성에 잘 작동합니다. 당신이 구글과 페이스 북을위한 영어 초록 및 레이블을 얻을 수 원한다면 예는,이 같은 쿼리 사용할 수 있습니다 : 당신이 (즉 union 제거 할 수 있다면, 지금

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

을하는 당신을 당신이 정말로 특정 주제에서 특정 속성의 가치를 찾고 있다면 할 수있을 것입니다), 그럼 당신은 실제로 당신이 원하는 방식으로 values 블록을 사용할 수 있습니다. (사실, 다른 질문에서 볼 수있는 문제의 행동은 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

+0

문제가 느리게 작동하는 경향이 있으며 DBpedia 나를 제한 시간 제공 : 일부 특정 속성에 대해, 당신은 할 수 있습니다. DBpedia를 미러링하는 더 나은 엔드 포인트를 찾았지만 여전히 한계가 있으며 30-40-50 개의 자원을 검사해야합니다. –

+0

다른 끝점은 "http://lod.openlinksw.com/sparql" –

+0

@AlexDoro입니다. 특정 속성의 값을 쿼리하는 중이라면 'union'을 제거하고 사용할 수 있어야합니다 '가치'맞지? 그래도 여전히 시간 초과 문제가 있습니까? –

관련 문제