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

问题描述

我对可视化维基数据类层次结构感兴趣,以创建像

directed graph of superclasses of vectorspace entity

这样的图表

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

SELECT ?item ?itemLabel 
WHERE 
{
    wd:Q125977 wdt:P279 ?item.
    SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }
}

其中 wdt:P279 表示 subclass of 属性

然而,这种直接方法需要对 Wikidata API 进行多次单一请求。

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

(请注意,上面的示例图仅显示了缩略版本。所有超类的最终所需图为 13 层深,有 69 个节点,这意味着 68 个单个请求,如果有兴趣,请参阅 this jupyter notebook。)

解决方法

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

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". }
  }
}
,

我认为您需要如下查询:

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* 是一个 zero-or-more path,将一个类与它的一个超类(的超类)连接起来。

这将生成一个映射“类->超类”,其中包含构建您说明的图形所需的所有内容。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...