2016-11-24 20 views
0

我正在使用wikidata工具包,我想獲取所有事件的列表。如何獲取wikidata中的所有事件

我寫了一個EntityDocumentProcessor,我想過濾出我的轉儲中的事件。那麼我知道事件文檔的編號爲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

您應該按照特定instance ofsubclass of的分層結構進行拆分。因此,從Q362開始你會最終達到:https://www.wikidata.org/wiki/Q350604 - armed conflict,推定是從二戰直到那一剎那之前的一切,即:
1)world warhttps://www.wikidata.org/wiki/Q103495
2)warhttps://www.wikidata.org/wiki/Q198,然後
3)armed conflicthttps://www.wikidata.org/wiki/Q350604其將到:

1):https://www.wikidata.org/wiki/Q180684,現在分裂到
2)eventhttps://www.wikidata.org/wiki/Q1190554

既然你只對事件感興趣,我會以遞歸方式做這件事,直到我到達事件類。

相關問題