我想创建一个SPARQL查询,该查询返回与Person
相关的所有Ontology类/属性的列表。例如,像Person
<rdfs:subClassOf rdf:resource="http://dbpedia.org/ontology/Person"/>
或域名/范围为Person
<rdfs:domain rdf:resource="http://dbpedia.org/ontology/Person"/>
。
例如,结果如"http://dbpedia.org/ontology/OfficeHolder"
&amp;查询应返回"http://dbpedia.org/ontology/Astronaut"
,因为第一个人有rdfs:domain
人,而第二个人是rdfs:subClassOf
人。
这是我写的查询:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX dbo: <http://dbpedia.org/ontology/>
select distinct ?s
where {
{
?s rdfs:domain dbo:Person .
}
union
{
?s rdfs:range dbo:Person .
}
union
{
?s rdfs:subClassOf dbo:Person .
}
}
现在,此查询返回在其属性中明确提及Person
的所有类的列表,但是错过了Singer
这样的类,它是MusicalArtist
的子类,这是在人的领域。
我想要一个查询列出所有这些类/属性,这些类/属性直接或通过“继承”与Person相关。有什么建议?
答案 0 :(得分:3)
看来,你把类与属性混淆了......仔细阅读RDFS 1.1,它很短。
如果您要检索“与”dbo:Person
相关的类和属性,请使用property paths:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX dbo: <http://dbpedia.org/ontology/>
SELECT DISTINCT ?p ?s WHERE
{
{
?s (rdfs:subPropertyOf|owl:equivalentProperty|^owl:equivalentProperty)*/
rdfs:domain/
(rdfs:subClassOf|owl:equivalentClass|^owl:equivalentClass)*
dbo:Person .
BIND (rdfs:domain AS ?p)
}
UNION
{
?s (rdfs:subPropertyOf|owl:equivalentProperty|^owl:equivalentProperty)*/
rdfs:range/
(rdfs:subClassOf|owl:equivalentClass|^owl:equivalentClass)*
dbo:Person .
BIND (rdfs:range AS ?p)
}
UNION
{
?s (rdfs:subClassOf|owl:equivalentClass|^owl:equivalentClass)*
dbo:Person .
BIND (rdfs:subClassOf AS ?p)
}
# FILTER (STRSTARTS(STR(?s), "http://dbpedia.org/"))
}