Tabla de contenido

Hola de nuevo,
Parece que le he cogido justo a esto de escribir entradas. En esta ocasión voy a hablar un poco sobre la nueva modificación incluida en el blog: La sección de entradas relacionadas.

Todos hemos visto en muchas páginas una sección que relaciona distintas páginas dentro del sitio que estamos visitando. De este modo se aumenta el número de enlaces internos, y además ofrece a los visitantes una forma cómoda de navegar por el sitio visitando páginas que están relacionas de alguna forma con la actual.

Para realizar esta modificación he recurrido a las relaciones matemáticas y a sus propiedades. A partir de un conjunto, en este caso las entradas, es posible declarar relaciones binarias entre ellas con las propiedades deseadas. A continuación se verá todo esto con un poco más de detalle.

Relaciones matemáticas

Las relaciones permiten clasificar u ordenar los distintos elementos del conjunto sobre las que se declaran usando las características de dichos elementos. Aquí entran en juego muchos conceptos: pares ordenados, producto cartesiano, conjuntos, y un largo etcétera. No vamos a tratar todo esto en profundidad, pero sí se verán algunas partes con más detalle.

La expresión anterior puede leerse como: una relación R es el conjunto de pares ordenadores (a, b) pertenecientes al producto cartesiano del conjunto A con el conjunto B, cuyos elementos cumplen la propiedad P.

En este caso concreto, los conjuntos A y B son el mismos (todas las entradas del blog) y el resultado del producto cartesiano tendría n2 elementos, siendo n el número de entradas publicadas. Por otro lado, la propiedad P es binaria, y puede ser cualquier características que necesitemos: “es menor que”, “es padre de”, “extiende de”, …

La idea aquí es relacionar dos elementos a y b que pertenecen al conjunto A x B y que comparten la propiedad P. Esta relación se representa de este manera:

Aunque yo, por simplicidad, voy a usar esta otra notación menos matemática:

a → b

Lo que significa que a está relacionado con b.

Propiedades de las relaciones

No todas las relaciones son iguales. Además de la semántica, existen diferentes propiedades que afecta su comportamiento. Las relaciones puede ser:

Estas propiedades no son excluyentes, de modo que una relación puede cumplir las tres condiciones al mismo tiempo sin ningún tipo de problema.

Implementación de la solución

Una vez en materia podemos ver cómo he realizado la modificación para añadir el manejo de las relaciones entre entradas. En realidad, he desarrollado una función que trabaja de forma independiente al blog, de modo que la usaré también en el sitio web de mi otro proyecto, Project Creation FX.

En primero lugar es necesario un fichero de configuración. En este caso, un fichero json que guardará todas las relaciones y los conjuntos de pares de elementos, a los que llamaremos instancias. Las relaciones se declaran con un nombre, si es transitiva o no, el nivel de profundidad hasta el que se usa la transitividad, valor opcional que ahora se verá con más detalle; y su relación inversa si la hubiera.

Para el caso que nos ocupa únicamente tendremos una relación: “está relacionada con”. Esta relación se declara así:

El sistema desarrollado no da soporte a las relaciones reflexivas. Este tipo de relaciones no tienen sentido a la hora de relacionar distintos enlaces en una página web. No se me ocurre un escenario en el que sea necesario relacionar una entrada y generar un enlace a sí misma.

La propiedad simétrica se cumple siempre que la relación inversa sea la misma que la relación que se está declarando, tal y como ocurre en el ejemplo sobre el que trabajamos. Es decir, la relación relatedTo es simétrica porque su relación inversa es ella misma. Es fácil pensar en relaciones que no son simétricas y tienen como inversa una relación distinta: “es padre de”, por ejemplo, su inversa sería “es hijo de”.

Además, por definición es transitiva, ya que estamos indicándolo de ese modo. La funcionalidad del nivel de profundidad de la transitividad se puede ver fácilmente en el siguiente ejemplo:

En el caso de tener las siguientes instancias:

Usar la relación relatedTo sobre b con nivel de profundidad 2 nos ofrecería los siguientes resultados:

Junto a cada resultado puede verse el grado de relación que existe entre b y el otro elemento:

Puede observarse que no se ha podido relacionar b con f debido a que están demasiado lejos entre ellos y se ha limitado la búsqueda hasta el nivel 2 de profundidad. Este límite es necesario establecerlo porque la función que realiza la búsqueda transitiva es recursiva y necesita una condición de parada. El nivel de profundidad por defecto es 1, pero puede establecerse el que más convenga en cada momento.

Aquí entra una cuestión filosófica en juego, aunque en el ejemplo anterior matemáticamente se da que a → f, ¿están relacionados realmente estos dos elementos? o ¿están tan separados que realmente ya no existe una relación valiosa entre ellos? Dependerá de la situación en la que nos encontremos. Para el caso que nos ocupa aquí, un límite de nivel 1 de profundidad es suficiente.

Volviendo a la implementación, la declaración de las instancias se realiza de la siguiente manera:

Como se ve en el ejemplo, es posible realizar varias declaraciones usando una lista. Esto es equivalente a declarar cada instancia por separado y únicamente se hace para facilitar el mantenimiento de la estructura de datos.

Una vez declarado el fichero de relaciones, se pasa a compilar el blog y se genera automáticamente al final de cada entrada la sección de entradas relacionadas con tantos enlaces como corresponda.

Para ver la potencia de este sistema, en el ejemplo anterior se han declarado para la entrada md_2012_09_29 cuatro instancias. Estas instancias generan un total de 20 enlaces entre las cinco entradas que forman el grupo. Es decir, se ha declarado un 20% de los enlaces, el 80% restante se ha generado usando las relaciones inversas y transitivas.

El sistema desarrollado está en este caso casi desaprovechado y sé que puede dar mucho más de sí. Como ya he comentado, lo usaré en mi otro proyecto para generar las relaciones dentro de la wiki. En ese escenario, usando varias relaciones y con distintas configuraciones, será donde finalmente se vea la potencia real del sistema y todo lo que puede ofrecer.

Espero que os guste el contenido de esta entrada y os parezca interesante. Estoy atento a los comentarios por si alguien está interesado en algún detalle más acerca de cómo está implementado.

Hasta la próxima,
Lázarus Surazal

Entradas relacionadas

Perfil
prLázarus logo info
Carlos J. Peláez Rivas (Lázarus Surazal)
Graduado y Máster en Ingeniería Informática por la Universidad de Málaga. Actualmente trabajando como desarrollador de aplicaciones en Java usando Vaadin.
Apasionado de los videojuegos, la música y alguna que otra tecnología, siempre buscando cosas nuevas que aprender y hacer.
Más sobre mi...
Contacto
Notificaciones