Tolog es un lenguaje para hacer consultas sobre Topics Maps, de la misma forma que SQL hace consultas sobre una base de datos. Para realizar estas consultas el usuario realiza una petición sobre un Topic Map y Tolog devuelve un conjunto de resultados que hacen verdadera la petición.
La información usada por Tolog consiste en predicados, que son relaciones entre conjuntos de valores. Esto es, como una tabla con todos los conjuntos de valores que hacen cierto el predicado. Y las consultas son hechas a las tablas devolviendo todos los valores que coinciden.
Un predicado de Tolog es "instance-of" que usado para consultar las relaciones del topic "instance-topic".
Recupera todos los valores Topic y tipo de Topic de un supuesto Topic-Map:
instance-of($TOPIC, $TYPE)?
Tolog recuperaría algo como lo siguiente:
RAI
Organizacion
RAI
Compañía de Televisión
Teatro-nuovo Theatre
...
Si quisiéramos que Tolog no recuperara todos los topics y solo los que fuesen del tipo
"Theatre", sería:
instance-of($TOPIC, theatre)?
Recuperaría:
Teatro-nuovo
Teatro-San Carlo
...
Si quisiéramos que Tolog recuperara los tipos del teatro nuevo sería:
instance-of(teatro-nuovo, $TYPE)?
Recuperaría:
Theatre
Organizacion
Esto es porque Theatre es una instancia de Organizacion.
Tolog permite a las asociaciones dinámicas de predicados, para ello las asociaciones de un Topic Map son tratadas como predicados (que como hemos dicho antes representan relaciones). Para ello el nombre del predicado es el nombre de la asociación del Topic Map, indicando en la consulta los roles de los argumentos del predicado (en este caso componer y opera).
De esta forma si queremos las Operas de Puccini solo tenemos que realizar la siguiente consulta:
composed-by(Puccini : composer, $Opera : opera);
Tolog devolvería:
Madame Buterfly
Tosca
Turandot
...
Si quisiéramos recuperar con Tolog topics pero que cumplan varios predicados (o que presenten varias relaciones) Tolog nos permite usar el booleano AND (únicamente debemos separar los predicados por "," nunca poner AND). De esta forma solo devolverá los topics que estén presentes en ambas relaciones. Podemos encadenar cuantos predicados deseemos.
Recuperar las personas y la ciudad de nacimiento de los nacidos en una ciudad
situada en Italia:
born-in($PERSON : person, $CITY : place),
located-in($CITY : containee, italy : container)?
En el ejemplo anterior esto nos devolvería las personas y las ciudades. Si unicamente deseamos las personas haríamos uso de la proyección de Tolog. Esta se realiza mediante la clausula "SELECT" y le indica que solo estamos interesados en las variables que acompañan al select. De esta forma podemos reducir el tamaño de la información recuperada.
Recuperar las personas nacidas en una ciudad de Italia:
select $PERSON from
born-in($PERSON : person, $CITY : place),
located-in($CITY : containee, italy : container)?
Tolog además proporciona una función de agregación, que devuelve el número de resultados de la consulta. Para ello se utiliza la cláusula count().
Queremos saber el compositor y el número de operas que realizó:
select $A, count($B) from
composed-by($A : composer, $B : opera)?
Esta consulta realizaría la tabla completa de compositores y opera. Tras esto
juntaría a todos los compositores iguales y pondría en B el número de
apariciones en la consulta de dicho compositor.
Además Tolog nos permite organizar la información recuperada con la cláusula "ORDER BY" e incluir el límite de resultados con "LIMIT" y el offset con "OFFSET".
En el caso anterior es probable que nos interese que se nos muestre primero
los compositores más prolíficos, para ello realizaríamos la siguiente consulta:
select $A, count($B) from
composed-by($A : composer, $B : opera)
order by $B desc?
Si solo quisiéramos los 10 primeros haríamos:
select $A, count($B) from
composed-by($A : composer, $B : opera)
order by $B Desc limit 10?
Si solo quisiéramos los 5 primeros, pero a partir del 8:
select $A, count($B) from
composed-by($A : composer, $B : opera)
order by $B Desc limit 5 offset 8?
La cláusula "desc" indica que la ordenación sea descendente, si queremos ascendente utilizaremos "asc". En la cláusula order by pueden aparecer cualquier número de variables separadas por comas (",").
Hasta aquí hemos visto las partes básicas de Tolog, pero Tolog es más potente y tiene más características. Entre ellas:
Utilizar ocurrencias como predicados.
Recuperar las personas nacidas en el 24 de marzo de 1867.
date-of-birth($PERSON, "1867 (24 Mar)")?
La función lógica OR, esta se representa con la cláusula "|".
Ejemplo:Recuperar las operas cuya premier ha sido en Milan o en un teatro de Milan.
select $OPERA from
{premiere($OPERA : opera, milano :
place) |
premiere($OPERA : opera, $THEATRE :
place),
located-in($THEATRE : containee, milano : container) }?
La función lógica NOT, representada mediante la cláusula "not()":
Recuperar todas las personas que no han nacido en Italia.
instance-of($PERSON, person),
not(born-in($PLACE : place, $PERSON : person),
located-in($PLACE : containee, italy : container))?
* Importante: Si se hiciera la siguiente consulta devolvería una cantidad enorme
de topics, de todas las cosas que no tienen la relación born-in con Italia, no
solo personas sino teatros, operas,...
MAL-> not(born-in(milano : place, $A : person))?
Predicados de comparación, con las cláusulas "=, >, <, >=, <=". únicamente comparan Strings
Recuperar las operas cuya premier fue el 22-02-1870:
premiere-date($OPERA, $DATE),
$DATE = "1870 (22 Feb)"?
Tolog tiene una mayor potencia que se sale de este
minitutorial, para más información consultar el siguiente enlace:
http://www.ontopia.net/omnigator/docs/query/tutorial.html