获取维基数据项的所有子项(但不是实例)

时间:2018-05-06 16:02:54

标签: sparql wikidata wikidata-api

例如,请考虑以下三种情况:

Triangle Shirtwaist Factory fire (Q867316) : instance of (P31): disaster (Q3839081)
disaster:  subclass of (P279) :  occurrence (Q1190554) 
occurrence (Q1190554) : subclass of:  temporal entity (Q26907166) 

World's Fair (Q172754) : subclass of (P279) :  exhibition (Q464980) 
exhibition (Q464980)  : subclass of (P279) :  event (Q1656682) 
event (Q1656682) : subclass of (P279) : occurrence (Q1190554)
occurrence (Q1190554) : subclass of:  temporal entity (Q26907166) 

Peloponnesian War (Q33745) :  instance of (P31):  war (Q198) 
war (Q198) : subclass of (P279) : occurrence (Q1190554)
occurrence (Q1190554) : subclass of:  temporal entity (Q26907166)

我希望temporal entity的所有后代在实例(Triangle Shirtwaist Factory fireWorld's FairPeloponnesian War)之前停止。

有没有办法用SPARQL或API执行此操作?

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您只想获得实例在维基数据上的分类方式。

首先从示例@AKSW开始:

SELECT DISTINCT ?event_type ?event_typeLabel { 
    ?event_type wdt:P279* wd:Q26907166 
    SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
LIMIT 100

*是一项相当昂贵的计算操作,到撰写本文时,维基数据已接近5000万件。这就是我必须添加LIMIT的原因,因为我没有它就会超时。

绘制图形

要了解我想在维基数据图构建器中查看的数据。因为它显示聚类非常好。

https://angryloki.github.io/wikidata-graph-builder/?property=P279&item=Q26907166&iterations=2&mode=reverse

enter image description here

正如您所看到的,在2次迭代后已经有很多分类。所以我们可能已经对这个查询感到满意:

SELECT DISTINCT ?event_type ?event_typeLabel { 
    ?event_type wdt:P279/wdt:P279 wd:Q26907166 
    SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}

请注意,它只沿P279属性走2次。目前这给了我281件物品。

如果你真的需要完全遍历树,你可以过滤掉"" (P31)使用FILTER NOT EXISTS的陈述。但问题是目前总是遇到超时:

SELECT DISTINCT ?event_type ?event_typeLabel { 
    ?event_type wdt:P279* wd:Q26907166 .
    FILTER NOT EXISTS { ?event_type wdt:P31 [] }
SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
LIMIT 100

使用子查询,您可以限制树的结果,但是您将获得不完整的数据:

SELECT ?event_type ?event_typeLabel
WHERE
{
    {
      SELECT DISTINCT ?event_type
      WHERE                
      { 
        ?event_type wdt:P279* wd:Q26907166 .
      }
      LIMIT 1000
    }

    SERVICE wikibase:label { bd:serviceParam wikibase:language "en". } 
    FILTER NOT EXISTS { ?event_type wdt:P31 [] }   
}