sábado, 31 de octubre de 2015

3.4.3 La noción de SPARQL endpoint


¿Qué es un SPARQL endpoint? Básicamente es lo que hay detrás de la página web que ustedes utilizan para consultar la dbpedia, por ejemplo, algunos datos de la wikipedia o de la dbpedia es Santiago, que es de tipo lugar, Santiago está en un país que es Chile, y Chile es de tipo país. Además Santiago tiene un nombre oficial que es Santiago.

Esos datos que hemos visto en la anterior imagen, aquí están en formato de triples, y los podemos almacenar. ¿Pero cómo accedemos a ellos? ¿Cómo permitimos que muchas personas, miles de personas que están en internet accedan a esos datos?

Eso se permite a través de esta caja de texto en la url http://dbpedia.org/sparql Uno escribe ahí su SPARQL y nos retorna los resultados de la consulta. ¿Pero qué hay detrás de este textbox de la página web? Lo que hay es un SPARQL endpoint, y ¿qué es un SPARQL endpoint?

Es un servicio web que permite consultar los datos en un grafo RDF. Estas consultas se realizan utilizando el lenguaje SPARQL y, además de permitir a los usuarios consultar los datos de forma muy sencilla y potente, permite a las organizaciones que se encargan de generar estos datos una forma fácil de acceder a ellos. ¿Qué tipos de datos podemos encontrar en los SPARQL endpoints que hay en internet?
Podemos encontrar datos bibliográficos como, por ejemplo dblp, que es una base de datos de referencias bibliográficas, datos científicos, datos de redes sociales, gubernamentales, de medios de comunicación, genéricos, lingüísticos. Estos son los principales tipos y estos tipos están mostrados en la siguiente figura.

Esta figura que corresponde al link Open-Data Cloud representa multitud de SPARQL endpoints (no están todos los que hay), y cada circulo representa una base de RDF que expone sus datos a través de un SPARQL endpoint. Además, cada flecha que hay entre cada círculo, representa que hay enlaces entre una base de datos y otra; cuánto más gruesa es la línea más enlaces hay, y la dirección de la flecha indica la dirección en la cual se han generado los enlaces. Por ejemplo, dbpedia en inglés contiene enlaces a dbpedia en español, y dbpedia en español contiene enlaces a dbpedia en inglés; vemos así que hay dos flechas en cada extremo, en cada extremo de la línea que las une.

Esto nos lleva al siguiente tema, que son los datos enlazados. Los datos que existen en distintos endpoints se enlazan. Como veíamos en el ejemplo anterior, la dbpedia en inglés contiene enlaces a la dbpedia en español; de esta forma, es posible generar consultas que accedan a dos bases de datos, a dos SPARQL endpoints distintos, y entonces generar unos resultados mucho más ricos. Por ejemplo, podría consultar, la descripción de Santiago en inglés, y además acceder a la descripción en español, o en japonés, o en ruso. Eso se puede conseguir consultando las distintas bases de datos, los distintos SPARQL endpoints que están en el link de data cloud.

¿Qué estadísticas sobre datos enlazados hay? Por ejemplo, en el dominio Medios de comunicación hay 1,800 millones de triples, y los enlaces de salida, que van desde, por ejemplo, el endpoint de la dbc de música hacia otro dato, son en total como 50 millones. Datos geográficos hay como 6 millones y 35 millones de enlaces de salida, etcétera.

En resumen, un SPARQL endpoint es un servicio web que permite consultar datos de un grafo RDF. Las consultas en un SPARQL endpoint son reaizadas utilizando SPARQL. Y además muchos de los datos de los SPARQL endpoints, los datos que almacenan, están enlazados a otros SPARQL endpoints, permitiendo así generar datos mucho más interesantes y mucho más completos.

3.4.2 Funciones en SPARQL

Vamos a ver lo que son las funciones en SPARQL. A modo de resumen, las funciones son operadores que se suelen colocar dentro de otro operador FILTER y permiten realizar distintas verificaciones sobre una variable u otro tipo de operaciones. Ahora lo vamos a ver en más detalle.

Vamos a comenzar escribiendo los datos. Por ejemplo, la ciudad de México tiene como título de los gobernantes entre otros, el Senado de la República de México. Además la ciudad de México es de tipo lugar y está en el país, México. También la ciudad tiene como nombre México D.F.

Estos datos, los vemos aquí en formato de triples rdf. Este es el archivo que normalmente uno puede cargar en el triple store de su gusto.

Las funciones son operadores que normalmente se utilizan dentro de un filter. Esas funciones lo que hacen es revisar distintas operaciones, como por ejemplo, verificar si una variable contiene un URI o no, si una variable tiene un valor o no, si es un literal, etcétera. Son operaciones relativamente sencillas que nos dan más flexilibilidad del lenguaje. Además, también se consideran funciones, los operadores  (!) negación, (&&) conjunción y (||) disyunción de funciones.

Algunos ejemplos de funciones son IsIRI, que verifica si el resultado es una URI o no; IsLiteral, que verifica si la variable dentro de la función es un literal o no; Bound, que verifica si la variable tiene un valor o no; y hay muchas más que se pueden encontrar en la URL de SPARQL sección funciones:
isIRI
isBlank
isLiteral
isNumeric
str
lang
datatype
IRI
BNODE
STRDT
STRLANG
UUID

Vamos a poner ahora, un ejemplo de la función IsIRI, que verifica si los valores dentro de la variable, tienen una URI o no. Si tienen una URI, entonces retorna a cierto. Si no, retorna a falso. Aquí, esta consulta busca todos los lugares en los cuales los gobernantes tengan algún título. Y vamos a filtrar, esos títulos de gobernantes, o sólo los que tengan una URI, es decir, solo aquellos recursos de datos que tengan información que enlace a otros recursos de datos.

Ejecutamos esa consulta y obtenemos estos resultados. La ciudad de México tiene como título del líder, el Senado de la República; es decir, el Senado de la República está en México, y si hacemos clic en este resultado, el Senado de la República, vamos a obtener la información acerca de este recurso de datos.

Lo que vamos a hacer ahora es, negar la función IsIRI, es decir, no queremos en los resultados aquellos valores que tengan una URI dentro de la variable título. Para ello lo que hacemos es negarlo (con el operador (!).

Ejecutamos, y vamos a obtener un recurso de datos, en este caso Chinatown, que no tiene información acerca del título de los gobernantes. En este caso, lo tendremos entre comillas porque es un literal, Councilmember.

Ahora vamos a pasar a la función Bound. La función Bound nos retorna a cierto, si la variable de la función contiene un valor y si no contiene un valor, va a retornar a falso. Y en este ejemplo lo que vamos a hacer es, negar; si la variable dentro de la función Bound no contiene un valor retornará a cierto.

En este ejemplo lo que estamos preguntando es, por todos los lugares y finalmente quiero obtener todos los títulos de los gobernantes. Y fuera de lo opcional, tenemos el filter con la función Bound, negándola, es decir, solo nos va a retornar aquellos recursos de datos que no tengan un valor en la variable título.

Lo ejecutamos y lo que tenemos de vuelta es el recurso Metro La Paz, que es la zona metropolitana de La Paz, en Perú; sin nada en la variable, en el campo resultado a la variable que estaba dentro de la negación del Bound.

Las funciones en SPARQL son operadores que normalmente se utilizan dentro del filter, aunque en casos especiales y muy particulares se pueden utilizar fuera. Tres de estas funciones son IsIRI, IsLiteral o Bound.

viernes, 30 de octubre de 2015

3.4.1 Retornando grafos RDF en SPARQL

Hasta ahora hemos visto que nuestras consultas retornan un conjunto de resultados en formato de una tabla. El primer resultado en la primera fila, el segundo resultado en la segunda fila, etcétera. pero, si consultamos grafos, ¿no sería más natural retornar grafos a nuestras consultas, en lugar de tablas con resultados? Pues bien, esto es lo que vamos a ver ahora, cómo retornar a nuestras consultas un grafo. 

Vamos a empezar con estos datos. Tenemos aquí que Amparo Noguera, cuando nació se llamaba María Amparo Noguera Portales. Además tiene como almaMater la Pontificia Universidad Católica de Chile. Amparo Noguera nació en Santiago, cuyo nombre oficial es Santiago, y además el recurso Santiago es de tipo lugar. 

Los datos que mostraba anteriormente en un grafo los podemos ver aquí en un archivo de texto. 

Vamos a empezar recordando que la consulta SELECT lo que hace es retornar tablas con resultados. El asterisco que vemos aquí junto al SELECT, lo que está haciendo es retornarnos los resultados para todas las variables que están presentes dentro de la consulta. 

Si ejecutamos la consulta anterior solo con los datos que hemos visto en la segunda imagen, obtenemos los resultados para todas las variables de la consulta: dbpedia:Santiago es recurso para la variable x, nombre de ciudad Santiago, etcétera. 

Pero nos gustaría obtener todos estos resultados como si fuesen un grafo, ya que va a ser un resultado mucho más conciso y mucho más entendible. 

Este es el grafo que nos gustaría obtener: Amparo Noguera, su nombre completo es María Amparo Noguera Portales, almaMater de la Universidad Católica, y el lugar de nacimiento fue Santiago. Nótese que aquí no queremos obtener el nombre Santiago, simplemente queremos el recurso, y todo ello dentro de un grafo. 

El grafo en RDF sería el que vemos ahora en esta transparencia, que es más sencillo, más conciso, y sólo obtenemos los datos que a nosotros nos interesan. ¿Cómo obtenemos estos resultados? SPARQL nos ofrece el operador CONSTRUCT para obtener los resultados en forma de grafo, en lugar de una tabla. 

Una consulta CONSCTRUCT recibe RDF como entrada en el patrón de la consulta y genera RDF como salida en una plantilla que nosotros vamos a especificar. Esta plantilla es un conjunto de triples con variables y dentro del patrón es exactamente lo mismo que las consultas SELECT. 

Aquí vemos un ejemplo de consulta CONSTRUCT que nos va a generar el grafo que hemos visto antes. Dentro de CONSTRUCT, dentro de las primeras llaves y en amarillo, lo que estamos haciendo es formar la plantilla del grafo que vamos a tener como salida, y después en el WHERE, en blanco tenemos el patrón SPARQL que teníamos inicialmente como si fuese un SELECT. Lo nuevo es el patrón, la plantilla nueva que estamos generando con CONSTRUCT. 

Y así obtenemos el resultado a la consulta anterior. Amparo Noguera nació en Santiago, tiene almaMater la Pontificia Universidad Católica de Chile y su nombre completo es María Amparo Noguera Portales; y dbpedia:Santiago no tiene el nombre, básicamente porque nosotros no hemos querido incluirlo en la plantilla CONSTRUCT, en la parte amarilla. 

Ahora, otra opción que nos da CONSTRUCT es cambiar las URIs del grafo de resultado. Si por ejemplo, nosotros consideramos que las URIs de dbpedia, el vocabulario de dbpedia no nos acomoda, podemos invocar otro vocabulario.  lo Lo que hacemos para ello, es utilizar dentro de la plantilla CONSTRUCT el vocabulario que nosotros queramos. Por ejemplo, ahora dentro de CONSTRUCT vamos a tener la variable persona del vocabulario ex, lugar de nacimiento x, porque preferimos lugar de nacimiento a birth place. Entonces en el grafo de resultados vamos a tener que Amparo Noguera...


3.3.3 El operador SPARQL UNION

Aquí continuaremos con nuestro estudio del lenguaje de consulta SPARQL y en particular veremos el operador UNION, que nos permite realizar la unión de un conjunto de respuestas. Utilizaremos los siguientes datos sobre actores que hemos tomado desde dbpedia. 

En este grafo RDF tenemos el recurso dbpedia Thalía que representa a la actriz Thalía nacida en la ciudad de México y con ocupación actor. También tenemos a Ricardo Darín que es un actor, esto lo indica el triple Ricardo Darín, dbpedia-owl occupation dbpedia actor y que nació en la ciudad de Buenos Aires. Además tenemos información sobre estas dos ciudades; sabemos que la ciudad de México es de tipo lugar y que Buenos Aires es también de tipo lugar. 

En esta imagen podemos ver el grafo de RDF como una secuencia de triples. Recuerde que primero se especifican cuáles son los prefijos que se  van a utilizar. dbpprop, dbpedia-owl y dbpedia, y a continuación tenemos la secuencia de triples que forman parte de nuestro grafo RDF. Por ejemplo, el primer triple nos dice dbpedia:Thalía dbpedia-owl:occupation dbpedia:actor, lo que se traduce en que Thalía tiene como ocupación actor. 

El operador UNION en SPARQL nos permite hacer la unión de un conjunto de respuestas. Por ejemplo queremos todas las personas que hayan nacido en México, unido con todas las personas que hayan nacido en Chile. Para poder expresar esto usamos este operador. A continuación veremos un ejemplo del operador UNION.

 En la siguiente consulta buscamos los actores que hayan nacido en Buenos Aires y vamos a unir esto con los actores que hayan nacido en ciudad de México. En esta consulta SPARQL puede ver en amarillo el operador UNION que en este caso se está realizado sobre dos patrones. 

En el primer patrón podemos ver que buscamos actores que hayan nacido en Buenos Aires. Recuerde que un patrón es un conjunto de triples. En estos triples usamos el signo de pregunta para indicar que algo es una variable, en este caso persona 1. En el primer triple entonces, estamos diciendo que persona 1 tiene que tener como lugar de nacimiento Buenos Aires; en el segundo triple estamos diciendo que persona 1 tiene que tener como ocupación actor. Así, estamos buscando actores que hayan nacido en Buenos Aires. 

Cuando respondemos a esta parte de la consulta, si usamos los datos anteriores, podemos reemplazar la variable persona 1 por Ricardo Darín y vamos a obtener dos triples que están en nuestro grafo RDF. 

En esta consulta el segundo patrón que está dentro de la unión, tiene dos triples. La variable es persona 2 porque comienza con el signo de pregunta y en el primer triple estamos indicando que para persona 2 esperamos que el lugar de nacimiento sea la ciudad de México. En el segundo triple especificamos que para persona 2 la ocupación sea actor. En estos dos triples estamos indicando que persona 2 debe ser un actor que haya nacido en la ciudad de México. Si tratamos de responder esta consulta en nuestro grafo RDF podemos reemplazar persona 2 por Thalía, vamos a obtener una respuesta. 

 Finalmente, para calcular el resultado final de la consulta hacemos la unión de los resultados anteriores. Tenemos una tabla que nos muestra los resultados, en la que hemos incluido algunos resultados adicionales que sacamos desde dbpedia. Y nos muestran por ejemplo que, para persona 1, que representa los actores nacidos en Buenos Aires tenemos a Ricardo Darín y a Nicole Neumann y para persona 2 que representa los actores que nacieron en México tenemos a Thalía, a Alejandra Bogue y a Gloria Izaguirre. 

Como resumen, el operador UNION permite hacer la unión de conjuntos de respuestas y por ejemplo nos permite encontrar a todas las personas que hayan nacido en Chile o en México.

3.3.2 El operador SPARQL OPTIONAL

Hoy vamos a ver cómo funciona el operador OPTIONAL. A grandes rasgos, lo que hace es retornarnos información, en el caso de que exista, y si no existe, nos lo retorna en blanco. Ahora lo vamos a ver con más detalle.

Los datos a consultar, los vemos en esta imagen. Tenemos el recurso Lima, de tipo lugar, que además tiene como alcalde Luis Castañeda Lossio; y Lima está en Perú, representado con el recurso Perú, y Perú es de tipo país. Además, Lima tiene como nombre oficial el stream Lima.

Estos son los datos del archivo RDF, y el operador OPTIONAL de SPARQL nos permite recuperar datos en el caso de que existan. Si no existen esos datos, no hay problema, porque siempre nos va a devolverá aquellos datos que existan, pero en una respuesta incompleta

Este operador es especialmente útil en un entorno como la web donde hay muchos datos, pero pueden ser incompletos. Si  nos intersa encontrar nombres de personas y filtrar aquellas personas que tengan una página web, nos las va a retornar; si yo no tengo página web, también va a retornar mi nombre. Si otra persona tiene página web, completará la respuesta agregando la dirección de la página web.

En este grafo de ejemplo, vamos a hacer una consulta sin OPTIONAL. Queremos obtener todos los recursos que tengan un nombre y que además sean de tipo lugar. Esto solo nos retornaría la ciudad de Lima.

Si añadimos el operador OPTIONAL, OPTIONAL entre llaves, la variable X que estamos consultando en el patrón anterior, el predicado le pedía owl leaderName y alcalde. Estamos preguntando por todos aquellos lugares que tienen nombre, y si sabemos el nombre de su alcalde, nos lo retornara. Lo que vamos a obtener utilizando este OPTIONAL es, todas aquellas ciudades que tienen alcalde; y las que no tengan alcalde, nos las va a seguir retornando, en alguna respuesta.

En la imagen de arriba vemos el grafo. ¿Qué vamos a hacer? ¿Qué va a coincidir con nuestra consulta? Y estos son los resultados:

Nos damos cuenta de que en la primera fila de resultados tenemos a Lima y sabemos el nombre de su alcalde. En cambio, en la segunda fila, no tenemos el nombre del alcalde, con lo cual, lo que tenemos es un espacio en blanco. También sucede en la tercera fila, donde está el recurso Alameda County en California que tampoco sabemos quién es su alcalde, con lo cual nos retorna en blanco. Hay que darse cuenta que esta consulta siempre nos devuelve resultados, y en caso de que no sepamos algo, nos devuelve en blanco.

En esta consulta queremos obtener todos los recursos que tengan un nombre, que sean de tipo lugar, y opcionalmente queremos saber su alcalde o líder, y que además este alcalde debe haber nacido en la misma ciudad en la cual está gobernando. Vemos en amarillo los patrones, los triples SPARQL que indican esto, y la condición filter en la cual se especifica que el lugar de nacimiento del alcalde tiene que ser el mismo que el lugar que estamos consultando.

Y estos son los resultados. No hay muchos, pero por ejemplo tenemos en la primera fila a Delhi En el cual, su alcalde nació en la misma ciudad, la ciudad de Delhi; en cambio, si su alcalde no ha nacido en la misma ciudad que gobierna, nos sigue devolviendo las ciudades y su nombre, pero no nos devuelve ni el alcalde, ni la ciudad que está gobernando.

En resumen, El operador OPTIONAL es un operador que nos devuelve datos en el supuesto de que existan. Si no existen, nos devuelve en blanco, pero la consulta nos sigue devolviendo los datos que estén fuera de OPTIONAL. Esto es muy útil en el contexto de la web, porque la web es directamente incompleta; no podemos meter todos los datos porque no están todos los datos aquí. Además dentro del operador OPTIONAL podemos añadir otros operadores SPARQL, como un FILTER.

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.