2016-11-24 1 views
0

wikidata 툴킷을 사용하고 있으며 모든 이벤트의 목록을 얻고 싶습니다.wikidata에서 모든 이벤트를 얻는 방법

덤프 밖으로 이벤트를 필터링하려는 EntityDocumentProcessor를 작성했습니다. 글쎄, 이벤트 문서의 ID가 Q1190554이고 현재 itemDocument의 인스턴스가 이벤트의 "인스턴스"(P31)인지 어떻게 든 확인해야한다는 것을 알고 있습니다.

@Override 
public void processItemDocument(ItemDocument itemDocument) { 
     boolean isEvent = false; 
     for (StatementGroup statementGroup : itemDocument.getStatementGroups()) { 
      switch (statementGroup.getProperty().getId()) { 
       case "P31": // P31 is "instance of" 
        isEvent = containsValue(statementGroup, filterClass); 
        break; 
       case "P279": // P279 is "subclass of" 
        if (!isEvent) { 
         isEvent = containsValue(statementGroup, filterClass); 
        } 
        break; 
      } 
     } 
} 



private boolean containsValue(StatementGroup statementGroup, Value value) { 
    for (Statement s : statementGroup.getStatements()) { 
     if (value.equals(s.getValue())) { 
      return true; 
     } 
    } 

    return false; 
} 

이 접근법은 사람들을 얻는 데 효과적입니다. 그러나 이벤트 문제는 WW2 (https://www.wikidata.org/wiki/Q362)와 같은 이벤트가 이벤트를 직접 매핑하지 않는다는 것입니다. 이벤트가 어딘가에 숨겨져 있습니다. 현재 itemDocument가 이벤트인지 쉽게 확인할 수있는 방법을 아는 사람이 있습니까?

답변

0

subclass of의 계층 구조 (특정 instance of)를 따라야합니다. 그래서 Q362부터 당신은 결국 도달 할 것이다 : https://www.wikidata.org/wiki/Q350604-armed conflict을 추정 차 세계 대전, 즉 때까지 그 이전 분할에 이르기까지,이다 인 :
1) world war : https://www.wikidata.org/wiki/Q103495
2) war : https://www.wikidata.org/wiki/Q198, 다음
3) armed conflict

1) : :로 분할 https://www.wikidata.org/wiki/Q350604 지금
2 분할 https://www.wikidata.org/wiki/Q180684) event : https://www.wikidata.org/wiki/Q1190554

,

그리고 이벤트에만 관심이 있으니 이벤트 클래스에 도달 할 때까지 반복적으로이 작업을 수행 할 것입니다.