2011-03-22 12 views
8

Estoy tratando de consultar DBPedia para obtener una lista de propiedades relacionadas con una clase dada en la ontología, pero como las "etiquetas" legibles por humanos no siempre son claras, También me gustaría brindar un ejemplo de la base de datos. El problema es que, aunque quiero seleccionar todas las propiedades distintas, solo quiero un solo ejemplo de cada propiedad. Here's cómo mi consulta es sin capturar el ejemplo:Seleccionar algunas etiquetas distintas y algunas no distintas en SPARQL

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

Si cambio en this way, que comienza a recibir valores duplicados para prop:?

SELECT DISTINCT ?prop ?title ?example WHERE { 
    ?thing ?prop ?example. 
    ?thing a <http://dbpedia.org/ontology/Currency>. 
    ?prop rdf:type rdf:Property. 
    ?prop rdfs:label ?title. 
} ORDER BY DESC(COUNT(DISTINCT ?thing)) 
LIMIT 100 

estoy muy familiarizado con el uso de bases de datos y SPARQL consultas en general, por lo que no tengo claro cómo hacerlo. Idealmente, tendría algo como DISTINCT (? Prop)? Title? Example, que selecciona cada valor único para prop y devuelve su título y un ejemplo.

Respuesta

6

En sus segundas consultas, el distinto se aplica a la combinación de valores de ?prop?title y ?example. Por lo tanto usted no está recibiendo ningún duplicado, por ejemplo, para las dos filas siguientes obtenidos en la segunda consulta:

dbpedia2:subunitName "subunit name "@en "cent"@en 
dbpedia2:subunitName "subunit name "@en "centavo"@en 

no son duplicados debido a que la tercera fila ?example tiene dos valores diferentes "cent"@en y "centavo"@en

una forma de resolver este Posible es utilizar GROUP BY y MIN para obtener sólo el valor más bajo ranking de ?label y ?example, es decir:

SELECT ?prop MIN(?title) MIN(?example) WHERE { 
    ?thing ?prop ?example. 
    ?thing a <http://dbpedia.org/ontology/Currency>. 
    ?prop rdf:type rdf:Property. 
    ?prop rdfs:label ?title. 
} GROUP BY ?prop 
+0

Esto funciona muy bien, pero es el GRUPO POR argumentos necesarios ? Lo he implementado con ORDER BY DESC (COUNT (¿DISTINCT?) Cosa) y parece funcionar todavía. ¿Hay alguna circunstancia en la que ORDER BY arroje resultados desagradables que el grupo no quiere? – Paul

+2

@Paul Para ser una consulta válida, no se puede ORDENAR directamente por un agregado; esto no está permitido por la especificación SPARQL 1.1. Supuestamente, esta es una extensión de Virtuoso y hará que la consulta no sea portátil, es decir, no funcionará necesariamente en puntos finales que no sean Virtuoso. Por favor vea mi respuesta para formularios de consulta alternativos que deberían hacer lo mismo y ser portátiles – RobV

4

Aquí es una forma alternativa para lograr lo que quiere con subconsultas:

SELECT ?prop ?title ?example 
WHERE 
{ 
    ?thing a <http://dbpedia.org/ontology/Currency>. 
    ?prop rdf:type rdf:Property. 
    { SELECT ?title ?example WHERE { ?thing ?prop ?example . ?prop rdfs:label ?title. } LIMIT 1 } 
} 
LIMIT 100 

Esto tiene la ventaja de que es SPARQL estándares 1.1 compatible, como dije en mi comentario de pedidos por un total que no está permitido por la norma por lo está utilizando una extensión específica del proveedor que limitará la portabilidad de su consulta.

Si quiere pedir por un valor agregado de una manera que es portable a través de SPARQL 1.1 implementaciones entonces primero debe proyectarlo así:

SELECT ?s (COUNT(?p) AS ?predicates) WHERE 
{ 
    ?s ?p ?o 
} GROUP BY ?s ORDER BY DESC(?predicates) 
Cuestiones relacionadas