例如,请考虑以下三种情况:
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 fire
,World's Fair
,Peloponnesian War
)之前停止。
有没有办法用SPARQL或API执行此操作?
答案 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
的原因,因为我没有它就会超时。
要了解我想在维基数据图构建器中查看的数据。因为它显示聚类非常好。
正如您所看到的,在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 [] }
}