如何使用SPARQL获取Wikidata实体的*all*超类?

如何使用SPARQL获取Wikidata实体的*all*超类?,sparql,ontology,semantic-web,superclass,wikidata,Sparql,Ontology,Semantic Web,Superclass,Wikidata,我感兴趣的是可视化Wikidata类层次结构,以创建类似 我知道如何获得Wikidata实体的直接超类。为此,我使用SPARQL代码,如: SELECT ?item ?itemLabel WHERE { wd:Q125977 wdt:P279 ?item. SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". } } 其中表示-属性的子类 但是,这

我感兴趣的是可视化Wikidata类层次结构,以创建类似

我知道如何获得Wikidata实体的直接超类。为此,我使用SPARQL代码,如:

SELECT ?item ?itemLabel 
WHERE 
{
    wd:Q125977 wdt:P279 ?item.
    SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }
}
其中表示-属性的
子类

但是,这种直接方法需要对Wikidata API发出许多单个请求

如何通过单个SPARQL查询获得相同的信息


(请注意,上面的示例图仅显示了一个缩写版本。所有超类的最终所需图深度为13层,有69个节点,这意味着68个单个请求,请参阅是否感兴趣。)

我认为您需要一个如下查询:

SELECT ?class ?classLabel ?superclass ?superclassLabel
WHERE 
{
    wd:Q125977 wdt:P279* ?class.
    ?class wdt:P279 ?superclass.
    SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }
}
其中,
wdt:P279*
是一个连接类和它的一个超类(的超类)的函数


这将生成一个映射“class->superclass”,其中包含构建所示图形所需的所有内容。

您可以使用类似这样的查询直接将分类法(带标签)创建为三元组

CONSTRUCT {
  ?item1 wdt:P279 ?item2.
  ?item1 rdfs:label ?item1Label.
  ?item2 rdfs:label ?item2Label.
}
WHERE {
  SELECT ?item1 ?item2 ?item1Label ?item2Label
   WHERE {
    wd:Q125977 (wdt:P279*) ?item1, ?item2.
    FILTER(EXISTS { ?item1 wdt:P279 ?item2. })
    SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }
  }
}

这是一个非常简洁的解决方案,它提供了足够的信息来构建OP想要可视化的图形的完整版本。聪明的一点是零长度属性路径的使用——如果答案中包含对这个关键部分如何工作的描述,那将是一件好事。这里也巧妙地使用了零长度属性路径。由于这些非常好的答案,我学到了一些东西。