Relaciones de un modelo semántico usando Semantic Link

En este artículo aprenderemos a visualizar las relaciones de un modelo semántico usando Semantic Link de Microsoft Fabric. Para conseguirlo utilizaremos un Notebook con lenguaje PySpark (Python) junto a un entorno con las librerías configuradas donde nos conectaremos a un modelo semántico y seremos capaces de visualizar las relaciones de forma gráfica, en formato tabla, ver su cardinalidad o visualizar porque campos se relacionan.

Especificaciones del entorno

  • Windows 11
  • Servicio de Microsoft Fabric

Requisitos previos

Antes de continuar comprueba que tienes configurados los siguientes requisitos previos:

Listar modelos semánticos

Preparando el Notebook

Crea un nuevo Notebook en tu área de trabajo y escoge el entorno que tenga configurada la Liberia semantic-link

Te puede interesar…

Si no quieres crear un entorno con las bibliotecas ejecuta este código en un primer bloque antes de continuar: %pip install semantic-link

Importar librerías

Crea un bloque e importa Fabric Semantic Link y todos los módulos que necesitamos para este ejercicio.

import sempy.fabric as fabric

from sempy.relationships import plot_relationship_metadata
from sempy.relationships import find_relationships
from sempy.fabric import list_relationship_violations

También importaremos pandas y cambiamos las opciones para mejorar la salida de resultados en pasos posteriores.

import pandas as pd
pd.set_option('display.max_colwidth', None)

Seleccionar área de trabajo

En un nuevo bloque escribe el siguiente código para listar todos los modelos semánticos del área que especifiques. Recuerda cambiar el ID del área de trabajo por el tuyo, después, ejecuta todos los bloques. Como resultado tendrás una lista de todos los modelos semánticos del área especificada mostrando su nombre, ID, cuando se creo y la fecha de ultima actualización.

#listar todos los modelos semánticos de un área de trabajo
_idArea = "1b05dc84-e477-4d6c-8410-38a2b2b5cbdd" #cambia aquí el ID de tu área de trabajo
_fabricModeloSemantico = fabric.list_datasets(_idArea)

# mostrar modelos semánticos
_fabricModeloSemantico

Trabajando con relaciones

Ahora que ya estamos conectados a un área de trabajo y hemos comprobado los modelos semánticos que tenemos, debemos seleccionar uno y empezar a trabajar con las medidas.

Listar relaciones en formato tabla

Creamos otro bloque para establecer en la variable _nombreModeloSemantico el nombre del modelo semántico a consultar y, además, le asignamos a la variable _fabricRelaciones el listado de las relaciones del modelo seleccionado usando la función list_relationships, por último, las mostramos.

# selecciona el modelo semántico y obtén las relaciones
_nombreModeloSemantico = "MiguelTroyano.com - Store Sales" #cambia aqui el nombre de tu modelo semantico
_fabricRelaciones = fabric.list_relationships(_nombreModeloSemantico)

# mostrar relaciones
_fabricRelaciones

Al ejecutar el código anterior observaras como nos muestra todas las relaciones del modelo semántico junto a su tabla, sus columnas, si y otra serie de propiedades.

También puedes visualizar las relaciones de las tablas de forma gráfica gracias a la función plot_relationship_metadata. Crea un bloque con este otro código:

# mostrar relaciones gráficamente
plot_relationship_metadata(_fabricRelaciones)

Borrado de relaciones

Ya hemos aprendido a ver las relaciones que tiene el modelo semántico, pero Semantic Link también es capaz de realizar más acciones. Imagina que la relación entre la tabla Store y District es incorrecta. Podrías eliminar en tu Notebook escribiendo el siguiente código e identificando previamente en que posición esta la relación visualizándolas en formato tabla como vimos anteriormente.

# visualiza las relaciones en formato tabla de nuevo para ver el índice de la relación
_fabricRelaciones

# elimina la relación
_fabricRelaciones.drop(index=[0], inplace=True)
# visualiza las relaciones de nuevo
_fabricRelaciones

Como puedes observar la relación con índice cero ha sido borrada. Esto solo aplica al Notebook actual y no guarda ningún cambio en el modelo semántico original.

Descubrimiento de relaciones

Semantic Link también es capaz de auto detectar relaciones entre las tablas con más o menos acierto… pero para poder conseguirlo primer debes cargar el nombre de las tablas y leerlas gracias a las funciones list_tables y read_tables

# leer y listar tablas
tablas = {table: fabric.read_table(_nombreModeloSemantico, table) for table \
    in fabric.list_tables(_nombreModeloSemantico)['Name']}

# mostrar resultado
tablas.keys()

Una vez leídas las tablas puedes ejecutar la función find_relationships para auto detectar relaciones con el siguiente código:

_relaciones_sugeridas = find_relationships(
    tablas,
    name_similarity_threshold=0.7,
    coverage_threshold=0.7,
    verbose=2
)

Para ver de una forma gráfica las relaciones que ha detectado ejecuta el siguiente código:

# mostrar relaciones sugeridas
_relaciones_sugeridas_grafico = plot_relationship_metadata(_relaciones_sugeridas)
_relaciones_sugeridas_grafico

O simplemente ejecuta este código para ver las relaciones sugeridas en formato tabla:

# mostrar relaciones sugeridas en tabla
_relaciones_sugeridas

Código completo

import sempy.fabric as fabric

from sempy.relationships import plot_relationship_metadata
from sempy.relationships import find_relationships
from sempy.fabric import list_relationship_violations

import pandas as pd
pd.set_option('display.max_colwidth', None)

#listar todos los modelos semánticos de un área de trabajo
_idArea = "1b05dc84-e477-4d6c-8410-38a2b2b5cbdd" #cambia aquí el ID de tu área de trabajo
_fabricModeloSemantico = fabric.list_datasets(_idArea)

# mostrar modelos semánticos
_fabricModeloSemantico

# selecciona el modelo semántico y obtén las relaciones
_nombreModeloSemantico = "MiguelTroyano.com - Store Sales" #cambia aqui el nombre de tu modelo semantico
_fabricRelaciones = fabric.list_relationships(_nombreModeloSemantico)

# mostrar relaciones
_fabricRelaciones

# mostrar relaciones gráficamente
plot_relationship_metadata(_fabricRelaciones)

# visualiza las relaciones en formato tabla de nuevo para ver el índice de la relación
_fabricRelaciones

# elimina la relación
_fabricRelaciones.drop(index=[0], inplace=True)

# visualiza las relaciones de nuevo
_fabricRelaciones

# leer y listar tablas
tablas = {table: fabric.read_table(_nombreModeloSemantico, table) for table \
    in fabric.list_tables(_nombreModeloSemantico)['Name']}

# mostrar resultado
tablas.keys()

_relaciones_sugeridas = find_relationships(
    tablas,
    name_similarity_threshold=0.7,
    coverage_threshold=0.7,
    verbose=2
)

# mostrar relaciones sugeridas en gráfico
_relaciones_sugeridas_grafico = plot_relationship_metadata(_relaciones_sugeridas)
_relaciones_sugeridas_grafico

# mostrar relaciones sugeridas en tabla
_relaciones_sugeridas

Escribir un comentario

Este sitio está protegido por reCAPTCHA y se aplican la política de privacidad y los términos de servicio de Google.