SPARQL: obtenir toutes les entités des sous-classes d'une certaine classe

je dois obtenir toutes les instances d'une Classe C et des sous-classes (directes ou indirectes) de C, dans SPARQL.

je peux obtenir tous les sous-classes directes de C de cette façon:

SELECT ?entity
WHERE {
  ?subclass rdfs:subClassOf :C .
  ?entity rdf:type ?subclass .
}

Mais je ne peux pas obtenir le cas d'un sous-sous-classe, et aucune instance de C.

Que je sais (j'ai pré-calculé) toutes les sous-classes (directs et indirects de C), et je peux construire une requête dynamique, est-il possible de créer une requête comme suit un?

SELECT ?entity
WHERE {
  ?entity rdf:type in <list>.
}

Merci à tous.

EDIT:

je viens de le résoudre, même si ce n'est pas d'une manière élégante.

SELECT ?entity
WHERE {
  { ?entity rdf:type :C }
  UNION { ?entity rdf:type :SubClass1 }
  UNION { ?entity rdf:type :SubClass2 }
  UNION { ?entity rdf:type :SubClass3 }
}
10
demandé sur auino 2012-02-09 14:57:24

2 réponses

une meilleure solution est d'utiliser des expressions de chemin de propriété dans SPARQL 1.1

ceci serait réécrit comme:

SELECT ?entity
WHERE {
  ?entity rdf:type ?type.
  ?type rdfs:subClassOf* :C.
}
21
répondu William Greenly 2012-02-09 15:36:53

basé sur le SPARQL 1.1 spécification la bonne façon de le faire serait:

SELECT ?entity
WHERE {
    ?entity rdf:type/rdfs:subClassOf* :C
}

sans le support des chemins de propriétés, il n'y a aucun moyen d'exprimer des hiérarchies de classes de longueur arbitraire.

3
répondu Robin Keskisarkka 2016-02-09 10:36:39