1. Bases de datos relacionales

1.14. Ejemplo práctico: gestión del catálogo de genes humanos

Para demostrar cómo extraer conocimiento útil de una base de datos relacional, os proponemos analizar con MySQL el contenido de un catálogo de genes humanos. Un gen es un fragmento de ADN ubicado en el genoma que contiene la información precisa para sintetizar una molécula de ARN. En los organismos eucariotas, un gen está constituido por una sucesión de fragmentos útiles denominados exones. En una proporción significativa de los genes humanos existen varias combinaciones alternativas de exones, dando lugar a distintas formas alternativas de un mismo gen, denominadas transcritos alternativos. Para codificar la información relativa a la localización de los genes en el genoma es frecuente utilizar ficheros de texto tabulado. Cada línea de estos ficheros contiene los valores de los atributos que caracterizan a un transcrito de un determinado gen. Básicamente, un transcrito de un gen posee una localización concreta, identificada por un cromosoma, una posición inicial/final y una dirección de lectura. Otras características que podemos recuperar sobre un transcrito son su código, el nombre del gen, el número de exones o sus coordenadas exactas.

El navegador genómico de UCSC representa gráficamente los diferentes tipos de anotaciones existentes sobre el genoma humano en forma de cientos de pistas. Para administrar eficientemente este elevado volumen de información, una copia del SGBD MySQL está funcionando de forma transparente a los miles de usuarios que cada día visitan este servidor. De este modo, en el caso de que deseemos reproducir una pista en nuestro ordenador, disponemos en la sección de descargas de un fichero SQL para ser ejecutado con el comando source y un fichero de texto con el conjunto de datos que deben importarse con la instrucción LOAD DATA. En este ejercicio vamos a utilizar la anotación de los genes humanos distribuida por el consorcio RefSeq para el genoma humano. Este formato es común a todas las especies suministradas por el navegador.

Vamos a proceder ahora a descargar los dos ficheros asociados a la pista refGene, que contiene el catálogo de genes humanos anotados por el consorcio RefSeq, en su versión hg38.

Para ello, debemos utilizar el comando wget para transferir ambos ficheros a nuestro terminal.

wget http://hgdownload.soe.ucsc.edu/goldenPath/hg38/database/refGene.sql

wget http://hgdownload.soe.ucsc.edu/goldenPath/hg38/database/refGene.txt.gz

Mostramos a continuación el contenido del fichero refGene.sql que realiza la creación de la tabla refGene. Los atributos que consultaremos con mayor frecuencia serán (figura 54): name (código del transcrito), chrom (cromosoma), strand (hebra), txStart y txEnd (coordenadas de inicio y final), exonCount (número de exones) y name2 (nombre del gen).

Es importante no confundir los campos de name y name2: un gen puede tener varios transcritos, pero un transcrito únicamente pertenece a un gen.

Figura 54. Atributos de los transcritos anotados por el consorcio RefSeq.
Fuente: elaboración propia.

Pasaremos ahora a visualizar con el terminal el segundo fichero refGene.txt. Este archivo contiene los datos del catálogo completo de genes anotados en el genoma humano. Debemos cargar esta información en nuestra base de datos una vez esté creada la tabla refGene. En el contexto de este ejercicio, cada registro contiene información sobre un transcrito de un determinado gen. En el caso de que un gen posea varios transcritos, cada uno se codifica en registros separados (cada uno con su propio código y sus correspondientes coordenadas).

En primer lugar, debemos descomprimir el fichero con el comando gzip.

Figura 55. El catálogo refGene.txt de genes humanos.
Fuente: elaboración propia.

Una vez dentro del intérprete de MySQL, indicaremos que vamos a trabajar dentro de nuestra base de datos catalogo.

Ejecutaremos, posteriormente, el fichero refGene.sql con el comando source para crear la tabla refGene.

Para verificar que la instrucción anterior ha funcionado correctamente, podemos ver el listado de atributos de la tabla refGene con el comando DESCRIBE:

Figura 56. Creación de la tabla refGene.
Fuente: elaboración propia.

El segundo paso consiste en poblar la tabla con las anotaciones de los genes humanos que hemos descargado dentro del fichero refGene.txt. Usando el comando LOAD DATA podemos volcar todo el contenido en la tabla refGene:

Figura 57. Poblar la tabla refGene.
Fuente: elaboración propia.

Nos encontramos en condiciones de comenzar a interrogar a la base de datos. Recordemos, nuevamente, que cada registro de la tabla refGene alberga la información asociada al transcrito de un gen en particular. Igualmente, es importante tener en cuenta que una elevada fracción de los genes humanos posee dos o más transcritos alternativos. Nuestra misión, a continuación, es mostrar el enorme potencial de las consultas de SQL a la hora de extraer nuevo conocimiento biológico de los datos almacenados en las tablas de nuestra base de datos.

Comenzaremos mostrando los primeros registros de nuestra tabla, incluyendo únicamente varios de sus atributos para favorecer la legibilidad de los valores de los registros por pantalla:

Figura 58. Muestra del contenido de la tabla refGene.
Fuente: elaboración propia.

Dado que cada registro contiene la información de un transcrito, el número de transcritos conocidos en el genoma humano coincidirá con el número de registros almacenados en la tabla refGene. Este contaje es sencillo:

Figura 59. Contar los transcritos de la tabla refGene.
Fuente: elaboración propia.

También podemos contar fácilmente el número total de genes codificados en el genoma humano. Si un gen posee varios transcritos alternativos, entonces encontraremos varios registros en nuestro catálogo que poseen un valor distinto del atributo name, pero que comparten el mismo valor para el atributo name2. Por tanto, empleando la cláusula DISTINCT sobre este último atributo, contaremos una única vez cada gen de nuestra tabla, aunque posea varias formas alternativas:

Figura 60. Contar los genes de la tabla refGene.
Fuente: elaboración propia.

Si agrupamos los registros de la tabla por el atributo name2, podemos elaborar un inventario del número de transcritos alternativos anotados para cada gen.

Figura 61. Contar el número de transcritos de cada gen de la tabla refGene.
Fuente: elaboración propia.

Podemos obtener resultados interesantes aplicando la cláusula WHERE sobre los atributos de cada registro. Por ejemplo, imaginemos que deseamos conocer el número de transcritos ubicados en cada hebra de la molécula de ADN:

Figura 62. Contar transcritos en una hebra de ADN.
Fuente: elaboración propia.

También podemos contar el número de transcritos localizados en un cromosoma:

Figura 63. Contar los transcritos de un cromosoma.
Fuente: elaboración propia.

Nuevamente, jugando con el atributo name2 podemos contar el número de genes codificados en el mismo cromosoma:

Figura 64. Contar los genes de un cromosoma.
Fuente: elaboración propia.

O identificar cuáles son los transcritos que poseen un mayor número de exones:

Figura 65. Recuperar los transcritos con mayor número de exones.
Fuente: elaboración propia.

También podemos seleccionar aquellos transcritos que poseen un único exón:

Figura 66. Recuperar los transcritos con un único exón.
Fuente: elaboración propia.

Es posible calcular el número de exones, en promedio, por cada transcrito:

Figura 67. Calcular el número de exones en promedio por cada transcrito.
Fuente: elaboración propia.

Y la longitud en promedio de los transcritos de los genes humanos:

Figura 68. Calcular la longitud en promedio de los genes.
Fuente: elaboración propia.

Finalmente, vamos a integrar en este análisis el genoma de ratón doméstico. Descargamos los ficheros refGene.sql y refGene.txt de esta especie en su versión mm9.

Para evitar sobrescribir las anotaciones humanas, debemos grabar ambos ficheros con un nombre diferente (por ejemplo, refGene_mouse.sql y refGene_mouse.txt). Posteriormente, es necesario editar el contenido del fichero SQL para modificar el nombre de la tabla, por la misma razón (figura 69).

Tras estas modificaciones, ya estamos en condiciones de lanzar la creación de la nueva tabla con el comando source y su repoblación con los datos relativos al genoma del ratón con el comando LOAD DATA.

Figura 69. Incorporar los genes de ratón en nuestra base de datos.
Fuente: elaboración propia.

Comprobamos que los registros almacenados en la nueva tabla son correctos:

Figura 70. Visualizar los primeros transcritos del genoma del ratón doméstico.
Fuente: elaboración propia.

Ahora, si seleccionamos aquellos registros de las dos tablas que pertenecen al mismo gen en ambas especies, podemos construir un catálogo de genes homólogos.

Podemos llevar a cabo esta asociación porque SQL no distingue entre mayúsculas o minúsculas a la hora de comparar la columna name2.

Figura 71. Listado de genes comunes entre el genoma humano y el genoma de ratón.
Fuente: elaboración propia.