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
Lenguaje del código: JavaScript (javascript)
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)
Lenguaje del código: JavaScript (javascript)
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
Lenguaje del código: PHP (php)
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
Lenguaje del código: PHP (php)
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)
Lenguaje del código: PHP (php)
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)
Lenguaje del código: PHP (php)
# visualiza las relaciones de nuevo
_fabricRelaciones
Lenguaje del código: PHP (php)
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()
Lenguaje del código: PHP (php)
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
Lenguaje del código: PHP (php)
O simplemente ejecuta este código para ver las relaciones sugeridas en formato tabla:
# mostrar relaciones sugeridas en tabla
_relaciones_sugeridas
Lenguaje del código: PHP (php)
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
Lenguaje del código: PHP (php)