2010-05-28 15 views
41

cada vez que empiezo a usar sql tiendo a arrojar un par de declaraciones exploratorias en la base de datos para comprender qué está disponible y qué forma toman los datos.consultas exploratorias SPARQL?

por ejemplo.

show tables 

describe table 

select * from table 

puede alguien ayudarme a entender la manera de completar una exploración similar de un almacén de datos RDF utilizando un SPARQL endpoint?

Gracias :)

Respuesta

69

Bueno, la primera puesta obvia es mirar a las clases y propiedades presentes en los datos.

Aquí es cómo ver lo que las clases se están utilizando:.

SELECT DISTINCT ?class 
WHERE { 
    ?s a ?class . 
} 
LIMIT 25 
OFFSET 0 

(LIMIT y OFFSET están ahí para paginación Vale la pena acostumbrarse a ellos, especialmente si va a enviar su consulta a través de Internet I. 'll omitir ellos en los otros ejemplos)

a es un SPARQL especial (y Notation3/Turtle) sintaxis para representar el predicado rdf:type -. Estos links casos individuales a owl:Class/rdfs:Class tipo s (aproximadamente equivalente a tablas en SQL RDBMS).

En segundo lugar, desea ver las propiedades. Puede hacer esto utilizando las clases que ha buscado o simplemente buscando propiedades. Vamos a conseguir todas las propiedades de la tienda:

SELECT DISTINCT ?property 
WHERE { 
    ?s ?property ?o . 
} 

Esto hará que todas las propiedades, que es probable que no está interesado en lo que equivale a una lista de todas las columnas de la fila en SQL, pero sin. cualquier agrupación por la tabla.

Más útil es para ver qué propiedades están siendo utilizados por las instancias que declaran una clase particular:

SELECT DISTINCT ?property 
WHERE { 
    ?s a <http://xmlns.com/foaf/0.1/Person>; 
    ?property ?o . 
} 

Esto le devolverá las propiedades que se utilizan en todas las instancias que satisfacen el primer triple - es decir, que tienen el rdf:type de http://xmlns.com/foaf/0.1/Person.

Recuerde, porque un rdf: Resource puede tener varias propiedades de rdf: type, por ejemplo, clases, y dado que el modelo de datos de RDF es aditivo, no tiene un problema de diamantes. El tipo es solo otra propiedad; es solo un acuerdo social útil decir que algunas cosas son personas o perros o genes o equipos de fútbol. No significa que el almacén de datos va a contener propiedades generalmente asociadas con ese tipo. El tipo no garantiza nada en términos de qué propiedades podría tener un recurso.

Debe familiarizarse con el modelo de datos y el uso de la sintaxis de SPARQL UNION y OPTIONAL. El mapeo aproximado de rdf: type a tablas SQL es solo eso: rudo.

Es posible que desee saber a qué tipo de entidad apunta la propiedad. En primer lugar, es probable que desee conocer las propiedades de tipo de datos, equivalentes a literales o primitivas. Ya sabes, cadenas, enteros, etc. RDF define estos literales como todos los que heredan de la cadena.Podemos filtrar sólo aquellas propiedades que son literales utilizando el método de filtro de SPARQL isLiteral:

SELECT DISTINCT ?property 
WHERE { 
    ?s a <http://xmlns.com/foaf/0.1/Person>; 
    ?property ?o . 
    FILTER isLiteral(?o) 
} 

Estamos aquí sólo se va a conseguir propiedades que tengan por objeto un literal - una cadena, fecha y hora, booleano, o uno de los otros tipos de datos XSD.

Pero, ¿qué pasa con los objetos no literales? Considere esta definición muy simple pseudo clase Java como una analogía:

public class Person { 
    int age; 
    Person marriedTo; 
} 

Uso de la consulta anterior, queremos recuperar el literal que representaría edad si la propiedad está obligado edad. Pero marriedTo no es una primitiva (es decir, un literal en términos RDF) - es una referencia a otro objeto - en la terminología RDF/OWL, esa es una propiedad del objeto. Pero no sabemos a qué tipo de objetos se refieren esas propiedades (predicados). Esta consulta le devolverá propiedades con los tipos acompañantes.

SELECT DISTINCT ?property, ?class 
WHERE { 
    ?s a <http://xmlns.com/foaf/0.1/Person>; 
    ?property ?o . 
    ? a ?class . 
    FILTER(!isLiteral(?o)) 
} 

Eso debería ser suficiente para orientarse en un conjunto de datos en particular. Por supuesto, también recomendaría que simplemente retire algunos recursos individuales e inspeccionarlos. Puede hacerlo utilizando la consulta DESCRIBIR:

DESCRIBE <http://example.org/resource> 

Hay algunas herramientas SPARQL - SNORQL, por ejemplo - que le permiten hacer esto en un navegador. La instancia de SNORQL a la que me he vinculado tiene una consulta de muestra para explorar los posibles gráficos nombrados, que no he tratado aquí.

Si no está familiarizado con SPARQL, honestamente, el mejor recurso si se queda atascado es la especificación. Es una especificación W3C pero bastante buena (construyeron un conjunto de pruebas decente para que realmente pueda ver si las implementaciones lo han hecho correctamente o no) y si puede superar el complicado lenguaje, es bastante útil.

+0

de plano respuesta increíble - gracias mucho Tom! – significance

+0

Sé que se supone que no debo publicar simple "¡Gracias!"mensajes en SO, pero usted acaba de ayudar seriamente a un novato de SPARQL, así que:" ¡Gracias! ". –

1

A menudo me refiero a este list of queries from the voiD project. Son principalmente de naturaleza estadística, pero no solo. No debería ser difícil eliminar los COUNT de algunas declaraciones para obtener los valores reales.

6

encuentro el siguiente conjunto de consultas exploratorias útil:

Al ver las clases:

select distinct ?type ?label 
where { 
    ?s a ?type . 
    OPTIONAL { ?type rdfs:label ?label } 
} 

Al ver las propiedades:

select distinct ?objprop ?label 
where { 
    ?objprop a owl:ObjectProperty . 
    OPTIONAL { ?objprop rdfs:label ?label } 
} 

Al ver las propiedades de datos:

select distinct ?dataprop ?label 
where { 
    ?dataprop a owl:DatatypeProperty . 
    OPTIONAL { ?dataprop rdfs:label ?label } 
} 

ver qué propiedades se utilizan en realidad:

select distinct ?p ?label 
where { 
    ?s ?p ?o . 
    OPTIONAL { ?p rdfs:label ?label } 
} 

ver qué entidades se afirman:

select distinct ?entity ?elabel ?type ?tlabel 
where { 
    ?entity a ?type . 
    OPTIONAL { ?entity rdfs:label ?elabel } . 
    OPTIONAL { ?type rdfs:label ?tlabel } 
} 

Al ver los gráficos distintos en uso:

select distinct ?g where { 
    graph ?g { 
     ?s ?p ?o 
    } 
}