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 creó y la fecha de última 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 observarás como nos muestra todas las relaciones del modelo semántico junto a su tabla, sus columnas, sí 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 está 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)
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