2012-08-29 15 views
6

Sto cercando di recuperare le proprietà più specifiche per una classe e sono bloccato. Voglio estrarre tutte le proprietà valide per una determinata classe (comprese quelle ereditate dalle superclassi), eccetto quelle proprietà che hanno sottoproprietà nel set di risultati.SPARQL: Ottieni "proprietà più specifiche"

Per esempio, se ho una classe Popolazione con una delle sue proprietà essere atLocation, e una sottoclasse di Popolazione chiamato Rifugiati. I rifugiati hanno una proprietà currentLocation, che è una sottoprietà di atLocation.

Quindi quello che voglio è una query generica che mi darebbe soloatLocation se ho messo in Popolazione, e soloCurrentLocation se ho messo in Rifugiati. Quello che ho è questa:

prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
prefix ex: <http://example.org/vocabulary#> 

SELECT DISTINCT ?prop WHERE { 
    ex:Refugee rdfs:subClassOf* ?domain . 
    ?prop rdfs:domain ?domain . 
    ?subprop rdfs:domain ?domain . 
    FILTER NOT EXISTS { ?subprop rdfs:subPropertyOf ?prop . } 
} ORDER BY ?prop 

Questo mi dà sia atLocationeCurrentLocation, però.

Questo è possibile in una sola query? Qualche idea su come risolvere questo apprezzato!

+1

La stessa domanda ha anche pubblicato (e risposto) sulla mailinglist sparql-dev di W3C, vedere http://lists.w3.org/Archives/Public/public-sparql-dev/2012JulSep/0017.html –

risposta

4

Questo è stato più difficile di quanto mi aspettassi quando l'ho provato per conto mio. Tuttavia, ciò che devi fare è estendere un po 'la clausola NOT EXISTS.

SELECT ?prop WHERE { 
    ?prop rdfs:domain ?domain . 
    ?class rdfs:subClassOf* ?domain . 
    FILTER NOT EXISTS { 
     ?sub rdfs:subPropertyOf ?prop. 
     ?sub rdfs:domain ?d. 
     ?class rdfs:subClassOf* ?d . 
    } 
    FILTER (?class = ex:Refugee) 
} 

Stiamo selezionando tutte le proprietà il cui dominio è ex: rifugiato o una superclasse di ex: Refugee (primi due BGPs). Ma poi vogliamo filtrare le proprietà per le quali esiste una subProperty che ha anche un dominio che è (una superclasse di) ex: Rifugiato. Si noti che stiamo utilizzando una variabile diversa per il dominio della proprietà secondaria (? D), dopotutto lo non deve necessariamente avere lo stesso dominio identico alla proprietà che stiamo selezionando.

Le opere di cui sopra su un semplice (non implicazione o RDF (S) entailment) triplestore, a condizione che ogni sotto-proprietà solo ha la sua più specifica classe dominio definito, vale a dire, si ha la tripla 'es: CurrentLocation rdf: dominio ex: Refugee 'ma non esplicitamente' ex: currentLocation rdf: dominio ex: Popolazione '.

+0

Grazie, Jeen. Stavo per incollare la tua risposta qui, nel caso in cui qualcun altro abbia lo stesso problema in futuro. – Carsten

+0

@Carsten, non pensavi che ti avrei lasciato scappare con quei punti karma giusto? :) –

Problemi correlati