我正在使用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 :(得分:0)
您应该按照特定subclass of
的{{1}}的层次结构进行拆分。因此,从Q362开始,您最终将达到:https://www.wikidata.org/wiki/Q350604 - instance of
,假设第二次世界大战是该分裂之前的所有内容,即:
1)armed conflict
:https://www.wikidata.org/wiki/Q103495和
2)world war
:https://www.wikidata.org/wiki/Q198,然后是
3)war
:https://www.wikidata.org/wiki/Q350604分为:
1)armed conflict
:https://www.wikidata.org/wiki/Q180684,现在拆分为
2)conflict
:https://www.wikidata.org/wiki/Q1190554
由于你只对事件感兴趣,我会以递归的方式做到这一点,直到我到达事件类。