jueves, 29 de octubre de 2015

3.3.1 El operador SPARQL FILTER

En nuestro aprendizaje del lenguaje de consulta SPARQL, vamos a volver a ver el operador FILTER que nos permite filtrar los resultados de una consulta utilizando algunas condiciones. En el ejemplo tenemos información sobre la ciudad de Lima. 

Por ejemplo, tenemos que la población de esta ciudad es 7.605.742 personas, que el tipo de dbpedia:Lima es place, es un lugar, que el país donde se encuentra es Perú, que el nombre oficial de dbpedia:Lima es Lima y que Perú es de tipo país. 

Como en otros ejemplos anteriores, podemos ver los datos de este grafo RDF escritos en un archivo como una secuencia de triples. Recuerde que cuando se escribe una secuencia de triples, primero especifica los prefijos que vamos a utilizar, en este caso dbprop, dbpedia-owl y dbpedia y, después, se hace la secuencia de triples. 
El primero de estos triples es dbpedia:Lima, rdf:type, dbpedia-owl:Place, que nos dice que Lima es de tipo lugar. 

En la consulta que podemos ver en esta imagen, estamos preguntando por el nombre de los lugares y la cantidad de personas que viven en ellos. Recordemos que en una consulta SPARQL, primero está el encabezado, que se declara utilizando la palabra SELECT y después tiene el cuerpo de la consulta, que se declara utilizando la palabra WHERE. En WHERE, en este caso, tenemos tres triples. En el primero de estos triples, decimos que para la variable X queremos encontrar cuál es su nombre oficial. Las variables en SPARQL recordamos que siempre comienzan con el ? signo de pregunta. Así, en este caso, estamos diciendo ?x dbprop:officialName ?name; en el segundo triple decimos que, para esta variable X, queremos que el tipo sea Place, queremos que este X sea un lugar, y finalmente, en el último triple decimos que para esta variable X la población la queremos guardar en la variable población. Entonces, a través de estos tres triples, estamos diciendo que para la variable X el nombre oficial tiene que estar guardado en la variable name, que la variable X tiene que ser de tipo lugar y, que para la variable X, la población tiene que estar guardada en la variable población

A través del SELECT estamos diciendo que queremos guardar los valores para la variable X, para la variable name y para la variable población. Cuando ejecutamos esta consulta sobre los datos de dbpedia, obtenemos la siguiente tabla. 

Es importante indicar que esta tabla no nos entrega todos los resultados que obtenemos de dbpedia. Son muchos resultados, y no los podríamos poner en una sola imagen. Pero, por ejemplo, podemos ver que un posible valor para X es este URI que representa la ciudad de Santiago, dbpedia.org/resource/Santiago, que el nombre oficial de esta ciudad es Santiago de Chile y que la población de esta ciudad es 5.428.590; y en la respuesta a esta consulta tenemos otras combinaciones, como Buenos Aires, que tiene una población de 2.890.151 habitantes en el área urbana, y también tenemos la población de Lima y la población de México. 

Si examinamos todos los resultados obtenidos al ejecutar esta consulta, nos damos cuenta que se puede obtener algunos resultados que no son interesantes; por ejemplo, ciudades que tienen muy pocos habitantes; en un caso extremo, por ejemplo, podemos ver Capitán Meza, que en dbpedia aparece con un habitante. 

Si queremos filtrar estos resultados, podemos usar el operador FILTER y, por ejemplo, podemos decir que solo nos interesan las ciudades que tengan poblaciones con muchos habitantes, por ejemplo, al menos 5 millones. La forma de decir esto, que mostramos en la imagen, es utilizando una consulta SPARQL con el operador FILTER. En esta consulta, podemos ver en amarillo el filtro que hemos agregado a la consulta anterior, y que nos dice que para la variable población esperamos que el valor sea mayor de 5 millones.

Si ejecutamos esta consulta sobre los datos de dbpedia, obtenemos la tabla que mostramos en la imagen. De nuevo, solo mostramos parte de los resultados y, en este caso por ejemplo, obtenemos Lima, porque su población es mayor a 5 millones y también la ciudad de México, porque su población es mayor a 5 millones. 

Algo importante en el caso de FILTER es que es posible especificar más de una condición en este operador y las podemos combinar de distintas maneras. Una primera manera de combinar esto es utilizando el símbolo && que aparece dentro del cuadro rojo, que nos permite indicar que queremos hacer la conjunción entre dos condiciones, o sea que queremos hacer que se cumplan las dos condiciones. En amarillo lo que estamos diciendo, es que queremos filtrar los resultados de la consulta con dos condiciones; la primera nos dice que la población tiene que ser mayor de 10 mil habitantes y la segunda que el nombre tiene que ser igual a Lima.

En este caso es interesante ver la respuesta que obtenemos en Wikipedia, porque obtenemos dos ciudades que tienen nombre Lima. La primera es la ciudad de Lima que está en Perú y que tiene una población de un poco más de 7 millones de habitantes, que es lo que aparece en la primera respuesta de la tabla y que aparece como respuesta, porque su población es mayor a 10 mil habitantes y su nombre es igual a Lima; y en segundo lugar aparece la ciudad de Lima que está en Paraguay y que tiene una población de 10367 habitantes. De nuevo, esta dupla aparece como resultado a la consulta, porque esta ciudad Lima que está en Paraguay, tenemos que su nombre es Lima y su población es mayor a 10 mil habitantes.

En una condición FILTER también podemos combinar resultados utilizando un OR, para ello utilizamos el símbolo que está marcado en el cuadrlo rojo, que en este caso es || y que representa la disyunción entre dos condiciones. En la condición marcada en amarillo, estamos diciendo que estamos buscando ciudades tales que la población es mayor a 10 mil habitantes o el nombre es igual a Lima. Es importante destacar que esta disyunción es inclusiva, en el sentido de que para hacer la condición verdadera basta que una de las dos condiciones sea verdadera, pero también ambas pueden que ser verdaderas.

Si ejecutamos esta consulta sobre los datos de dbpedia obtenemos la siguiente relación, de la que estamos mostrando nuevamente parte de los resultados. La primera dupla que aparece en la relación, es dbpedia.org/resource/Lima, ¿por qué? Porque su nombre es Lima y su población es mayor a 10 mil habitantes. Por lo tanto, también satisface el O entre ambas condiciones. La segunda fila que tenemos en nuestra tabla que habla de la ciudad de Lima en Paraguay, también aparece en nuestra relación porque nuevamente se cumple este O, el nombre es Lima y además, se cumple que la población es mayor a 10 mil habitantes, asi que ambas condiciones son ciertas. Es interesante ver que la tercera fila que tenemos en nuestra relación aparece porque la ciudad de México satisface una de las dos condiciones y, por lo tanto, satisface el O; tiene al menos 10 mil habitantes.

Como resumen, el operador FILTER permite filtrar los datos en una consulta SPARQL. Este operador nos permite mejorar nuestras consultas para obtener los datos deseados. En el ejemplo mostrado queríamos obtener la población de las ciudades que son mencionadas en dbpedia, pero nos dábamos cuenta que hay muchas y, por lo tanto, decíamos que solo queremos obtener la población de aquellas ciudades que tienen al menos 5 millones de habitantes. Estábamos diciendo, entonces, que queríamos filtrar y solo obtener ciudades que tengan una gran población y, además, es importante recordar que el operador FILTER permite filtrar utilizando varias condiciones al mismo tiempo, las cuales son conectadas por operadores como la conjunción y la disyunción.

No hay comentarios:

Publicar un comentario