2012-02-09 21 views
9

Tengo que obtener todas las instancias de una clase C y subclases (directas o indirectas) de C, en SPARQL.SPARQL: Obtenga todas las entidades de subclases de una cierta clase

yo puede conseguir todas las subclases directas de C de esta manera:

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

pero no puedo obtener las instancias de una subclase indirecta y tampoco ninguna instancia de C.

Como sé (He precalculado) todas las subclases (directas e indirectas de C), y puedo construir una consulta dinámica, ¿es posible crear una consulta como la siguiente?

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

Gracias a todos.

EDIT:

acabo lo resolvió, aunque de manera no elegante.

SELECT ?entity 
WHERE { 
    { ?entity rdf:type :C } 
    UNION { ?entity rdf:type :SubClass1 } 
    UNION { ?entity rdf:type :SubClass2 } 
    UNION { ?entity rdf:type :SubClass3 } 
} 

Respuesta

20

Una mejor solución es utilizar expresiones de ruta característica en SPARQL 1.1

Esto puede reescribir como:

SELECT ?entity 
WHERE { 
    ?entity rdf:type ?type. 
    ?type rdfs:subClassOf* :C. 
} 
+2

Dependiendo de la triple tienda esto podría funcionar o no. No todas las tiendas triples implementan expresiones de rutas de propiedad. –

+0

¡Gracias, funcionó! – auino

+0

@msalvadores Como una actualización, aunque todavía pueden existir tiendas triples más antiguas, las rutas de acceso de propiedad se convirtieron en SPARQL 1.1, por lo que cualquier tienda triple que admita el estándar actual admitirá rutas de propiedad. –

3

Sobre la base de la SPARQL 1.1 specification la forma correcta de hacerlo sería:

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

Sin soporte para rutas de propiedad no hay forma de expre Ssing jerarquías de clase de longitud arbitraria.

Cuestiones relacionadas