在 SPARQL 中查找实体的超级 类
finding super classes of an entity in SPARQL
我想使用维基百科数据制作名称实体识别器,我需要获取一个词的所有超级 类 以查看属于哪个类别(地点、人类、组织或 None)这个词是。我在网上冲浪了很多次,找到了一些像这样的页面:
- SPARQL query to find all sub classes and a super class of a given class
当我执行查询结果“找不到匹配的记录”时,即使页面中提到的词和尝试其他命名空间。
和:
- Extracting hierarchy for dbpedia entity using SPARQL
这与我的工作非常相似,但我也得到了“未找到匹配的记录”结果。
我认为这些链接中提到的查询在逻辑上是正确的,但我不知道为什么它们对我没有任何结果。我还尝试通过这些站点中提到的示例来学习 SPARQL:
- https://www.wikidata.org/wiki/Wikidata:SPARQL_query_service/queries/examples
- https://www.wikidata.org/wiki/Wikidata:SPARQL_query_service/queries
而且我没有找到任何可以找到超级 类 的词。
有一些我没有得到结果的代码示例:
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 .
}
"Albert"是谁?!您只能查询 DBpedia 中确实存在的数据。没有资源http://dbpedia.org/resource/Albert
你的第一个查询使用了错误的命名空间,至少我没见过http://dbedia.org as namespace, for resources it's usually http://dbpedia.org/resource/
您的第一个查询使用 rdfs:subClassOf
谓词是错误的,因为 "Albert" 应该是一种资源。表示资源“:x”属于 class :C
是由 RDF 三元组 :x a :C .
完成的。 class :C
有一个 superclass :D
在 RDF 中表示为 :C rdfs:subClassOf :D .
.
您的第二个查询再次使用了一些旧的命名空间前缀 dbpedia:
,现在称为 dbr:
,并且确实代表了命名空间 http://dbpedia.org/resource/。但是正如我在第一点中提到的, "Albert"
没有资源
什么是"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:type
和 rdfs:subClassOf
(分别为 wdt:P31
and wdt:P279
)。
我想使用维基百科数据制作名称实体识别器,我需要获取一个词的所有超级 类 以查看属于哪个类别(地点、人类、组织或 None)这个词是。我在网上冲浪了很多次,找到了一些像这样的页面:
- SPARQL query to find all sub classes and a super class of a given class
当我执行查询结果“找不到匹配的记录”时,即使页面中提到的词和尝试其他命名空间。 和:
- Extracting hierarchy for dbpedia entity using SPARQL
这与我的工作非常相似,但我也得到了“未找到匹配的记录”结果。
我认为这些链接中提到的查询在逻辑上是正确的,但我不知道为什么它们对我没有任何结果。我还尝试通过这些站点中提到的示例来学习 SPARQL:
- https://www.wikidata.org/wiki/Wikidata:SPARQL_query_service/queries/examples
- https://www.wikidata.org/wiki/Wikidata:SPARQL_query_service/queries
而且我没有找到任何可以找到超级 类 的词。
有一些我没有得到结果的代码示例:
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 .
}
"Albert"是谁?!您只能查询 DBpedia 中确实存在的数据。没有资源http://dbpedia.org/resource/Albert
你的第一个查询使用了错误的命名空间,至少我没见过http://dbedia.org as namespace, for resources it's usually http://dbpedia.org/resource/
您的第一个查询使用
rdfs:subClassOf
谓词是错误的,因为 "Albert" 应该是一种资源。表示资源“:x”属于 class:C
是由 RDF 三元组:x a :C .
完成的。 class:C
有一个 superclass:D
在 RDF 中表示为:C rdfs:subClassOf :D .
.您的第二个查询再次使用了一些旧的命名空间前缀
dbpedia:
,现在称为dbr:
,并且确实代表了命名空间 http://dbpedia.org/resource/。但是正如我在第一点中提到的, "Albert" 没有资源
什么是"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
.
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:type
和 rdfs:subClassOf
(分别为 wdt:P31
and wdt:P279
)。