繁体   English   中英

如何获取Wikidata中的所有事件

[英]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 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) conflicthttps : //www.wikidata.org/wiki/Q180684 ,现在分为
2) eventhttps : //www.wikidata.org/wiki/Q1190554

由于您只对事件感兴趣,因此我将递归执行此操作,直到到达事件类为止。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM