Pular para o conteĆŗdo principal

Semantic Models for Trustworthy Systems: A Hybrid Intelligence Augmentation Program - G. Guizzardi

Apresentação Giancarlo na PUC-Rio

https://www.youtube.com/watch?v=UehUTBN2Nyo

KG foram criados em Twente em 1982.


Eu comento com quatro observaƧƵes, que acho que nĆ£o sĆ£o nada controversas. A primeira Ć© a seguinte: todo sistema de software representa uma porção da realidade e embute uma determinada teoria sobre o mundo. Todo sistema de software Ć© inevitĆ”vel. Qualquer estrutura de informação faz isso. Qualquer coisa que nĆ£o tenha só semĆ¢ntica formal — semĆ¢ntica formal Ć© um jogo, nĆ©, que vai mapear um pedaƧo de matemĆ”tica para outro pedaƧo de matemĆ”tica — precisa fazer um compromisso ontológico. Eu estou usando "semĆ¢ntica" aqui no sentido que todo mundo fora da computação e da lógica usa, de mapeamento de uma conceituação compartilhada. Qualquer coisa que tenha isso Ć© chamada tradicionalmente de real world semantics (semĆ¢ntica do mundo real).

Por exemplo, se vocĆŖ pega um mapa de metrĆ“ de AmsterdĆ£, para essa coisa fazer sentido, o significado por trĆ”s dela tem uma determinada ontologia — um conjunto, uma teoria sobre uma visĆ£o de mundo na qual existem coisas chamadas linhas, compostas de estaƧƵes ordenadas de uma determinada forma, interagindo com outras linhas, com propriedades como direção, e assim por diante. Essa visĆ£o de mundo faz a coisa fazer sentido e adquirir significado. 

O mais mundano dos bancos de dados tambĆ©m faz um compromisso ontológico. Por exemplo, esse banco de dados sobre transplantes acredita na existĆŖncia de coisas como pessoas — algumas vivas, outras mortas — que seguem algumas regras, como "toda pessoa tem que estar viva ou morta", e pessoas que faleceram nĆ£o voltam Ć  vida. Existem coisas como transplantes, que sĆ£o entidades, e para elas existirem, outras coisas precisam existir, como pelo menos um cirurgiĆ£o, um doador e um receptor. Essas entidades tĆŖm uma teoria sobre o mundo e o banco de dados acredita na existĆŖncia delas, com suas propriedades, suas relaƧƵes, seguindo determinadas regras.

Eu gosto de uma frase do Donald Knuth que diz que "programar é a atividade de dizer a um outro ser humano o que você quer que o computador faça, não é falar para o computador o que você quer que ele faça". Ou seja, de outra forma, se você estiver escrevendo código em Python e tiver variÔveis do tipo cliente, fornecedor, ordem de pedido, valor, você estÔ fazendo um compromisso ontológico sobre a existência dessas coisas e suas relações. Essa ideia é bem importante na computação.

Por exemplo, nesse artigo de 1967, um cara chamado George Millie — criador de uma coisa chamada Milly Automata — ele foi tambĆ©m orientador de doutorado de Peter Chen, o criador das entidades de relacionamento. Nesse artigo, Millie fala meio que reclamando que as pessoas estavam muito focadas na manipulação de dados e nos aspectos formais das coisas. Ele disse: "Problema ótimo, isso tudo Ć© interessante, mas o problema primordial Ć© entender a relação entre os sĆ­mbolos e o mundo real". Ele dizia que "dados sĆ£o fragmentos de uma teoria do mundo" e que o processamento de dados, se usarmos o vocabulĆ”rio da Ć©poca, tem a ver com a manipulação dessas estruturas e dessas teorias sobre o mundo. E isso Ć© uma questĆ£o ontológica. 

Essa foi a primeira menção de ontologia em computação, em 1967. Alguns até dizem que a primeira menção teria sido no artigo do P. Ha, uma década depois, mas o primeiro artigo realmente sobre ontologia na computação foi o de Millie. Ele ainda cita um filósofo chamado Quine, para quem a definição de ontologia é exatamente isso: o conjunto das coisas com as quais você precisa se comprometer para que uma determinada descrição faça sentido e seja verdadeira.

A primeira noção de ontologia que estamos falando aqui Ć© isso: ontologia (com "o" minĆŗsculo) Ć© uma teoria sobre o tipo de entidades e relaƧƵes que uma determinada descrição pressupƵe existir. E, como estou dizendo, isso Ć© absolutamente inevitĆ”vel. Qualquer coisa que nĆ£o seja apenas um pedaƧo de matemĆ”tica se compromete com isso. Todo mundo que jĆ” programou, ou criou um banco de dados, jĆ” fez ontologia — frequentemente sem ter as tĆ©cnicas e ferramentas para fazer isso de forma adequada. 


Mas isso é absolutamente inevitÔvel. Talvez essa seja a primeira "mensagem" da conversa: a alternativa à ontologia não é a "não-ontologia", é a "mÔ ontologia". Você vai fazer isso de qualquer jeito, se programar em Python ou misturar todas essas regras em um código, vai acabar fazendo uma mÔ ontologia.

A segunda observação Ć© a seguinte: claramente nĆ£o temos mais, nos sistemas de informação, aquele tipo de desenvolvimento chamado greenfield development, que Ć© criar sistemas do zero, sistemas que vĆ£o permanecer desconectados de outros sistemas. Todo o desenvolvimento de software moderno Ć© feito de forma coletiva e distribuĆ­da, criando coisas a partir da integração de sistemas jĆ” existentes ou criando coisas que vĆ£o se integrar a outros sistemas no futuro. Por exemplo, se olharmos para isso sob a perspectiva de Big Data, hĆ” esse modelo de quatro V's: volume, velocidade, variedade e veracidade. O problema nĆ£o estĆ” em volume e velocidade — sabemos como lidar com isso. O problema estĆ” nos outros dois: particularmente na variedade — variedade nĆ£o só sintĆ”tica, mas tambĆ©m semĆ¢ntica. A maior parte do esforƧo Ć© dedicada a lidar com isso. Por quĆŖ? Porque todos os problemas interessantes que queremos responder em ciĆŖncia, governo e organizaƧƵes só podem ser respondidos conectando sistemas de informação que foram criados por pessoas em pontos diferentes do espaƧo e do tempo. 

Por exemplo, se você quiser saber todas as empresas que têm contrato com um órgão governamental e que doaram dinheiro para campanhas políticas de um candidato que pode tomar decisões sobre esse contrato, isso é uma pergunta relevante, né? A questão é: você precisa integrar vÔrias informações de diferentes sistemas para responder isso. E o problema não é tão simples quanto parece. Você vai ter que integrar cinco, seis sistemas diferentes e entender como esses sistemas se conectam. Isso é um problema de interoperabilidade.

<aqui>

O problema de interoperabilidade Ć©, em qualquer Ć”rea, como relacionar as ontologias desses sistemas. NĆ£o estou falando de ontologia como um artefato, mas sim como uma visĆ£o de mundo, o que estĆ” embutido em cada um desses sistemas. Interoperabilidade semĆ¢ntica, no final das contas, Ć© entender a relação entre essas diferentes visƵes de mundo. 

Por exemplo, é fÔcil definir "pessoa" de um lado e "pessoa" do outro, mas qual é a relação entre essas coisas? Ou se tenho um "transplante" de um lado e um "transplante" do outro, qual é a relação? Para entender essas relações entre sistemas, precisamos entender as relações entre os referentes desses sistemas no mundo real. A relação pode ser uma de identidade, mas como saber se é de identidade? E o que significa isso?

Identidade Ć© uma relação de equivalĆŖncia — reflexiva, simĆ©trica, transitiva. AlĆ©m disso, obedece ao que Ć© chamado de "lei de Leibniz": duas coisas sĆ£o iguais se tĆŖm as mesmas propriedades em todos os mundos possĆ­veis. Isso Ć© uma relação muito forte. Imagina que vocĆŖ diga que "essa pessoa Ć© a mesma pessoa" e essa relação se propaga por toda a cadeia. EntĆ£o, ter certeza de que Ć© uma relação de identidade Ć© muito difĆ­cil. 

E se nĆ£o for uma relação de identidade, quais sĆ£o as outras opƧƵes? Talvez uma relação de "parte de", ou de dependĆŖncia. E quais sĆ£o os tipos de dependĆŖncia? Por exemplo, a minha dor de cabeƧa depende de mim: ela só existe se eu existir. Mas hĆ” outros tipos de dependĆŖncia, como quando digo que para ser estudante, vocĆŖ tem que estudar em uma instituição de ensino. Essa Ć© uma dependĆŖncia existencial. Mas quando digo que, para eu existir, meus pais precisam ter existido antes de mim, Ć© uma dependĆŖncia genĆ©rica — meus pais nĆ£o precisam existir ao mesmo tempo que eu.

Então, o que precisamos fazer? Precisamos descobrir três coisas: primeiro, descobrir as ontologias embutidas nesses sistemas; segundo, revelÔ-las, expor que ontologias são essas; e terceiro, entender qual é a relação entre os elementos dessas diversas ontologias. Para isso, precisamos de uma caixa de ferramentas conceituais. Eu jÔ falei de algumas delas: entender o que é "parte de", dependência, que tipo de estruturas taxonÓmicas ou relações taxonÓmicas eu posso estabelecer entre as coisas, e assim por diante. Ontologia com "O" maiúsculo é exatamente isso: é uma Ôrea cujo objetivo é a produção dessas caixas de ferramentas conceituais, independentes de domínio, mas que podem ser usadas para fazer as três coisas que mencionei, nos mais diversos domínios.

 


Em computação, frequentemente, quando as pessoas falam de ontologia, estĆ£o falando de um artefato. Eu usei a palavra "ontologia" de duas maneiras diferentes: uma visĆ£o de mundo, um conjunto de entidades, propriedades e relaƧƵes — uma teoria sobre o mundo ou sobre uma porção do mundo que estou pressupondo. E, por outro lado, um conjunto de tĆ©cnicas para encontrar, produzir ou descobrir essas coisas por trĆ”s das minhas descriƧƵes ou dados.

Um terceiro uso da palavra Ć© como uma representação dessa teoria — ou seja, o artefato em si.

Em domĆ­nios crĆ­ticos, a gente precisa que essas representaƧƵes — ou seja, um tipo de modelo conceitual, em teoria um modelo conceitual de referĆŖncia — sirvam como contratos de significado. NĆ£o sĆ£o apenas entidades para estruturar dados; sĆ£o um contrato dizendo ao mundo qual Ć© a sua visĆ£o sobre aquela Ć”rea. EntĆ£o, se houver um modelo sobre casamentos, ao ler esse modelo, eu preciso entender exatamente qual Ć© a visĆ£o dele sobre casamento: aceita casamento entre pessoas do mesmo sexo? Apenas de sexos diferentes? Pode-se casar com pessoas jĆ” falecidas? Pode-se casar com vĆ”rias pessoas ao mesmo tempo? Em qualquer combinação de sexo, vivas ou mortas? Todas essas sĆ£o possibilidades.

Se seus modelos forem muito frouxos e não tiverem as restrições adequadas, o contrato estÔ permitindo mais do que você gostaria. Isso se conecta fortemente à diferença entre problemas de verificação e validação.

Verificação é quando checamos se o modelo é consistente, ou seja, sem erros. Uma teoria lógica seria mostrar que ela é consistente.

Validação, por outro lado, Ć© se esse modelo representa a visĆ£o de mundo que deveria representar. SĆ£o questƵes bem diferentes. 

Podemos entender validação da seguinte forma: se eu tenho um determinado modelo e um conjunto de interpretaƧƵes possĆ­veis daquele modelo, mas tambĆ©m um conjunto de interpretaƧƵes desejadas para ele. Se meu modelo for muito frouxo, por exemplo, falando do modelo de casamento, tiver algo como "pessoa casada com zero ou mais", isso cria a ilusĆ£o de que ele Ć© interessante porque Ć© flexĆ­vel, mas, na verdade, nĆ£o Ć© isso que vocĆŖ quer. 


Se esse modelo for visto como um tipo de contrato — o Ćŗnico modo pelo qual ele pode realmente dar suporte Ć s tarefas de interoperabilidade — ele estĆ” dizendo que sua visĆ£o de casamento Ć© a mais liberal possĆ­vel, ou seja, que se pode casar com vĆ”rias pessoas ao mesmo tempo, pessoas mortas ou ainda vivas.

Por outro lado, eu poderia ter um modelo excessivamente restritivo, onde, por exemplo, só se permite casar com pessoas de sexos diferentes. Isso excluiria como interpretações vÔlidas algo que você desejaria. O problema de criar esse modelo é encontrar o conjunto de restrições que tornem essas duas coisas iguais: as interpretações possíveis e as interpretações desejadas.

Isso é particularmente importante por causa do problema de interoperabilidade. Se os meus modelos, e consequentemente os sistemas baseados nesses modelos, forem muito frouxos, posso ter uma interseção entre as interpretações possíveis, mas não entre as interpretações desejadas. Isso é o que chamamos de "acordo falso", ou seja, quando achamos que estamos falando a mesma coisa, mas não estamos. O problema não é se discordamos sobre o que é casamento, mas se acreditamos que concordamos, quando, na verdade, não estamos falando a mesma coisa.

Por fim, exatamente nesses domĆ­nios crĆ­ticos, onde os problemas de interoperabilidade tĆŖm um custo muito alto — pense na Ć”rea da saĆŗde, seguranƧa, inclusive seguranƧa nacional, ou na Ć”rea financeira ou espacial — essas tĆ©cnicas que estamos discutindo estĆ£o sendo adotadas fortemente. Isso ocorre porque essas Ć”reas precisam integrar muitos dados e precisam dessas garantias. Esses modelos sĆ£o importantes porque, em domĆ­nios complexos, a escala e a complexidade aumentam. Um amigo meu chama isso de "ridiculousgram" — o modelo real. E como sabemos se esse modelo representa nossa visĆ£o de mundo?

Isso nos leva ao problema da validação. Como posso saber se o modelo realmente diz o que eu quero que ele diga se nĆ£o consigo nem navegar pela complexidade dele? Uma das coisas que temos investigado por muito tempo Ć© como usar a caixa de ferramentas conceituais — ou ontologia com "O" maiĆŗsculo — para apoiar a construção de modelos de domĆ­nio confiĆ”veis.

Esses modelos de domínio devem ser confiÔveis, e, consequentemente, os softwares baseados neles também devem ser confiÔveis. Para que um modelo seja confiÔvel, ele precisa preservar algumas propriedades: precisa ser consistente, logicamente minimamente e ontologicamente, resiliente a mudanças (de modo que as mudanças não se propaguem de forma incontrolada), preciso, explicÔvel, transparente semanticamente e cognitivamente tratÔvel, reutilizÔvel entre vÔrias aplicações, interoperÔvel e passível de evolução.


<aqui>

Essas propriedades são essenciais quando criamos modelos para ecossistemas organizacionais complexos. Em sistemas mais simples ou em softwares stand-alone, em domínios pequenos e estÔveis, essas questões não são tão urgentes. No entanto, para domínios complexos, como os que discutimos, a criação de modelos com essas características é um desafio.

O que temos feito para criar essas linguagens e elementos? Criamos teorias. Ou seja, representamos artefatos que representam as diversas ferramentas daquela caixa de ferramentas conceitual. Um conjunto de microteorias para realizar tarefas como: entender domínios, fazer esclarecimento conceitual, ancoramento semântico de conceitos, integrar coisas, achar relações entre conceitos, etc.

Essas microteorias falam sobre tipos, estruturas taxonĆ“micas, tipos de ordem superior, teoria de relaƧƵes, teoria de dependĆŖncias, teoria de processos e eventos, papĆ©is, situaƧƵes, causalidade, entre outros. Um conjunto de teorias lógicas integradas que, eventualmente, formam o que Ć© chamado de ontologia de fundamentação (em particular, a "Unified Foundational Ontology" — UFO), que estĆ” avanƧando para se tornar um padrĆ£o ISO.

A partir dessas teorias, conseguimos criar um conjunto de ferramentas de engenharia que, inclusive, escondem algumas das complexidades dessas teorias. Essas ferramentas são centradas em uma linguagem de modelagem chamada OntoUML, sobre a qual falarei em breve. Ela me permite criar modelos com essas características desejadas.

Temos também metodologias, ferramentas computacionais, catÔlogos de padrões e antipadrões, geradores de código, simuladores para validação (como simulação visual e gestão da complexidade), ferramentas para aprendizado de axiomas, autorreparo dos modelos, enriquecimento automÔtico, e muito mais.

Essas ferramentas e a linguagem associada têm uma relação íntima com a ontologia, jÔ que as primitivas de modelagem e seus construtos refletem as distinções ontológicas propostas por essa ontologia. Ou seja, a linguagem tem construções que correspondem às diferentes relações e tipos de entidades do domínio.


Então, se eu tenho um conjunto de relações, todo o resto da linguagem vai refletir, na sua sintaxe, esses diferentes tipos de relações. A linguagem tem, na sua gramÔtica, um conjunto de restrições sintÔticas que refletem a axiomatização dessa ontologia. A ideia é que você fique restrito a criar modelos dentro dessa linguagem, que façam sentido e respeitem a estrutura dessa ontologia.

Isso acontece com qualquer linguagem que não seja ontologicamente neutra. Mas, se você pegar uma linguagem mais ontologicamente neutra, como uma lógica de primeira ordem, ou uma linguagem mais simples, como essa, o grau de liberdade é muito grande, porque o sistema é muito simples, do ponto de vista ontológico. Você pode fazer qualquer coisa, desde que respeite as regras sintÔticas mais bÔsicas.

Quando você tem uma ontologia mais rica, com uma caixa de ferramentas mais sofisticada, essas microteorias restringem como os construtos da linguagem podem ser usados, e eles só podem ser usados de maneira muito específica. Ou seja, a linguagem vira uma coisa restrita. Se você tem conceitos bem definidos, com relações fortes entre eles, você vai ter que representar essas coisas de forma específica. E você passa a modelar instanciando essas estruturas. Isso leva à criação de clusters de conceitos e padrões de design. A linguagem, então, vira uma linguagem de padrões. As primitivas da linguagem não são mais coisas de baixa granularidade, como classes, relações e atributos, mas são design patterns (padrões de design). A gente vai ver isso mais adiante.

Por exemplo, uma extensĆ£o da UML. Mas, ao invĆ©s de ter só a noção geral de classe, vocĆŖ vai ter distinƧƵes mais precisas entre tipos de classe. EntĆ£o, vocĆŖ tem o que chamamos de kind, que sĆ£o os tipos que definem o que as coisas realmente sĆ£o no domĆ­nio – ou seja, o que elas sĆ£o essencialmente. Eles classificam as instĆ¢ncias em todas as situaƧƵes possĆ­veis. As instĆ¢ncias nĆ£o podem ser de outro tipo que nĆ£o seja aquele tipo essencial (tipo estĆ”tico). Nesse exemplo, temos quatro kinds: pessoa, coração, cĆ©rebro e organização.

Por exemplo, todos nós somos do tipo pessoa. Eu sou essencialmente uma pessoa, mas posso ser contingentemente saudÔvel ou doente. Posso deixar de ser saudÔvel e virar uma pessoa doente, por exemplo. Esses tipos são dinâmicos, mas o critério de classificação dinâmica é algo intrínseco a mim. Então, a minha condição de ser saudÔvel ou doente é uma fase da minha identidade, mas eu sou sempre essencialmente uma pessoa.

Esses tipos dinâmicos podem ser chamados de papéis. Por exemplo, ser paciente é um papel que uma pessoa desempenha em uma relação específica com uma instituição de saúde. Para ser paciente, você tem que estar sendo tratado por algum provedor de saúde. JÔ os mixins são tipos que podem ser instanciados por coisas de vÔrios kinds. Por exemplo, um healthcare provider pode ser tanto uma pessoa quanto uma organização. Um mixim atravessa vÔrios kinds, podendo ser dinâmico ou estÔtico.

Se a gente olhar isso do ponto de vista geométrico, o universo das instâncias pode ser visto como uma tecelagem de kinds, ou seja, o universo é todo particionado de forma exaustiva entre esses kinds. E tudo que pertence a um kind não pode ser de outro kind. Esses mixins são como sombras que se movem dentro do espaço de um kind, cruzando a fronteira de vÔrios kinds. Eles podem ser dinâmicos, relacionais e classificar ou desclassificar coisas.

Esses mixins não são restritos apenas ao tempo, eles podem também representar mundos possíveis e situações específicas, não necessariamente temporais. Então, um healthcare provider é uma estrutura desse tipo que pode ser instanciada por coisas de tipos diferentes, como uma pessoa ou uma organização.

Poderia o contexto determinar o papel para um kind?

<aqui>

Agora, temos também aspectos, que são objetos existencialmente dependentes de outras entidades. Isso não tem a ver com o que se chama de aspect-oriented programming (programação orientada a aspectos). Um aspecto é basicamente uma propriedade reificada, ou seja, um objeto que só existe se outra entidade existir. Por exemplo, a minha dor de cabeça só existe se eu existir. Ou a minha habilidade de falar inglês só existe se eu existir. Mas esses aspectos têm um comportamento dinâmico, ou seja, podem mudar ao longo do tempo. A dor de cabeça pode se intensificar, e a habilidade de falar inglês pode melhorar ou piorar com o tempo.

Esses aspectos podem ser dependentes de uma única entidade, ou de vÔrias. Eles conectam coisas. Por exemplo, um contrato de emprego é um objeto que conecta um empregado e uma empresa. Esses objetos têm propriedades essenciais e acidentais. Um sintoma é um tipo de aspecto, por exemplo. Ele pode ser leve ou severo, e essas são fases do sintoma.

JÔ o tratamento pode ser especializado em subtipos dinâmicos, como ativo ou suspenso. O tratamento pode também desempenhar papéis. Por exemplo, ser um tratamento assegurado é um papel desempenhado pelo tratamento, dependendo de um seguro de saúde.

<aqui>

Esses conceitos ajudam a modelar o mundo de forma mais precisa, e ao fazer isso, a gente deixa explícita a nossa visão de mundo. E, portanto, conseguimos identificar que nem todas as pessoas veem o mesmo domínio da mesma maneira. Se olhÔssemos isso do ponto de vista lógico, seriam predicados unÔrios. Mesmo intuitivamente, a gente sabe que a relação entre tipos e instâncias não é a mesma.

Por exemplo, Mick Jagger: ele é necessariamente uma pessoa, mas contingentemente um cantor, economista, ou cidadão britânico. Esses são papéis, porque são dinâmicos e relacionais. JÔ ser uma pessoa viva ou adulta são fases, que são dinâmicas, mas não relacionais. E coisas como "item de herança cultural" ou "item assegurado" são mixins, porque cruzam diferentes tipos.


Essas distinƧƵes – se algo Ć© estĆ”tico ou nĆ£o, se agrupa coisas do mesmo tipo essencial ou nĆ£o – sĆ£o fundamentais para entender como representar as coisas de forma precisa. E a partir dessas distinƧƵes, a gente sabe exatamente qual construto usar para representar cada entidade no nosso modelo. Por exemplo, "estudante" Ć© um papel, porque depende de estar ligado a uma instituição de ensino. NĆ£o Ć© uma especialização estĆ”tica, mas sim relacional.

E, claro, existem regras ontológicas que se tornam regras gramaticais. Por exemplo, você não pode criar um papel sem definir o tipo que instancia aquele papel. Não pode ter um papel sem uma relação definida, como "estar matriculado em uma instituição de ensino", porque essa relação faz parte da definição do que é ser estudante.

Essas regras podem ser verificadas automaticamente em ferramentas de modelagem. Se você quebrar alguma dessas regras, o modelo não compila, ou seja, ele não é vÔlido. Então, se você tentar especializar um kind incorretamente, ou violar a definição de um papel, o modelo vai apontar esse erro.


Né, mas tem uma maneira mais interessante de pensar sobre isso. Ao invés de pensar que tem vÔrias coisas que você não pode fazer, a gente deveria pensar que tem poucas coisas que a gente pode fazer com esse papel. Essas regras aqui restringem tanto o uso desse construto que a única maneira que esse construto pode aparecer no modelo é se ele eventualmente especializar um único kind.

Se ele for definido numa relação, no escopo de uma relação tal que o que Ć© chamado de association, no oposto daquele construto, tem uma cardinalidade mĆ­nima de pelo menos um. Ou seja, que define essa condição de relação. E aĆ­, esse construto se manifesta como um tipo de padrĆ£o. 

Deixa eu dar um foco nisso daqui: na importância de representar essa entidade aqui explicitamente. Que que ele tÔ fazendo aqui? Qual a relação com essa relação?

Se a gente usa uma notação tradicional onde as relaƧƵes sĆ£o representadas simplesmente como um conjunto de duplas — nesse caso, de pares ordenados — que que acontece? Essas cardinalidades sĆ£o necessariamente ambĆ­guas. EntĆ£o, esse modelo tĆ” dizendo o quĆŖ? Olha, um paciente Ć© tratado por um ou mais hospitais, vamos dizer assim, para simplificar, e um hospital trata um ou mais pacientes.

A pergunta é: essas cardinalidades querem dizer o quê? Posso dar para vocês oito maneiras diferentes de interpretar essas cardinalidades. Por exemplo, o que que faz com que essa relação aqui seja verdadeira?

Lembra a condição relacional para alguém ser um paciente: é participar de um tratamento envolvendo uma unidade médica aqui, né, no hospital. Mas agora, dado um tratamento, eu posso ter:

  • Um paciente, uma unidade mĆ©dica, e ambos podem participar de vĆ”rios tratamentos;
  • VĆ”rios pacientes, uma unidade mĆ©dica, e todos podem participar de vĆ”rios tratamentos;
  • Ou vĆ”rios tratamentos, vĆ”rias unidades mĆ©dicas, todos participando de vĆ”rios tratamentos.

Um paciente, vÔrias unidades médicas... Isso tem a ver com a semântica do que é essa relação.

Uma conceituação na qual se vocĆŖ tem vĆ”rias unidades te tratando no hospital, todos esses sĆ£o tratamentos diferentes, Ć© muito diferente da semĆ¢ntica na qual todo mundo pode participar do mesmo tratamento. Se eu represento explicitamente essa entidade que faz com que essa relação seja verdadeira — o tratamento, aquele relator — eu elimino essa ambiguidade.

Esse modelo tÔ me dizendo: olha, tratamentos aqui envolvem um único paciente e uma unidade médica, mas eles podem participar de vÔrios tratamentos.

Essas cardinalidades aqui, como vou mostrar para vocĆŖs — vou trocar aquelas de cima — e aquelas vĆ£o permanecer as mesmas, demonstrando que elas colapsam vĆ”rias interpretaƧƵes diferentes.

Olha, nessa outra interpretação — essa Ć© que a gente tinha — nessa outra, agora eu troquei. Esse Ć© o mundo meio esquisito no qual um tratamento pode envolver vĆ”rios pacientes e vĆ”rias unidades mĆ©dicas, mas o paciente só pode participar de um tratamento, e a unidade mĆ©dica só pode atender a um tratamento. Vou trocar de novo aqui: posso ter vĆ”rios. Todo mundo pode participar de vĆ”rios. Essas cardinalidades permanecem as mesmas. Ou seja, elas sĆ£o incapazes de diferenciar todos esses casos. Essa relação aqui Ć© uma relação que chama derivação. Ela conecta as instĆ¢ncias de tratamento com esses pares ordenados. NĆ£o Ć© relação association class do UML, para quem jĆ” viu.

Essa cardinalidade aqui é derivada dessas duas, né? Automaticamente, porque se um tratamento só pode conectar um paciente e uma unidade médica, eu só posso ter um par ordenado aqui derivado de um tratamento. Mas essa daqui não. Essa tÔ te dizendo outra coisa: tÔ te dizendo quantas vezes você pode ser tratado pelo mesmo hospital, quantos tratamentos podem existir entre a mesma pessoa e o mesmo hospital.

Um tipo de pack-semantics per relation. Se isso daqui fosse n, aí isso aqui seria um para n também. Eu poderia derivar vÔrios pares ordenados da mesma relação entre tratamento, paciente e hospital.

Se eu tivesse só isso, não tem como saber. João hospital 1, João hospital 2, João TR... Não sei se, por exemplo, o tratamento conecta João com hospital 1 e 2, e tem um outro tratamento aqui que conecta João com hospital 3. Não tem como saber. Isso aqui não te dÔ informação suficiente para você reconstruir o que tÔ acontecendo por trÔs.

Isso também é um padrão da linguagem. Toda vez que eu tenho uma relação desse tipo, eu sou obrigado a representar explicitamente essas relações, esse relator e essas relações de dependência existencial com as suas cardinalidades.

Como eu tava dizendo, a linguagem é uma linguagem de padrões. E aí eu posso construir um editor que leva isso em consideração. Aqui, por exemplo, olha: pessoa é um kind, pessoa falecida é uma fase. E aí a linguagem sabe: se é uma fase, tem que ter pelo menos uma outra fase. Você sempre pode sair da fase, mas você não pode sair do kind. Você tem que se mover para outra fase do mesmo kind.


Aqui organização é um kind. Organização ativa é uma fase, mesma história, mesmo padrão: sempre pode deixar essa fase, não pode deixar esse kind. Você vai se mover para outra fase do mesmo kind. E organização extinta.

Um padrão um pouco mais interessante: eu quero modelar um mixin, aqueles role mixin. E aí eu vou dizer: "cliente pessoal é um papel desempenhado por pessoas vivas; clientes corporativos é um papel desempenhado por organizações ativas". O role mixin, nesse caso, é cliente. O relator, contexto relacional, é um contrato de serviço. E o papel complementar é o papel de fornecedor desempenhado por pessoas ativas. Eu instancio isso, basicamente preenchendo esses três formulÔrios, ou seja, distanciando esses três padrões. Esse é um modelo pequeno, mas não é um modelo trivial; a maioria das pessoas erraria esse modelo. Essa relação aqui é uma relação que as pessoas acham muito complicada. As pessoas fazem isso: cliente pode ser pessoa ou organização. Usam pessoa ou organização, como se fosse um kind, isso é um kind, isso é um papel. Isso gera uma contradição lógica, é um anti padrão muito comum.

Esses modelos crescem muito e alguns desses modelos vão ter milhares de classes. E a questão é: como é que a gente pode fazer gestão de complexidade desses modelos? Que tipo de ferramenta a gente pode oferecer para modularização, para abstração, para extrair viewpoints diferentes do modelo? Pensa como seria fazer isso com uma linguagem neutra, tipo UML, o ER, ou OWL, ou qualquer coisa desse tipo. Dever de casa é assim: eu te dou um modelo com 5000 classes, você escreve um algoritmo que gera um resumo com 20 classes, mas que realmente captura a essência do que aquele modelo é. Imagina como seria fazer isso numa linguagem tipo UML. Você não tem informação nenhuma porque todas as classes e relações são iguais. Então as pessoas tentam coisas completamente malucas, tipo PageRank: "deixa eu ver a classe que chega mais relações nela". Mas é uma maneira muito pouco sofisticada.

Aqui você tem muito mais informação porque tem mais semântica sobre o que essas classes querem dizer. E aí a gente tem vÔrios algoritmos sobre isso. Um, tem muito simples, mas é extremamente eficiente: é o seguinte, você separa as entidades e os contextos por relator.

O que Ć© contexto aqui?

Pensar, por exemplo, meu caso: eu tenho vÔrias facetas da minha vida. Eu sou professor na Holanda. Eu sou professor na Suécia. Eu sou cidadão brasileiro, mas também sou cidadão italiano. E eu pertenço ao clube. Todas essas coisas são facetas diferentes, e tudo que estÔ relacionado às relações que tenho dentro da Universidade de Twente são completamente disjuntas das relações que tenho na Universidade de Estocolmo. Sim, as relações de orientação, alocação de custo, tudo isso é independente, são clusters independentes. Mas ali eu tenho uma cadeia de dependência.

Então essa intuição, o que esse algoritmo faz? Ele pega, para cada um desses relatores, ele vai navegar, verificar quais são os papéis desempenhados nesse contexto. E ele vai navegando até atribuir identidade para todos aqueles papéis, até chegar nesses kinds.

Faz isso para o employment, para o car ownership. Esse Ć© um pouco mais interessante. Esse daqui, o que ele faz? Se ele achar um mixin daquele, ele nĆ£o vai conseguir achar identidade para cima, entĆ£o vai ter que descer para o nĆ­vel dos portais e ir navegando atĆ© achar esses kinds. E aĆ­ automaticamente ele gera esses clusters. Gera o Car Rental, o employment, o car ownership, e o marriage. Ɖ um algoritmo extremamente eficiente do ponto de vista computacional e que nĆ£o precisa de nenhuma intervenção humana. A gente fez experimentos que mostram que as pessoas preferiam essa modularização do que outros algoritmos alternativos de otimização.



A mesma coisa para o algoritmo de abstração. Agora, aqui, o algoritmo faz o seguinte: ele abstrai para os kinds. Ele pega todas as informações e fala: "deixa eu ver o que as coisas são essencialmente nesse domínio." E ele vai abstraindo tudo até chegar nesse nível de kind. Então um modelo desse tipo vira uma coisa desse tipo.


Agora, deixa eu falar um pouco sobre reusabilidade em implementaƧƵes diferentes.

Essa visão que estou defendendo aqui separa o problema de modelagem conceitual do problema de design e de implementação. Quando você estÔ fazendo modelagem conceitual e criando esses contratos de significado, o que você quer garantir? Que aquilo represente de maneira fidedigna a porção do mundo que você deseja representar e que essa representação seja eficiente para um ser humano fazer coisas como comunicar, compreender o domínio, resolver problemas, negociar significado, entre outras.

Uma vez que você tem essa representação, pode considerar requisitos não funcionais, de design e de implementação, gerando implementações diferentes para aquele modelo. Por exemplo, a partir desse modelo OntoUML, geramos vÔrias implementações, incluindo bancos relacionais de forma automÔtica.

Temos uma estratégia que utiliza o algoritmo de abstração mencionado anteriormente. Um problema frequente é o mapeamento objeto-relacional, onde surgem dúvidas: você gera uma tabela para cada classe? Para a hierarquia inteira? Ou uma tabela para um caminho entre a classe raiz e a classe folha?

Com o algoritmo de abstração, conseguimos fazer um "one table per kind". Isso traz benefícios tanto do ponto de vista computacional quanto cognitivo. Fizemos experimentos com usuÔrios que não conheciam ontologias, e eles preferiram essa abordagem. Além disso, geramos transformações para outras linguagens, como uma utilizada no contexto de web semântica, permitindo raciocínio automatizado.

<aqui>

No entanto, hÔ desafios com linguagens menos expressivas, onde as coisas não podem mudar de classe, como o caso de um estudante que deixa de ser estudante. Desenvolvemos estratégias para lidar com essa limitação e mapear essas mudanças no tempo.

Mapeamos padrões de transformação que permitem gerar especificações automaticamente. Isso elimina a necessidade de lidar diretamente com a complexidade de certas linguagens ou lógicas, tornando o processo mais eficiente. Além disso, conseguimos expor a ontologia embutida em uma visão de mundo ou sistema, representando explicitamente os conceitos e evitando falsos acordos, como os exemplos que dei sobre "pessoa" e "transplante".

Por exemplo, conceitos aparentemente iguais em dois modelos podem ser diferentes. Um "transplante" pode ser um relator que conecta cirurgião, doador e receptor, enquanto outro pode representar uma licença para realizar um tipo de transplante. Essa diferenciação é crucial para evitar ambiguidades em sistemas interoperÔveis.

<aqui>

A semântica das relações também pode variar muito. Modelos que aparentam ser iguais em termos de classes e cardinalidades podem, na verdade, representar conceitos distintos. Por isso, usamos restrições adicionais no modelo para garantir que as interpretações possíveis correspondam às desejadas.

Por fim, enfrentamos o problema de validação. Isso vai além da verificação de consistência; envolve garantir que o modelo reflita corretamente as intenções do modelador. Para isso, usamos técnicas de simulação visual, confrontando o modelador com instâncias possíveis geradas pelo modelo. Assim, ele pode identificar e corrigir interpretações indesejadas.

Essa abordagem nos permitiu criar um repositório com mais de 200 modelos, utilizado para pesquisa orientada a dados. Identificamos anti-padrões frequentes, como relacionalidades que conectam papéis especializados no mesmo centro sem impedir ambiguidades. Por exemplo, modelos que permitem que uma mesma pessoa seja doador, receptor e cirurgião no mesmo transplante.

Desenvolvemos ferramentas para detectar esses anti-padrões e propor correções automÔticas. Também criamos um catÔlogo desses anti-padrões, ajudando modeladores a evitÔ-los. Essas ferramentas são especialmente úteis em modelos grandes e complexos, com milhares de classes e relações.

Com isso, avançamos na direção de modelos mais robustos, compreensíveis e interoperÔveis, capazes de representar domínios complexos sem ambiguidades.


Nessa Ôrea, uma das coisas que a gente vem fazendo é detectar certas estruturas que, quando presentes nos modelos, causam essa dissociação entre os modelos possíveis e os modelos desejados. Ou seja, estruturas que ativam o nosso viés cognitivo. Muitas vezes, a gente não percebe algo que é tão óbvio. Por exemplo, se você tem isso, inclusive, é um anti-padrão. Se você tem um relator desse tipo, um contexto relacional conectando papéis que especializam o mesmo kind, é claro que pode ser a mesma instância preenchendo todos os papéis. Mas, na verdade, hÔ vÔrios outros modelos indesejados. Um em que estou doando o coração para o Sérgio e realizando o transplante, ou outro em que estou doando o coração para mim mesmo e o Sérgio estÔ realizando o transplante. Tudo isso é instância possível desse modelo, e a gente não percebe. Esse é um anti-padrão.

Simulamos esses modelos por um bom tempo e detectamos essas estruturas. Uma vez detectadas, vocĆŖ pode embutir isso na ferramenta. Ela passa a identificar e avisar: "Se vocĆŖ tiver isso aqui, estarĆ” aceitando essas interpretaƧƵes possĆ­veis. Qual delas vocĆŖ quer excluir?" AĆ­ vocĆŖ responde, e ela inclui exceƧƵes para eliminar aquilo. Por exemplo, vocĆŖ quer que os trĆŖs sejam disjuntos no escopo do transplante? Ou que dois sejam disjuntos? Quais dois? Ou vocĆŖ quer que sejam disjuntos de maneira geral? Isso te dĆ” essas possibilidades. Implementamos ferramentas de detecção de anti-padrƵes e propostas de retificação dos modelos. 

Criamos um catÔlogo desses anti-padrões, muitos dos quais as pessoas não percebem. Por exemplo, se eu tiver dois tipos, uma relação entre esses dois tipos, outros dois tipos especializando os dois primeiros, e uma relação entre esses dois, frequentemente existe uma restrição entre essas duas relações que as pessoas não percebem que gostariam de colocar.

Na ontologia de ECG, no modelo de ECG, o coração é composto de ventrículos. Para o coração desempenhar o papel de bomba sanguínea, o ventrículo tem que desempenhar um papel de bomba sanguínea. Quando simulamos esse modelo, observamos algo interessante: meu coração é composto de um ventrículo, o coração da Fernanda é composto de um ventrículo, mas quando meu coração bombeia sangue, ele faz isso com o ventrículo dela. Isso é uma instância possível daquele modelo, que ninguém percebe. Estamos falando de um modelo com quatro classes e duas relações; imagine 5.000 ou 15.000.

Pegamos um repositório e começamos a fazer estatísticas sobre a presença desses anti-padrões. Por exemplo, aquele padrão do coração aparecia em metade dos modelos. Num conjunto de 817, isolamos aleatoriamente 50 modelos e encontramos 817 instâncias desse padrão. Um outro anti-padrão, chamado "Association Cycle", apareceu em 92% dos modelos, porque é um problema sério. Esses ciclos são perigosos, e frequentemente esquecemos de restrições ligadas a eles. Em 50 modelos, esse ciclo apareceu 1.800 vezes. JÔ o do transplante apareceu em 25% dos modelos.

O que fizemos, então? Pegamos um dos modelos mais robustos, com cerca de 5.000 classes, produzido por uma organização profissional, uma agência governamental, com um grupo de 12 pessoas trabalhando durante dois anos. Oferecemos a ferramenta a eles para detectar se aquilo era erro. Em 88% dos casos, os anti-padrões eram erros, e conseguimos corrigi-los automaticamente em 97% dos casos. O anti-padrão do transplante era erro em 56% dos casos, e corrigimos automaticamente 77% deles. JÔ o "Association Cycle" era erro em 70% dos casos, e corrigimos 71% automaticamente. Cada anti-padrão que é um erro representa uma falha no contrato do modelo.

Essa situação é tão presente que, se você não validar o modelo, ele estarÔ errado. Afirmo com convicção: qualquer modelo não trivial que for validado terÔ pelo menos alguns anti-padrões. Por exemplo, este aqui permite uma interpretação indesejada, mas possível: o mesmo indivíduo pode ser o "Health Care Provider" e o paciente ao mesmo tempo. Difícil perceber isso mesmo num modelo pequeno. Quando simulamos, isso aparece: nesse tratamento, o "Provider" e o paciente são a mesma pessoa.

Para resolver, utilizamos a linguagem Alloy, que transforma especificações lógicas em problemas de "Constraint Satisfaction" e gera modelos visuais. Criamos uma semântica modal para visualização, permitindo ao usuÔrio ver os modelos lógicos de maneira interativa. Por exemplo, ele pode definir quais instâncias deseja incluir ou excluir. Isso facilita a validação do modelo.

Focamos também em padrões ligados à modelagem multinível. Por exemplo, "pessoas" têm instâncias como "adulto", que é um subtipo de pessoa, e assim por diante. Esse tipo de modelagem gera muitos anti-padrões. Detectamos e corrigimos esses problemas em grandes repositórios, como o Wikidata, onde erros desse tipo apareciam em 85% das modelagens.

Por fim, desenvolvemos abordagens simbólicas e subsimbólicas para ajudar na evolução de modelos legados, incluindo técnicas de "stereotype prediction" e algoritmos interativos para corrigir modelos de maneira eficiente. Nosso objetivo é construir sistemas confiÔveis, com modelos resilientes, explicÔveis e interoperÔveis. Isso requer ferramentas que amplifiquem a inteligência do usuÔrio, combinando aprendizado de mÔquina e técnicas dedutivas para facilitar a tarefa de modelagem.


AĆ­ resolvemos fazer outra coisa. Pensamos: “Vamos tentar checar antipadrƵes e estruturas muito grandes.” E decidimos focar no Wikidata. Em particular, querĆ­amos verificar padrƵes ligados Ć quele conceito de tipos com coexistĆŖncia, chamados de modelagem multinĆ­vel. Por exemplo, temos Pessoa. Uma instĆ¢ncia de Adulto Ć© um subtipo de Pessoa. Todo Adulto Ć© uma instĆ¢ncia de Pessoa e um indivĆ­duo. Adulto tambĆ©m Ć© uma instĆ¢ncia de uma classe de segunda ordem chamada Persona Phase, que representa fases etĆ”rias. Assim, John Ć© uma instĆ¢ncia de Adulto, e Adulto Ć© uma instĆ¢ncia desse conceito. HĆ” vĆ”rios antipadrƵes associados a essa modelagem multinĆ­vel.

Um exemplo ocorre no Wikidata, onde hÔ vÔrias relações de especialização. O problema é que o Wikidata é construído coletivamente, e alguns termos são polissêmicos, o que leva pessoas a tratÔ-los como instâncias ou classes, sem checagem. Por exemplo, antes de corrigirem, havia profissões como Criador, Cientista e Cientista da Computação. Mas, ao mesmo tempo, Cientista era tratado como instância de profissão, o que levava à conclusão errada de que Tim Berners-Lee é uma profissão.

Esse antipadrão era tão comum que, ao analisarmos o Wikidata, identificamos que havia 3.371 classes em taxonomias. No entanto, 17.819 classes cruzavam níveis taxonÓmicos, e em 85% dos casos os modelos estavam errados. Mas é possível detectar e corrigir automaticamente.

Por fim, falando sobre a evolução de modelos, imagine que estamos usando o sistema para gerar simulaƧƵes de instĆ¢ncias possĆ­veis. O usuĆ”rio valida essas instĆ¢ncias, dizendo o que quer e o que nĆ£o quer. Por exemplo, “Quero casamento com vĆ”rias pessoas, mas nĆ£o com ninguĆ©m morto.” Ou “VocĆŖ pode doar para outra pessoa e realizar um transplante, mas nĆ£o para si mesmo.” Nesse processo, o usuĆ”rio anota o que deseja ou rejeita, criando uma base de exemplos e contraexemplos.

Juntando essa base com a teoria original, podemos aprender as restriƧƵes que devem ser incluƭdas no modelo. Isso excluiria os contraexemplos e validaria os exemplos. Por exemplo, se um modelo diz que uma pessoa pode estar viva e morta ao mesmo tempo, podemos usar as validaƧƵes para restringir esse comportamento e gerar um modelo mais robusto.

Essa abordagem é necessÔria porque os antipadrões derivam de nossas falhas cognitivas, enquanto os padrões vêm da teoria. Existem poucas formas de fazer as coisas corretamente, mas infinitas maneiras de cometer erros. Portanto, ao reunir essas validações da comunidade, podemos usar técnicas de aprendizado para identificar e corrigir antipadrões.

Agora, sobre um problema atual: o legado de modelos criados de forma diversa. HÔ milhões de modelos construídos sem padronização. Nossa ideia é ajudar a transpor esses modelos para uma linguagem mais formal e ancorÔ-los em ontologias. Recentemente, testamos duas abordagens. Na subsimbólica, usamos redes convolucionais e modelos de linguagem para prever estereótipos e classificar conceitos em ontologias. Na abordagem simbólica, aproveitamos a gramÔtica restrita da linguagem. Por exemplo, se sabemos que algo é um Papel, jÔ restringimos as opções para elementos relacionados.

Descobrimos que, ao marcar apenas 10% das classes de um modelo como conhecidas (seed), conseguimos inferir o restante de maneira eficiente. Esse processo interativo é mais eficaz e demonstra o valor de métodos simbólicos. Agora, exploramos como combinar essa abordagem com técnicas de aprendizado, como adversarial learning, para melhorar ainda mais as validações iniciais.

A mensagem principal é que sistemas confiÔveis dependem de modelos confiÔveis. Esses modelos devem ser resilientes, explicÔveis, interoperÔveis, reutilizÔveis e evolutivos. Construir tais modelos exige linguagens precisas com semântica consistente e técnicas específicas, como model finding, verificação técnica, detecção de padrões e antipadrões, e aprendizado de mÔquina. Tudo isso para apoiar os usuÔrios na difícil tarefa de criar modelos confiÔveis.


Todo sistema utiliza um modelo, mais ou menos explícito. Esses modelos confiÔveis precisam ser confiÔveis (reliable), resilientes (resilient), explicÔveis (explainable), interoperÔveis (interoperable), reutilizÔveis (reusable), e evolutivos (evolvable). Para construir modelos com essas propriedades, são necessÔrias técnicas muito específicas. Isso representa um verdadeiro projeto de humildade, um reconhecimento da nossa incapacidade de lidar com a complexidade inerente a essas tarefas.

Precisamos de linguagens que sejam realmente precisas, com uma semântica consistente e um tipo de semântica ontológica sólida. Além disso, precisamos de um programa de amplificação da inteligência (Intelligence Amplification - IA), em vez de inteligência artificial (Artificial Intelligence - AI).

Nesse esforço, temos experimentado de tudo: técnicas de model finding, verificação formal, detecção e mineração de repositórios para identificar padrões e antipadrões. Utilizamos tudo que estÔ ao nosso alcance, incluindo machine learning, abordagens indutivas, dedutivas, e métodos híbridos. Até mesmo o aprendizado por meio de programas é um tipo de machine learning. A ideia é combinar todas essas ferramentas para ajudar os usuÔrios a enfrentar a difícil tarefa de construir modelos com essas propriedades.




ComentƔrios

Postagens mais visitadas deste blog

Connected Papers: Uma abordagem alternativa para revisão da literatura

Durante um projeto de pesquisa podemos encontrar um artigo que nos identificamos em termos de problema de pesquisa e tambĆ©m de solução. EntĆ£o surge a vontade de saber como essa Ć”rea de pesquisa se desenvolveu atĆ© chegar a esse ponto ou quais desdobramentos ocorreram a partir dessa solução proposta para identificar o estado da arte nesse tema. Podemos seguir duas abordagens:  realizar uma revisĆ£o sistemĆ”tica usando palavras chaves que melhor caracterizam o tema em bibliotecas digitais de referĆŖncia para encontrar artigos relacionados ou realizar snowballing ancorado nesse artigo que identificamos previamente, explorando os artigos citados (backward) ou os artigos que o citam (forward)  Mas a ferramenta Connected Papers propƵe uma abordagem alternativa para essa busca. O problema inicial Ć© dado um artigo de interesse, precisamos encontrar outros artigos relacionados de "certa forma". Find different methods and approaches to the same subject Track down the state of the art rese...

Knowledge Graphs as a source of trust for LLM-powered enterprise question answering - Leitura de Artigo

J. Sequeda, D. Allemang and B. Jacob, Knowledge Graphs as a source of trust for LLM-powered enterprise question answering, Web Semantics: Science, Services and Agents on the World Wide Web (2025), doi: https://doi.org/10.1016/j.websem.2024.100858. 1. Introduction These question answering systems that enable to chat with your structured data hold tremendous potential for transforming the way self service and data-driven decision making is executed within enterprises. Self service and data-driven decision making in organizations today is largly made through Business Intelligence (BI) and analytics reporting. Data teams gather the original data, integrate the data, build a SQL data warehouse (i.e. star schemas), and create BI dashboards and reports that are then used by business users and analysts to answer specific questions (i.e. metrics, KPIs) and make decisions. The bottleneck of this approach is that business users are only able to answer questions given the views of existing dashboa...

Knowledge Graph Toolkit (KGTK)

https://kgtk.readthedocs.io/en/latest/ KGTK represents KGs using TSV files with 4 columns labeled id, node1, label and node2. The id column is a symbol representing an identifier of an edge, corresponding to the orange circles in the diagram above. node1 represents the source of the edge, node2 represents the destination of the edge, and label represents the relation between node1 and node2. >> Quad do RDF, definir cada tripla como um grafo   KGTK defines knowledge graphs (or more generally any attributed graph or hypergraph ) as a set of nodes and a set of edges between those nodes. KGTK represents everything of meaning via an edge. Edges themselves can be attributed by having edges asserted about them, thus, KGTK can in fact represent arbitrary hypergraphs. KGTK intentionally does not distinguish attributes or qualifiers on nodes and edges from full-fledged edges, tools operating on KGTK graphs can instead interpret edges differently if they so desire. In KGTK, e...