如何使用SPARQL获取Wikidata实体的*all*超类?
我感兴趣的是可视化Wikidata类层次结构,以创建类似 我知道如何获得Wikidata实体的直接超类。为此,我使用SPARQL代码,如:如何使用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". } } 其中表示-属性的子类 但是,这
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想要可视化的图形的完整版本。聪明的一点是零长度属性路径的使用——如果答案中包含对这个关键部分如何工作的描述,那将是一件好事。这里也巧妙地使用了零长度属性路径。由于这些非常好的答案,我学到了一些东西。