martes, 28 de septiembre de 2010

Agnitio3: Paradigma del conocimiento basado en cubos

Safe Creative #1009287453874




Introducción

El presente documento es un ensayo sobre un paradigma de conocimiento, una reflexión sobre cómo organizar la información de una forma eficiente, y sobre la cual se pueden generar consultas complejas y obtener la información en diferentes vistas.

La base es un cubo de conocimiento, el cual eleva las posibilidades que actualmente tenemos limitadas con el paradigma del 2D, en base a tablas, o matrices de columnas y filas, paradigma que se puede complementar con este paradigma 3D.

Esta paradigma organiza eficientemente la información sobre un esquema muy organizado y dimensional, aunque complejo a medida que se añaden nuevos conceptos (ver Concepto avanzados), y que pueden tratarse mediante un software especializado.

Agnitio3 es el nombre con el que he bautizado este paradigma, el cual, de base, no es nuevo, pero al que he añadido conceptos nuevos y avanzados. Agnitio es la traducción al latín de Conocimiento. El número 3 representa el cubo en matemáticas. Agnitio3 = Conocimiento al cubo.

El presente documento no está cerrado, y puede sufrir modificaciones constantes, a fin de corregir erratas o añadir nuevos conceptos e ideas.


Versiones

28/09/2010. Por Rafael Hernampérez Martín. Primera versión.


Conceptos básicos

3DtiCube es un sistema de organización de la información basada en cubos de conocimiento, con gran capacidad de configuración, personalización, versatilidad, potencia de consulta y generación de informes y gráficas.

Un cubo de conocimiento tiene tres ejes o dimensiones, cada uno de los cuales está fragmentado en coordenadas o elementos. Cada elemento se relaciona con otros elementos de otras dimensiones, y la confluencia de tres elementos diferentes de cada una de las dimensiones, dará como resultado un punto común, al que llamaremos nexo o conocimiento, pues contiene un valor compartido y común a los tres elementos.

Imaginemos un cuadro de mando básico que mide el nivel de cada servicio de una compañía, comparando cada servicio en cada producto. Este cuadro de mando se realiza cada semana, y sobre el mismo se realiza un seguimiento puntual. Aquí se identifican las 3 dimensiones necesarias para un cubo de conocimiento:



  • Servicio:


    • Servicio 1


    • …


    • Servicio n


  • Producto:


    • Producto 1


    • …


    • Producto n


  • Período:


    • Semana 1


    • …


    • Semana n

El conocimiento se obtendría de la confluencia de tres elementos, cada uno de los cuales en cada una de las dimensiones. Por ejemplo, el nivel del servicio de atención al cliente, del producto “Ordenador portátil XYZ”, en la semana 5.

Organizar la información en tres dimensiones nos permite girar el cubo y extraer la información en varias vistas 2D a partir de un determinado elemento de una de las dimensiones:

Vista 1

Servicio “XXX” (Se extrae sobre un único Servicio)


Semana 1
...
Semana n
Producto 1
99.99
99.99
99.99
...
99.99
99.99
99.99
Producto n
99.99
99.99
99.99



Vista 2

Servicio “XXX” (Se extrae sobre un único Servicio)


Producto 1
...
Producto n
Semana 1
99.99
99.99
99.99
...
99.99
99.99
99.99
Semana n
99.99
99.99
99.99

Vista 3

Producto “XXX” (Se extrae sobre un único producto)


Servicio 1
...
Servicio n
Semana 1
99.99
99.99
99.99
...
99.99
99.99
99.99
Semana n
99.99
99.99
99.99


Vista 4

Producto “XXX” (Se extrae sobre un único producto)


Semana 1
...
Semana n
Servicio 1
99.99
99.99
99.99
...
99.99
99.99
99.99
Servicio n
99.99
99.99
99.99


Vista 5

Semana n (Se extrae sobre una única semana)


Servicio 1
...
Servicio n
Producto 1
99.99
99.99
99.99
...
99.99
99.99
99.99
Producto n
99.99
99.99
99.99


Vista 6

Semana n (Se extrae sobre una única semana)


Producto 1
...
Producto n
Servicio 1
99.99
99.99
99.99
...
99.99
99.99
99.99
Servicio n
99.99
99.99
99.99

Estos conceptos básicos abarcan conocimientos singulares, es decir, un valor único en cada nexo.


Conceptos avanzados

Sobre este paradigma de organización informativa, se pueden agregar algunos conceptos avanzados para aumentar sus prestaciones y funcionalidades.


Conocimiento plural

El nexo o conocimiento puede ser plural. Es decir, puede contener tantos valores como se desee y del tipo que se desee, y no solamente uno. Este concepto nos aporta más riqueza de conocimiento (una dimensión para conocimiento), y puede servir para agregar un pequeño repositorio o base de datos en nuestro cubo. En el ejemplo anterior, nuestro cubo únicamente contemplaba niveles de servicio (generalmente expresado en % de eficiencia). Si se desea, por ejemplo, representar beneficios, pérdidas, % de penalización por incidencias, etc.), con el paradigma del cubo básico sería necesario un cubo por cada tipo de dato, aunque utilicen las mismas dimensiones. Sin embargo, con el conocimiento en plural, utilizaríamos un único cubo para almacenar en el mismo nexo todos estos valores, y extraer diferentes vistas, o extraer los diferentes valores en la misma consulta.

Los valores se podrían almacenar en formato documento, libre de esquema, con claves y valores, pudiendo almacenar también arrays de valores y documentos anidados:

{
“clave1”: valor1,
“clave2”: “valor2,
“clave3”: datetime(2010,09,28,13,03),
“clave4”: [valor1, valor2, valor3],
“clave5”: { ... }
}

Una aplicación práctica sería, por ejemplo, crear un cubo cuyas dimensiones fueran las áreas de la empresa (sistemas, seguridad, CPD, Desarrollo, calidad, etc.), un tipo de conocimiento (Java, .NET, Linux, etc.) y un nivel o uso del conocimiento (principiante, experto, usuario, etc.). El nexo podría contener manuales, tutoriales, documentos, enlaces a foros, enlaces a herramientas productivas (gestores de proyectos, agendas, incidencias...), etc.


Agrupación de elementos

Un cubo puede crecer y hacerse complejo, por lo que es preferible clasificar los elementos de una dimensión en categorías. Por ejemplo, el catálogo de productos puede llegar a ser muy extenso, así como también la dimensión de las semanas. Clasificar los productos por gama (ordenadores de sobremesa, ordenadores portátiles, accesorios informáticos, etc.), y las semanas por trimestres aporta claridad y gana en eficiencia y en productividad. Esta clasificación permitiría la agrupación de la información, permitiendo contraer o expandir los elementos agrupados, así como también realizar cálculos (en caso de valores numéricos) de dicha agrupación: sumatorio, media aritmética, valor mínimo, valor máximo, conteo, etc.

Sería muy interesante que el cubo calculase automáticamente el total de ventas de un determinado producto durante el primer trimestre de 2010. O bien que calculase la media del nivel de servicio de soporte de toda la gama de ordenadores de sobremesa durante la semana 5. Se podrían combinar agrupaciones en todas las dimensiones del cubo.


Referenciación de cubos

Funcionalmente podrían definirse infinitos niveles o jerarquías de agrupación, pero sería mucho más claro no excederse de dos o tres niveles. Si se requiriese de más detalle, podría ser más conveniente replicar un cubo categorizado en un nuevo cubo, dejando en una dimensión sencilla la agrupación de alto nivel, y empezar a categorizar en bajo nivel. Esta réplica sería una referencia al cubo original. Los cambios que surgieran en el cubo original, se trasladarían automáticamente al cubo que toma la referencia.

Podemos crear un nuevo cubo referenciado del cubo anterior agrupado. Sobre este cubo, podríamos ahora categorizar las gamas de productos por líneas de productos (por ejemplo: ordenadores agruparía ordenadores de sobremesa, portátiles, Tablets, Netbooks, etc...), y los períodos podrían ahora categorizarse por años.


Referencias entre elementos de distintos cubos

Pueden definirse elementos referenciando a otros elementos en otras dimensiones y en otros cubos, e incluso referenciar a un elemento agrupado. Pueden crearse cubos mixtos, con dimensiones que contengan elementos propios y elementos referenciados a otros elementos de diferentes cubos. Las referencias son efectivas en cubos cuyos elementos y dimensiones coinciden, pues los conocimientos tienen esta dependencia (recordemos que un conocimiento o nexo es la confluencia de tres elementos, uno por cada dimensión).


Conocimiento elevado al cubo de...

En entidades demasiado complejas, en lugar de conocimientos singulares o plurales, puede ser interesante utilizar como conocimiento un cubo de conocimiento, creando un anidamiento y exponenciando las posibilidades de información. El primer cubo sería un cubo genérico, y sus nexos contendrían los cubos del conocimiento, que pueden ser distintos entre los diferentes nexos del cubo genérico o principal.

El nivel de anidamiento podría ser infinito, aunque lo recomendable sería simplificar.


Conocimiento mixto

El conocimiento podría tratar un cubo de conocimiento como un tipo de dato más. De esta manera, un conocimiento podría contener un documento clave-valor, con diferentes valores estándar, y también podría incluir uno o varios cubos de conocimiento.




Safe Creative #1009287453874

Primeros pasos con Python y MongoDB

Una de las mejores características de MongoDB es la multitud de drivers existentes para casi cualquier lenguaje de programación (ver Sección Drivers). Para los que amamos Python, tenemos un driver llamado pymongo, y que está soportado por 10gen, la empresa creadora de MongoDB. El site oficial de este driver lo encontramos en: http://api.mongodb.org/python/1.8.1%2B/index.html

Utilizar Python junto a MongoDB es muy sencillo, pues su sintaxis es muy similar a la de la consola mongo.

Instalación
La instalación de pymongo es sencilla. En Linux, procederemos a ejecutar el siguiente comando:

$ easy_install pymongo

O bien, descargamos el código fuente y lo instalamos desde la consola de Python:

$ git clone git://github.com/mongodb/mongo-python-driver.git pymongo
$ cd pymongo/
$ python setup.py install


Abrir conexión
La conexión se realiza de la siguiente manera:

>>> from pymongo import Connection
>>> conn = Connection() # Conexion local por defecto
>>> conn = Connection('miServidor', 30500) # Conexion remota a puerto 30500


Usar base de datos
Para obtener un objeto que referencia a la base de datos:

>>> db = conn.miBBDD # metodo 1
>>> db = conn['miBBDD'] # metodo 2



Usar una colección
Para obtener la colección con la que trabajar:

>>> coll = db.miColeccion # metodo 1
>>> coll = db['miColeccion'] # metodo 2



Documentos
Los documentos se mapean en Python como un diccionario:

>>> noticia = {"autor": "Rafael Hernamperez",
...   "cuerpo": "Python y MongoDB",
...   "etiquetas": ["Tutorial","Python","MongoDB"]}


Algunos tipos de datos especiales requieren de alguna librería específica, como datetime:

>>> import datetime
>>> noticia = {"autor": "Rafael Hernamperez",
...   "cuerpo": "Python y MongoDB",
...   "etiquetas": ["Tutorial","Python","MongoDB"],
...   "fecha": datetime.datetime.utcnow()}



Insertar documentos
Para insertar un documento:

>>> coll = db.noticias # Coleccion "noticias"
>>> coll.insert(noticia)



Recuperar un documento
Para recuperar un único documento simple (el primero):

>>> coll.find_one({"autor": "Rafael Hernamperez"})


Recuperar varios documentos
Para recuperar todos los documentos de una colección:

>>> for noticia in coll.find():
...    print noticia


Para recuperar todos los documentos (noticias, en este caso) de un autor concreto:

>>> for noticia in coll.find({"autor": "Rafael Hernamperez"})
...    print noticia



Contar documentos
Para contar todos los documentos de una colección:

>>> coll.count()

Para contar todos los documentos de un autor concreto:

>>> coll.find({"autor": "Rafael Hernamperez"}).count()


Consultas de rango
Recupera un determinado rango de documentos, delimitados por condiciones. En este caso, recupera aquellas noticias anteriores a una determinada fecha. El resultado se ordenará por autor:

>>> fecha = datetime.datetime(2010, 9, 28, 0, 0) # 2010/09/38 00:00h
... for noticia in coll.find({"fecha": {"$lt":fecha}}).sort(autor):
...    print noticia



Indexación
Para indexar la colección "noticias", por fecha (de la más reciente a la más antigua) y por autor (en orden alfabético):

>>> from pymongo import ASCENDING, DESCENDING
>>> coll.create_index([("fecha", DESCENDING), ("autor", ASCENDING)])

sábado, 25 de septiembre de 2010

Ctrl+alt+Supr

Divertida canción del Reno Renardo, que seguro te hará recordar buenos momentos y te hará sacar alguna risa. Recomiendo subir el volumen (primera barra en la parte superior):