SPARQL查询与Person相关的所有类的列表

时间:2017-06-19 06:52:01

标签: sparql semantic-web ontology dbpedia rdfs

我想创建一个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相关。有什么建议?

1 个答案:

答案 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/"))
}