2011-03-19 18 views
7

Actualmente estoy buscando una forma de consultar DBPedia's Infobox Onyology database a través del punto final SPARQL para obtener una lista de las clases, las subclases de una clase seleccionada y las propiedades de una clase determinada. Por lo que he podido encontrar, o necesita conocer la propiedad que está buscando o buscar algo específico: todos los ejemplos que he encontrado parecen basados ​​en la idea de que desea buscar algo específico. (como poblaciones de ciudades por encima de una cierta elevación, etc.), mientras que me gustaría construir algo donde efectivamente pueda "explorar" las categorías. Por ejemplo, comenzando con la lista de subclases de "owl: Thing" en this class hierarchy chart y presentando al usuario la lista de subclases de una subclase seleccionada. Parece posible buscar algo como esto a través de la wiki de asignaciones, pero sería preferible consultar directamente el punto final SPARQL.Obteniendo categorías de Infobox DBPedia

¿Hay alguna consulta SPARQL simple que devuelva las clases y propiedades disponibles de esas clases?

Actualización: Yo he llegado con una forma de obtener la jerarquía de clases parece, por iteración a través de this query:

SELECT ?subject WHERE { 
    ?subject rdfs:subClassOf owl:Thing 
} 

que devuelve una lista de subclases de búho: cosa, y si reemplazar búho: cosa con una de las subclases, obtengo la lista de subclases de eso, hasta que no haya subclases, en ese punto puedo seleccionar todos los recursos que tienen un tipo dado por la subclase elegida. Sin embargo, todavía no estoy muy seguro de cómo obtener todas las propiedades comunes a la subclase.

Actualización 2 Acércate ahora. Esta consulta me pone todas las propiedades (niños de DBpedia: propiedades) que son también un país, así como sus títulos:

SELECT DISTINCT ?prop ?title WHERE { 
    ?country ?prop ?value. 
    ?country a <http://dbpedia.org/ontology/Country>. 
    ?prop rdf:type rdf:Property. 
    ?prop rdfs:label ?title 
} 

que en realidad es todo muy pedí. Lo último que trato de hacer ahora es tratar de ordenarlos por el número de páginas en que aparecen (presumiblemente las propiedades más comunes serán las de mayor interés).

Respuesta

7

bien, así que he hecho imaginé más o menos exactamente cómo hacer esto, así que estoy enviando esto como una respuesta en lugar de solo una edición.Lo que parece darme exactamente lo que estoy buscando es empezar por iteración a través de la clase de jerarquía usando this query:

SELECT ?class ?label WHERE { 
    ?class rdfs:subClassOf owl:Thing. 
    ?class rdfs:label ?label. 
    FILTER(lang(?label) = "en") 
} 

Alimentar el resultado seleccionado en la consulta en lugar del búho: cosa cada vez.

Una vez que el usuario ha seleccionado la clase de nivel más bajo que les gustaría, para mostrar una lista de propiedades, en orden descendente por el número de entradas en el que aparecen, utilizo this query:

SELECT ?prop ?title WHERE { 
    ?country ?prop []. 
    ?country a <http://dbpedia.org/ontology/Country>. 
    ?prop rdf:type rdf:Property. 
    ?prop rdfs:label ?title 
} ORDER BY DESC(COUNT(DISTINCT ?country)) 

Por supuesto, si realmente observas esos resultados, hay algunas propiedades originales que no tienen etiquetas muy descriptivas ("s"? ¿Qué?), Pero al menos es lo que estaba buscando en primer lugar.

2

Esto le dará todas las propiedades cuyos rdfs:domain es SpaceMission s:

select ?property where { 
    ?property rdfs:domain <http://dbpedia.org/ontology/SpaceMission> 
} 

estas propiedades todos aceptamos SpaceMission como el sujeto.

Tenga en cuenta que en RDF (S), no es necesario tener una declaración explícita rdfs:domain para cada propiedad, ya que rdfs:domain s puede estar implícito en el uso de la propiedad. Puede encontrar por lo tanto que esta consulta le dará una lista de todas las propiedades que han sido definidas con un dominio de SpaceMission pero no le dará una lista de todas las propiedades que son realmente usadas con todas las instancias de SpaceMission .

+0

Por alguna razón que no parece funcionar cuando se elige País en lugar de SpaceMission. Todo lo que devuelve es "twinCountry". Además, solo parece devolver cosas que están en dbpedia: ontology, not dbpedia: property. Actualicé la publicación principal con lo que parece ser una respuesta a mi pregunta original. – Paul

3

(1) de consultas para todas las clases existentes:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
SELECT DISTINCT ?class 
WHERE { 
    ?s rdf:type ?class . 
} 

(2) de consultas para todas las propiedades utilizadas en cualquier instancia de la clase C:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
SELECT DISTINCT ?property 
WHERE { 
    ?s rdf:type <C> . 
    ?s ?property ?o 
} 
1

Es muy posible que algunas de las propiedades no son en realidad define como tales con:

?p a rdf:Property .

pero cualquier término en la posición media es, por definición, una propiedad. Por lo que podría obtener más resultados con:

 
SELECT ?prop ?title WHERE { 
    ?country a <http://dbpedia.org/ontology/Country>. 
    ?country ?prop [] . 
    ?prop rdfs:label ?title . 
} 
ORDER BY DESC(COUNT(DISTINCT ?country)) 

(reordenada poco, ser selectivo en el inicio puede mejorar el rendimiento)

Cuestiones relacionadas