【问题标题】:finding super classes of an entity in SPARQL在 SPARQL 中查找实体的超类
【发布时间】:2017-05-03 13:16:42
【问题描述】:

我想使用维基百科数据制作名称实体识别器,我需要获取一个单词的所有超类,以查看该单词属于哪个类别(地点、人类、组织或无)。我经常上网,找到了一些类似的页面:

当我执行查询结果“没有找到匹配的记录”时,即使页面中提到了这个词并尝试了其他命名空间。 和:

这与我的工作非常相似,但我也得到了“未找到匹配记录”的结果。

我认为这些链接中提到的查询在逻辑上是正确的,但我不知道为什么它们对我没有任何结果。我还尝试通过这些网站中提到的示例来学习 SPARQL:

我没有找到任何东西来查找单词的超类。

有一些我没有得到结果的代码示例:

PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#>
PREFIX ns:<http://dbpedia.org/>

SELECT ?subClass ?label WHERE { 
    ?subClass rdfs:subClassOf ns:Albert . 
    ?subClass rdfs:label ?label . }

或:

SELECT * WHERE {
  dbpedia:Albert a ?c1 ; a ?c2 .
  ?c1 rdfs:subClassOf ?c2 .
}

【问题讨论】:

    标签: nlp sparql hierarchical-data superclass wikidata


    【解决方案1】:

    所以 subClassOf 谓词通常只适用于事物的类而不是实例。您需要通过rdf:type 与班级联系。

    SELECT * WHERE {
      <http://dbpedia.org/resource/Albert_Einstein> a ?c1 ; a ?c2 .
      ?c1 rdfs:subClassOf ?c2 .
    }
    

    我不确定您可以从 Albert 那里获得什么类型的实体,这可能需要消除歧义。我的示例查询使用Albert Einstein 作为 DBPEDIA 资源。

    请记住,根据您感兴趣的抽象级别,您可以多次跳转到根类。第二个查询上升了两个级别。

    SELECT DISTINCT ?c3 WHERE {
      <http://dbpedia.org/resource/Albert_Einstein> a ?c1 ; a ?c2 .
      ?c1 rdfs:subClassOf ?c2 .
      ?c2 rdfs:subClassOf ?c3 .
    }
    

    【讨论】:

    • 感谢@msalvadores 的有用回答。您的查询适用于 DBpedia 查询服务,但我需要它适用于不起作用的 wikidata 查询服务。
    【解决方案2】:

    您可能正在寻找类似以下查询的内容:

    SELECT DISTINCT ?c WHERE {
      ?Q wdt:P31/wdt:P279? ?c .
      ?Q rdfs:label "Tom Hanks"@en
    } 
    

    Wikidata 使用自己的谓词代替rdf:type 和rdfs:subClassOf(分别为wdt:P31 和wdt:P279)。

    【讨论】:

      【解决方案3】:
      1. “阿尔伯特”是谁?!您只能查询 DBpedia 中确实存在的数据。没有资源http://dbpedia.org/resource/Albert

      2. 您的第一个查询使用了错误的命名空间,至少我从未见过 http://dbedia.org 作为命名空间,对于资源,它通常是 http://dbpedia.org/resource/

      3. 您的第一个查询使用了错误的 rdfs:subClassOf 谓词,因为“Albert”应该是一种资源。表示资源 ":x" 属于类 :C 是由 RDF 三元组 :x a :C . 完成的。并且类:C 有一个超类:D,在RDF 中用:C rdfs:subClassOf :D . 表示。

      4. 您的第二个查询再次使用了一些旧的命名空间前缀dbpedia:,现在称为dbr:,并且确实代表了命名空间http://dbpedia.org/resource/。但是正如我在第一点中提到的,“Albert”没有资源

      5. 什么是“单词的超类”?澄清一下,资源属于一个类,一个类可以有超类。

      如果你想拥有一个资源所属的所有类,包括它们的超类,你可以使用例如对于“汤姆汉克斯”

      PREFIX dbr: <http://dbpedia.org/resource/>
      SELECT DISTINCT ?c WHERE {
        dbr:Tom_Hanks a/rdfs:subClassOf* ?c .
      } 
      

      【讨论】:

      • 非常感谢@AKSW 的回答,是的,“Albert”不存在。我只是想举个例子。我通过 DBpedia 查询服务从您的查询中得到结果,但它不适用于 wikidata 查询服务。我希望它在 wikidata 上工作的原因是它可以通过 wd 和 wdt 前缀获取项目 ID。我在 dbpedia 查询服务上没有找到这样的功能。
      • @AKSW 非常感谢您的出色回答。当我将您的上述代码更改为 dbr:Word2vec 时,我会得到非常令人困惑的结果(例如,“乐队”、“音乐组”等)。然而,word2vec 显然是一种计算机科学技术。因此,我期待诸如technique、algorithm、computer science 等超类。只是想知道我得到的实际结果。期待您的来信:)
      • @AKSW 我已经在下面提到了我使用 dbr:Word2vec c http://dbpedia.org/ontology/Band http://schema.org/MusicGroup http://dbpedia.org/ontology/Group http://www.ontologydesignpatterns.org/ont/dul/DUL.owl#SocialPerson http://schema.org/Organization http://dbpedia.org/ontology/Organisation http://dbpedia.org/ontology/Agent http://www.w3.org/2002/07/owl#Thing 得到的实际结果
      • @Emi 好吧,我们俩现在都认为这是错误的,但这正是 DBpedia 数据集中的内容。查询是正确的,这只是另一个数据质量问题。查看浏览器中的资源页面:dbpedia.org/page/Word2vec - 它的类型为 dbo:Band。查看 Wikipedia 页面,右侧没有信息框,这或多或少是 DBpedia 的主要来源——它只有这个机器学习概述,实际上不是特定于页面的信息框——因此,DBpedia 必须推断类型从别的东西 - 这是在一个研究项目中完成的,数据集是instance_types_sdtyped_dbo
      • @Emi 同样,您应该联系他们邮件列表中的 DBpedia 开发人员/维护人员,或者在 DBpedia 项目页面上打开 Github 问题:github.com/dbpedia/extraction-framework/issues
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-17
      • 2011-04-15
      • 1970-01-01
      • 2017-04-10
      • 2013-04-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多