2012-08-29 18 views
6

Estoy tratando de obtener las propiedades más específicas para una clase, y estoy atascado. Deseo extraer todas las propiedades que se aplican para una clase determinada (incluidas las heredadas de las superclases), , excepto aquellas propiedades que tienen subpropiedades en el conjunto de resultados.SPARQL: Obtenga la "propiedad más específica"

Por ejemplo, si tengo una clase Población con uno de sus propiedades de ser atLocation y una subclase de Población llamada refugiados. Refugees tiene una propiedad currentLocation, que es una subpropiedad de atLocation.

Así que lo que quiero es una consulta genérica que me sólo dioatLocation si pongo en Población y únicaCurrentLocation si pongo en refugiados. Lo que tengo es la siguiente:

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 

Esto me da tanto atLocationyCurrentLocation, sin embargo.

¿Es esto posible en una consulta? ¡Cualquier idea sobre cómo resolver esto apreciada!

+1

La misma pregunta también se publicó (y se respondió) en la lista de distribución W3C sparql-dev, consulte http://lists.w3.org/Archives/Public/public-sparql-dev/2012JulSep/0017.html –

Respuesta

4

Esto fue más complicado de lo que esperaba cuando lo probé por mí mismo. Sin embargo, lo que necesita hacer es extender algo su cláusula 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) 
} 

Estamos seleccionando todas las propiedades cuyo dominio es: ex refugiado o una superclase de ex refugiados: (dos primeras BGPs). Pero luego queremos filtrar las propiedades para las que existe una subpropiedad que también tiene un dominio que es (una superclase de) ex: Refugiado. Tenga en cuenta que estamos utilizando una variable diferente para el dominio de la subpropiedad (? D), después de todo, no necesariamente tiene que tener exactamente el mismo dominio que la propiedad que estamos seleccionando.

Los trabajos anteriores en un simple (no vinculación o RDF (S) vinculación) triplestore, siempre que cada sub-propiedad sólo ha definido su forma más específica clase de dominio, es decir, usted tiene la 'ex Triple: CurrentLocation rdfs: dominio ex: Refugee 'pero no explícitamente' ex: currentLocation rdfs: domain ex: Population '.

+0

Gracias, Jeen. Estaba a punto de pegar tu respuesta aquí, en caso de que alguien más tenga el mismo problema en el futuro. – Carsten

+0

@Carsten, no pensaste que iba a dejar que te salgas con esos puntos de karma ¿verdad? :) –

Cuestiones relacionadas