2012-02-09 28 views
9

Devo ottenere tutte le istanze di una classe C e sottoclassi (diretta o indiretta) di C, in SPARQL.SPARQL: Ottieni tutte le entità di sottoclassi di una determinata classe

posso ottenere tutte le sottoclassi diretti di C in questo modo:

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

ma non riesco a ottenere le istanze di una sottoclasse indiretta e né qualsiasi istanza di C.

Come so (Li ho pre-calcolati) tutte le sottoclassi (dirette e indirette di C), e posso costruire una query dinamica, è possibile costruire una query come la seguente?

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

Grazie a tutti.

EDIT:

Ho appena risolto, anche se in un modo non elegante.

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

risposta

20

Una soluzione migliore è quella di utilizzare espressioni di percorso proprietà in SPARQL 1.1

Questo sarebbe essere riscritta come:

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

A seconda del negozio triplo, questo potrebbe o potrebbe non funzionare. Non tutti i negozi tripli implementano le espressioni dei percorsi di proprietà. –

+0

Grazie, ha funzionato !! – auino

+0

@msalvadores Come aggiornamento, mentre potrebbero esserci ancora vecchi negozi tripli, i percorsi delle proprietà sono passati a SPARQL 1.1, quindi qualsiasi archivio triplo che supporta lo standard corrente supporterà i percorsi delle proprietà. –

3

Sulla base del SPARQL 1.1 specification il modo corretto per farlo sarebbe:

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

Senza supporto per percorsi di proprietà non c'è modo di expre ssing gerarchie di classi di lunghezza arbitraria.