2012-08-29 16 views
6

Ich versuche, die spezifischsten Eigenschaften für eine Klasse zu holen, und ich bin fest. Ich möchte alle Eigenschaften herausnehmen, die für eine bestimmte Klasse gelten (einschließlich der von Superklassen geerbten), außer diejenigen Eigenschaften, die Untereigenschaften in der Ergebnismenge haben.SPARQL: Get "am meisten spezifische Eigenschaft"

Zum Beispiel, wenn ich eine Klasse Bevölkerung mit einem seiner Eigenschaften ist atLocation, und eine Unterklasse von Bevölkerung genannt Flüchtlinge. Flüchtlinge hat eine Eigenschaft currentLocation, die eine Untereigenschaft von atLocation ist.

Also, was ich will, ist eine generische Abfrage, die mir nuratLocation geben würde, wenn ich in setzen Bevölkerung und nurCurrent wenn ich in Flüchtlinge setzen. Was ich habe, ist dies:

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 

Das gibt mir sowohl atLocationundCurrent, though.

Ist dies in einer Abfrage überhaupt möglich? Irgendwelche Ideen, wie man das löst, werden geschätzt!

+1

Gleiche Frage auch geschrieben (und beantwortet) auf W3C Sparql-dev Mailingliste, siehe http://lists.w3.org/Archives/Public/public-sparql-dev/2012JulSep/0017.html –

Antwort

4

Das war kniffliger als ich erwartet hatte, als ich es für mich selbst ausprobierte. Allerdings müssen Sie Ihre NOT EXISTS-Klausel etwas erweitern.

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

Wir Auswahl aller Eigenschaften, deren Domäne ist ex: Flüchtling oder eine geordnete Klasse von Ex: Refugee (die ersten beiden BGPs). Aber dann wollen wir diejenigen Eigenschaften herausfiltern, für die eine SubProperty existiert, die auch eine Domain hat, die (eine Superklasse von) ex: Refugee ist. Beachten Sie, dass wir eine andere Variable für die Domäne der Untereigenschaft (? D) verwenden, nachdem es muss nicht unbedingt exakt die gleiche Domäne wie die Eigenschaft haben, die wir auswählen.

Die oben genannten Arbeiten auf einem einfachen (nicht-entailment oder RDF (S) entailment) triplestore jedes Teilgelände seiner spezifische Domain-Klasse definiert nur hat, das heißt, Sie die dreifachen ‚ex hat: Current rdfs: Domäne ex: Flüchtling 'aber nicht explizit' ex: currentLocation rdfs: Domäne ex: Population '.

+0

Danke, Jeen. Ich wollte gerade deine Antwort hier einfügen, für den Fall, dass jemand anderes das gleiche Problem in der Zukunft hat. – Carsten

+0

@Carsten, du dachtest nicht, dass ich dich mit diesen Karma-Punkten durchkommen lassen würde, oder? :) –

Verwandte Themen