A camada semântica é um componente essencial na integração de sistemas. Ela utiliza os dados normalizados pela camada sintática e os aproxima de algo que tenha mais significado ao domínio da empresa. A camada semântica, literalmente, enriquece o significado dos dados estabelecendo novas classes e explicitando relações relevantes. Ela aproxima informações puramente técnicas dos princípios do negócio, facilitando o entendimento pelos times de negócio.
Contexto
Em uma arquitetura de software, diferentes sistemas podem utilizar terminologias distintas para descrever os mesmos conceitos, o que leva a dificuldades de entendimento. Após os dados serem processados pela camada sintática, a camada semântica entra em ação para garantir que esses dados façam sentido no contexto do negócio. A camada semântica interpreta e adapta os dados, resolvendo inconsistências e ambiguidades, garantindo uniformidade de termos e uma comunicação eficiente entre sistemas que falam “idiomas” diferentes.
A camada semântica é particularmente relevante quando múltiplas APIs, como SAP para ERP e Salesforce para CRM, precisam ser integradas e seus dados convertidos para um formato compreensível e útil dentro da organização.
Aplicabilidade
A camada semântica é aplicada em cenários onde a simples normalização de dados não é suficiente. Ela é utilizada para:
- Traduzir modelos da camada sintática para o domínio da empresa.
- Simplificar e formalizar relações entre dados.
- Consolidar representações para conceitos como nome e endereço.
- Filtrar e adaptar os dados para garantir que apenas as informações relevantes e precisas sejam utilizadas.
Exemplos Práticos
Integração de Dados de um Site em WordPress para a Ontologia da Empresa
Na EximiaCo, utilizamos o WordPress como plataforma tecnológica para criar um site que representa a ontologia da empresa. Essa ontologia, por sua vez, opera como a “Fonte da Verdade” para diversas de nossas operações.
Transformação de Tipos de Postagens
Optamos por criar diferentes tipos de postagens para representar as diversas classes da ontologia. Assim, enquanto na camada sintática faz sentido carregar “tipos de postagens”, na camada semântica, filtramos a lista de tipos de postagens e as reclassificamos como classes:
class Class(BaseModel):
slug: str
name: str
description: str
class Ontology(SemanticModel):
@property
def classes(self) -> List[Class]:
post_types = self.wp.fetch_post_types()
pattern = re.compile(r'^(?:wp_|nav_)|cases-|feedzy_|jet-engine|assets|classes|page|post|links|media|attachment|visibility_preset|_links$|-links$')
return [
Class(slug=post_type.slug, name=post_type.name, description=post_type.description)
for post_type in post_types
if not pattern.search(post_type.slug)
]
Transformação de Usuários em Autores
A mesma coisa acontece quando consideramos a lista de usuários no WordPress (nível sintático). No nível semântico, a lista de usuários corresponde à lista de autores da ontologia:
class Author(BaseModel):
id: int
name: str
profile_url: HttpUrl
class Ontology(SemanticModel):
@property
def authors(self) -> Dict[int, Author]:
users = self.wp.fetch_users()
return {user.id: Author(id=user.id, name=user.name, profile_url=user.link) for user in users}
Transformação de Posts em Entradas de Ontologia
Os posts do WordPress são transformados em entradas da ontologia, que possuem um significado mais próximo do domínio da empresa:
class Entry(BaseModel):
id: int
title: str
link: HttpUrl
class_name: str
author_id: int
author_name: str
creation_date: datetime
creation_week: str
@staticmethod
def from_wordpress_post(post: Post, class_name: str, author: User) -> 'Entry':
return Entry(
id=post.id,
title=post.title.rendered,
link=post.link,
class_name=class_name,
author_id=author.id,
author_name=author.name,
creation_date=post.date_gmt,
creation_week=post.creation_week,
)
Integração de Dados de um Site de Insights em WordPress
A EximiaCo também utiliza o WordPress como base tecnológica para o site onde compartilha insights para o negócio. Aqui, no lugar de “Entries”, temos “Insights”, e no lugar de “Authors” temos “Publishers”.
Transformação de Posts em Insights
Os posts do WordPress são transformados em insights, que possuem um significado mais próximo do contexto de compartilhamento de conhecimento:
class Insight(BaseModel):
id: int
title: str
link: HttpUrl
publisher_id: int
publisher_name: str
creation_date: datetime
creation_week: str
@staticmethod
def from_wordpress_post(post: Post, author: User) -> 'Insight':
return Insight(
id=post.id,
title=post.title.rendered,
link=post.link,
publisher_id=author.id,
publisher_name=author.name,
creation_date=post.date_gmt,
creation_week=post.creation_week,
)
class Insights(SemanticModel):
def __init__(self):
self.wp = WordPress('https://insights.eximia.co')
@property
def publishers(self) -> Dict[int, User]:
return self.wp.fetch_users()
def fetch_insights(self, after: datetime, before: datetime) -> List[Insight]:
authors = self.publishers
posts = self.wp.fetch_posts('posts', after, before)
return [
Insight.from_wordpress_post(post, authors[post.author])
for post in posts
]
Repare que são duas “semânticas” para uma única “visão sintática”. Isso demonstra como a camada semântica adapta os dados para diferentes contextos dentro da mesma infraestrutura tecnológica.
Experiência Uniforme para o Consumidor
A camada semântica garante que, independentemente de como os dados são recebidos na camada sintática, eles serão transformados em informações significativas e consistentes para o consumidor final. Isso permite que os dados façam sentido no contexto do domínio da empresa e sejam utilizados de forma eficiente.
Analogias e Metáforas
A camada semântica pode ser comparada a um editor que ajusta um texto traduzido para que ele faça sentido no contexto cultural do leitor. Enquanto a camada sintática traduz palavra por palavra, a camada semântica assegura que a tradução final esteja correta e seja significativa.
Importância
A camada semântica é vital para garantir que os dados normalizados façam sentido no contexto específico da empresa. Sem ela, os dados podem ser inconsistentes, incompletos ou irrelevantes para as necessidades do negócio. Ela proporciona uma interpretação precisa dos dados, garantindo que a informação utilizada pela organização esteja alinhada com seus objetivos e contexto.
Limitações e Críticas
A camada semântica não é uma substituta para a camada de domínio porque, principalmente, fica restrita a um sistema. A camada de domínio, por sua vez, irá estabelecer relações entre a “semântica” dos diversos sistemas, gerando um modelo geral consistente. As validações semânticas ficam restritas ao contexto de aplicação. De muitas formas, cada implementação da camada semântica opera como “contexto delimitado” do domínio.
Comparação com Conceitos Similares
- Camada Sintática: A camada sintática se preocupa com a forma e estrutura dos dados, enquanto a camada semântica foca no significado e na interpretação dos dados.
- Camada de Domínio: Enquanto a camada semântica traduz dados para um único sistema, a camada de domínio estabelece relações entre a semântica de diversos sistemas, gerando um modelo geral consistente.
- Mappers de Dados: Ferramentas como ORMs (Object-Relational Mappers) lidam com a transformação de dados em um contexto de banco de dados, enquanto a camada semântica trata da adaptação de dados no contexto de APIs e sistemas externos.
Perguntas Frequentes (FAQs)
A camada semântica realiza validação dos dados?
Sim, a camada semântica valida os dados dentro do contexto do domínio da empresa, garantindo que eles sejam consistentes e relevantes.
Como a camada semântica lida com inconsistências nos dados?
A camada semântica aplica regras de negócio e lógica de validação para resolver inconsistências e adaptar os dados ao contexto da empresa.
A camada semântica substitui a camada sintática?
Não, a camada semântica complementa a camada sintática, utilizando os dados normalizados e traduzindo-os para o domínio específico da empresa.
Recursos Adicionais
- Livro: “Domain-Driven Design: Tackling Complexity in the Heart of Software” por Eric Evans – para entender a importância da camada semântica no contexto de DDD.