A regra de ouro
er_fields é OU, nunca E.
[cpf, email] significa “acha por CPF ou por e-mail”. Não existe chave composta — cada campo é uma porta independente para a mesma entidade, e basta uma abrir.
ana@x.com por contato@empresa.com.br — uma caixa de setor — e todo mundo que a compartilha vira uma pessoa só.
E se eu quiser a combinação?
Não dá na ontologia. Fabrique a coluna composta na camada clean e declare ela:O teste de uma pergunta
Antes de colocar um campo emer_fields:
Se duas linhas tiverem o mesmo valor neste campo, elas são obrigatoriamente a mesma coisa no mundo real?Se a resposta for “não, só se o outro campo também bater”, esse campo não entra. Na dúvida, deixe de fora. Perder uma fusão é recuperável — basta declarar depois, e o lookup primário-primeiro garante que nada é re-chaveado. Colapsar mil entidades exige limpar o índice e reprocessar.
Os seis padrões
id_fieldé a chave que a fonte já tem e não muda — normalmenteexternal_id. Nunca um campo que o usuário edita.er_fieldsé só o que passa no teste acima.normalizersquando o nome do campo não entrega a regra.cpf,cnpj,email,phoneetelefonesão reconhecidos pelo nome; todo o resto cai emtext.- Fontes podem declarar listas diferentes — cada uma declara só o que tem. O que não pode é o conjunto ficar desconexo.
- Sem elo em comum, não force. Duas fontes sem identificador compartilhado não são uma entidade. Modele separado e resolva o dado na origem.
- Na aresta,
source:é a tabela que carrega a ligação — a que tem as duas colunas.
Armadilhas que já aconteceram
1. Campo repetido em er_fields
Um gerador de teste produziu 20 000 veículos com só 9 000 placas distintas, porque o lpad truncava a partir de um certo índice. Resultado: 11 000 veículos fundiram em silêncio, cada linha sobrescrevendo as propriedades da anterior, e o run reportou sucesso.
Hoje o worker avisa quando uma fonte colapsa acima de 20%, mas o modelo errado continua sendo de quem escreveu a ontologia.
2. Tratar er_fields como chave composta
Tentar casar reunião por “horário mais responsável”:
3. Mesmo label, duas fontes, nenhum er_fields
Passa na validação e parece certo. Mas sem identificador declarado cada fonte cunha no seu próprio namespace, e você fica com duas populações separadas usando o mesmo nome — o card da ontologia mostra Reunião (247) e metade é de um conector, metade de outro, sem nenhuma aresta entre elas.
Aconteceu de verdade com Meeting vindo de um CRM e de uma ferramenta de gravação de calls.
4. Identificador sem o normalizador que precisa
Uma coluna chamadadocumento guardando CPF cai no padrão text, que mantém a pontuação. As quatro fontes escrevem quatro strings diferentes, viram quatro linhas no índice e quatro entidades. A busca depois acha uma delas, então o sintoma parece bug de busca.
O worker avisa:
5. digits onde o identificador tem letra
O RG brasileiro pode terminar em X. Com digits:
alnum para qualquer identificador que possa conter letra: RG, placa Mercosul, chassi, códigos alfanuméricos de ERP.
6. Declarar er_fields só para “ficar pesquisável”
Se você só quer achar pelo valor do próprio id_field, isso já é de graça — e declarar tira o nó do caminho de ingestão mais rápido sem ganho nenhum. Ver Campos pesquisáveis.
7. Nó vindo de uma tabela de junção
Um nó precisa vir de uma tabela com uma linha por id. Se o nó sai de uma tabela de junção (a que liga cliente e produto, por exemplo), as cargas incrementais perdem arestas. Modele uma tabela de dimensão para o nó e deixe a tabela de junção só comosource: da aresta.
8. updated_at que não é a hora da gravação
A leitura incremental do grafo só vê linhas com updated_at novo. Uma linha inserida depois com uma data de negócio antiga fica invisível. Veja Carga incremental.
Checklist antes do apply
- cada campo de
er_fieldspassa no teste da pergunta — sozinho - cada campo de
er_fields(ou a coluna doidentifier_columns) está emproperties - as fontes do mesmo label formam uma cadeia conectada — nenhuma ilha
- campo com formato variável tem
normalizersdeclarado - identificador que pode ter letra usa
alnum, nãodigits - a tabela do
source:de cada aresta tem as duas colunas de ligação - cada nó vem de uma tabela com uma linha por id
- nenhum campo de visualização — se você escreveu
display_*, apague - depois de rodar: a queda no número de entidades é a que você esperava
Ontologias que não funcionam
O que a plataforma não pega: dois identificadores legítimos que por acaso colidem, e um campo que é único hoje e deixa de ser amanhã. Isso é modelagem, e só quem conhece o negócio decide.
Gerenciar a ontologia
Salvar, validar, ativar e reverter uma versão sem derrubar o grafo.
Conceitos da ontologia
Voltar ao começo da trilha.