【问题标题】:How to get *all* superclasses of a Wikidata entity with SPARQL?如何使用 SPARQL 获取 Wikidata 实体的*所有*超类?
【发布时间】:2021-05-17 08:12:15
【问题描述】:

我有兴趣可视化 Wikidata 类层次结构以创建像 这样的图形

我知道如何获得direct Wikidata 实体的超类。为此,我使用 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。)

【问题讨论】:

    标签: sparql ontology semantic-web superclass wikidata


    【解决方案1】:

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

    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 想要可视化的图形的完整版本。聪明的一点是使用零长度的属性路径——如果答案包括这个关键部分如何工作的描述会很好。
    【解决方案2】:

    我认为您需要如下查询:

    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,将一个类与其一个超类(的一个超类)连接起来。

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

    【讨论】:

    • 这里也巧妙地使用了零大小写。由于这些非常好的答案,我学到了一些东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多