[英]How to get all events in 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是否为事件的方法?
您应遵循的特定instance of
的subclass 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
: https : //www.wikidata.org/wiki/Q350604 ,其分为:
1) conflict
: https : //www.wikidata.org/wiki/Q180684 ,现在分为
2) event
: https : //www.wikidata.org/wiki/Q1190554
由于您只对事件感兴趣,因此我将递归执行此操作,直到到达事件类为止。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.