在 SPARQL 中查找实体的超级 类

finding super classes of an entity in SPARQL

我想使用维基百科数据制作名称实体识别器,我需要获取一个词的所有超级 类 以查看属于哪个类别(地点、人类、组织或 None)这个词是。我在网上冲浪了很多次,找到了一些像这样的页面:

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

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

我认为这些链接中提到的查询在逻辑上是正确的,但我不知道为什么它们对我没有任何结果。我还尝试通过这些站点中提到的示例来学习 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 .
}
  1. "Albert"是谁?!您只能查询 DBpedia 中确实存在的数据。没有资源http://dbpedia.org/resource/Albert

  2. 你的第一个查询使用了错误的命名空间,至少我没见过http://dbedia.org as namespace, for resources it's usually http://dbpedia.org/resource/

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

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

  5. 没有资源
  6. 什么是"superclass of a word"?澄清一下,资源属于 class,而 class 可以有 superclasses.

如果你想拥有资源所属的所有 classes 包括它们的超级classes,你可以使用例如"Tom Hanks"

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

因此 subClassOf 谓词仅适用于 class 事物的 es 而不是一般情况下的实例。您需要通过 rdf:type.

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

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

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

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

您可能正在寻找类似这样的查询:

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

维基数据使用自己的谓词代替 rdf:typerdfs:subClassOf(分别为 wdt:P31 and wdt:P279)。