如何获取wikidata中的所有活动

时间:2016-11-24 16:07:28

标签: java 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是否为事件?

1 个答案:

答案 0 :(得分:0)

您应该按照特定subclass of的{​​{1}}的层次结构进行拆分。因此,从Q362开始,您最终将达到:https://www.wikidata.org/wiki/Q350604 - instance of,假设第二次世界大战是该分裂之前的所有内容,即:
1)armed conflicthttps://www.wikidata.org/wiki/Q103495
2)world warhttps://www.wikidata.org/wiki/Q198,然后是 3)warhttps://www.wikidata.org/wiki/Q350604分为:

1)armed conflicthttps://www.wikidata.org/wiki/Q180684,现在拆分为
2)conflicthttps://www.wikidata.org/wiki/Q1190554

由于你只对事件感兴趣,我会以递归的方式做到这一点,直到我到达事件类。