rdf - query - sparql tutorial español
¿Consultas SPARQL exploratorias? (4)
A menudo me refiero a esta lista de consultas del proyecto voiD . Son principalmente de carácter estadístico, pero no solo. No debería ser difícil eliminar los recuentos de algunas declaraciones para obtener los valores reales.
cada vez que empiezo a usar SQL, tiendo a lanzar un par de declaraciones exploratorias en la base de datos para entender qué está disponible y qué forma toma la información.
p.ej.
show tables
describe table
select * from table
¿Alguien podría ayudarme a comprender la forma de completar una exploración similar de un almacén de datos rdf utilizando un punto final SPARQL?
Gracias :)
Bueno, el primer comienzo obvio es observar las clases y propiedades presentes en los datos.
Aquí es cómo ver qué clases se están utilizando:
SELECT DISTINCT ?class
WHERE {
?s a ?class .
}
LIMIT 25
OFFSET 0
(El LIMIT
y la OFFSET
están disponibles para la paginación. Vale la pena acostumbrarse a estos, especialmente si está enviando su consulta a través de Internet. Los omitiré en los otros ejemplos).
a
es una sintaxis especial de SPARQL (y Notation3 / Turtle ) para representar el predicado rdf:type
; esto vincula las instancias individuales con owl:Class
/ rdfs:Class
Tipos de rdfs:Class
(aproximadamente equivalentes a tablas en SQL RDBMSes).
En segundo lugar, desea ver las propiedades. Puede hacerlo usando las clases que ha buscado o simplemente buscando propiedades. Vamos a sacar todas las propiedades de la tienda:
SELECT DISTINCT ?property
WHERE {
?s ?property ?o .
}
Esto obtendrá todas las propiedades, que probablemente no le interesen. Esto es equivalente a una lista de todas las columnas de fila en SQL, pero sin ningún tipo de agrupación por la tabla.
Más útil es ver qué propiedades están utilizando las instancias que declaran una clase en particular:
SELECT DISTINCT ?property
WHERE {
?s a <http://xmlns.com/foaf/0.1/Person>;
?property ?o .
}
Esto le devolverá las propiedades utilizadas en cualquier instancia que satisfaga el primer triple, es decir, que tenga el rdf:type
http://xmlns.com/foaf/0.1/Person
.
Recuerde, porque un rdf: Resource puede tener múltiples propiedades de tipo rdf: clases, si lo desea, y como el modelo de datos de RDF es aditivo, no tiene un problema de diamante. El tipo es solo otra propiedad, es solo un acuerdo social útil para decir que algunas cosas son personas, perros, genes o equipos de fútbol. No significa que el almacén de datos vaya 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 OPCIONAL y UNIÓN de SPARQL. El mapeo aproximado de rdf: type a las tablas SQL es solo eso - rough.
Es posible que desee saber a qué tipo de entidad apunta la propiedad. En primer lugar, es probable que desee conocer las propiedades de los tipos de datos, equivalentes a los literales o primitivos. Ya sabes, cadenas, enteros, etc. RDF define estos literales como todos heredados de la cadena. Podemos filtrar solo aquellas propiedades que son literales usando el método de filtro SPARQL isLiteral
:
SELECT DISTINCT ?property
WHERE {
?s a <http://xmlns.com/foaf/0.1/Person>;
?property ?o .
FILTER isLiteral(?o)
}
Aquí solo vamos a obtener propiedades que tienen como objeto un literal: una cadena, fecha y hora, boolean o uno de los otros tipos de datos XSD.
Pero ¿qué pasa con los objetos no literales? Considere esta muy simple definición de clase pseudo-Java como una analogía:
public class Person {
int age;
Person marriedTo;
}
Usando la consulta anterior, recuperaríamos el literal que representaría la edad si la propiedad age está vinculada. Pero marriedTo no es un primitivo (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 estas propiedades (predicados). Esta consulta le devolverá las propiedades con los tipos adjuntos.
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 saque algunos recursos individuales y los inspeccione. Puedes hacerlo usando la consulta DESCRIBE:
DESCRIBE <http://example.org/resource>
Hay algunas herramientas SPARQL, SNORQL , por ejemplo, que te 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 con nombre, que no he cubierto aquí.
Si no está familiarizado con SPARQL, honestamente, el mejor recurso si se atasca es la especificación. Es una especificación de W3C pero bastante buena (crearon un conjunto de pruebas decente para que puedas ver si las implementaciones lo han hecho correctamente o no) y si puedes superar el lenguaje complicado, es bastante útil.
Encuentro útil el siguiente conjunto de consultas exploratorias:
Viendo las clases:
select distinct ?type ?label
where {
?s a ?type .
OPTIONAL { ?type rdfs:label ?label }
}
Viendo las propiedades:
select distinct ?objprop ?label
where {
?objprop a owl:ObjectProperty .
OPTIONAL { ?objprop rdfs:label ?label }
}
Viendo las propiedades de los datos:
select distinct ?dataprop ?label
where {
?dataprop a owl:DatatypeProperty .
OPTIONAL { ?dataprop rdfs:label ?label }
}
Ver qué propiedades se utilizan realmente:
select distinct ?p ?label
where {
?s ?p ?o .
OPTIONAL { ?p rdfs:label ?label }
}
Viendo qué entidades se afirman:
select distinct ?entity ?elabel ?type ?tlabel
where {
?entity a ?type .
OPTIONAL { ?entity rdfs:label ?elabel } .
OPTIONAL { ?type rdfs:label ?tlabel }
}
Viendo las distintas gráficas en uso:
select distinct ?g where {
graph ?g {
?s ?p ?o
}
}
SELECT DISTINCT * WHERE {
?s ?p ?o
}
LIMIT 10