2017-06-19 3 views
0

Je souhaite créer une requête SPARQL qui renvoie une liste de toutes les classes/propriétés Ontology liées à Person. Par exemple., Comme les sous-classes (dérivé de) de PersonRequête SPARQL pour la liste de toutes les classes liées à la personne

<rdfs:subClassOf rdf:resource="http://dbpedia.org/ontology/Person"/>

ou un domaine/gamme de Person

<rdfs:domain rdf:resource="http://dbpedia.org/ontology/Person"/>.

Par exemple, les résultats comme "http://dbpedia.org/ontology/OfficeHolder" & "http://dbpedia.org/ontology/Astronaut" doit être retourné par la requête, que le premier a rdfs:domain personne tandis que le second était une personne rdfs:subClassOf.

est ici la requête que j'ai écrit:

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 . 
    } 
} 

Maintenant, cette requête renvoie une liste de toutes les classes qui mentionnent explicitement Person dans leurs propriétés, mais manquer des classes comme Singer, qui est une sous-classe de MusicalArtist, qui est dans le domaine de la personne.

Je veux une requête qui répertorie toutes ces classes/propriétés, qui sont liées à la personne, directement ou par "héritage". Aucune suggestion?

+0

'dbo: OfficeHolder' n'est pas une propriété, il n'a pas' rdfs: domain'. –

Répondre

3

Il semble, vous confondez les classes avec des propriétés ... Lire attentivement RDFS 1.1, il est court.

Si vous souhaitez récupérer les classes et propriétés "liées à" dbo:Person, utilisez 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/")) 
} 
+0

Merci, c'est exactement ce que je cherchais !! :) :) – Krishh

+1

@StanislavKrlain: Pour une solution plus complète, vous devez aussi utiliser l'opérateur inverse '^' pour 'owl: equivalentProperty' et' owl: equivalentClass' car ceux-ci sont symétriques mais généralement une seule direction est contenue dans le KB C'est à dire. '(rdfs: subClassOf | (owl: equivalentClass |^owl: equivalentClass)) *' – AKSW

+0

@AKSW, merci! –