UNIVERSIDADE FEDERAL DE SANTA CATARINA Gerador de Esquema Conceitual Global através da Integração de Esquemas Conceituais Locais de Fontes de Dados XML no Ambiente BInXS Lucas Duarte Silveira Florianópolis – SC 2007/1 2 UNIVERSIDADE FEDERAL DE SANTA CATARINA DEPARTAMENTO DE INFORMÁTICA E ESTATÍSTICA CURSO DE SISTEMAS DE INFORMAÇÃO Gerador de Esquema Conceitual Global através da Integração de Esquemas Conceituais Locais de Fontes de Dados XML no Ambiente BInXS Lucas Duarte Silveira Trabalho de conclusão de curso apresentado como parte dos requisitos para obtenção do grau Bacharel em Sistemas de Informação Florianópolis – SC 2007/1 3 Lucas Duarte Silveira Gerador de Esquema Conceitual Global através da Integração de Esquemas Conceituais Locais de Fontes de Dados XML no Ambiente BInXS Trabalho de conclusão de curso apresentado como parte dos requisitos para obtenção do grau de Bacharel em Sistemas de Informação ___________________________________________ Prof. Dr. Ronaldo dos Santos Mello Orientador Banca Examinadora: ___________________________________________ Prof. Dr. José Leomar Todesco ___________________________________________ Prof. Dr. Renato Fileto 4 Agradecimentos Agradeço ao meu orientador, prof. Ronaldo, especialmente pela paciência que demonstrou mesmo nos momentos mais complicados. Agradeço a meus pais, por tudo que já fizeram por mim, e pelo apoio que me deram neste período de universidade, assim como em tudo mais na minha vida. Muito obrigado a minha namorada, Juliana, esta pessoa tão especial na minha vida, por estar sempre presente quanto eu precisava. Agradeço a meus amigos que fiz na universidade, especialmente o Juliano e o Rafael, pelo companheirismo e camaradagem em todas as horas. Muito obrigado também ao Felipe, meu irmão, pelo seu interesse e torcida pelo meu sucesso. Desejo tudo de bom e muita felicidade a todos vocês. 5 Resumo XML é uma linguagem de marcação muito utilizada para a representação e troca de dados na Web. O fato de ela apresentar uma grande flexibilidade estrutural, representando dados semi-estruturados, aliada à intenção de cada usuário ou aplicação que gera documentos e esquemas XML, faz com que existam uma grande heterogeneidade entre dados que representam informações de um mesmo domínio. Isso gera uma grande dificuldade quando se deseja consultar dados de diferentes fontes, cada um com seu próprio padrão para terminologia e esquematização dos dados. Para resolver esse problema existem algumas propostas para realizar a integração de dados heterogêneos, entre elas o BInXS (Bottom-Up Integration of XML Schemata). A proposta do presente trabalho é a implementação e o desenvolvimento de um gerador que desempenhe uma das últimas etapas do processo realizado pelo ambiente BInXS, que é a integração semântica de esquemas conceituais locais, gerados em etapas anteriores do processo. No final desta integração, obtém-se um esquema conceitual global preliminar que depois de passar por outros processos de reestruturação se torna um esquema conceitual global definitivo. Este esquema conceitual global é a representação geral dos esquemas heterogêneos anteriores e permite o acesso unificado à todas as fontes de dados que originaram estes esquemas. Palavras-chave: Integração de Esquemas, Dados Heterogêneos, Esquema Conceitual, Esquema Canônico, OWL. 6 Abstract XML is a markup language very utilized for the representation and exchange of data in the Web. The fact of presenting a great structural flexibility, moreover representing half structured data, beyond associated with the intention of each user or application that generates documents and XML schema, incites de existence of a huge heterogeneity between data that represent information of a same domain. Also, it engenders such a vast difficulty when consulting data of different fonts, each one with its own terminology and schematization standard of data. In order to solve this problem, there are some proposals that accomplish the integration of heterogeneous data, among them, the BInXS (Bottom-Up Integration of XML Schemata). The proposal of the present exertion is the implementation and development of a generator, which attends one of the last stages of the process consummated by the ambient BInXS that is a semantic integration of local conceptual schemes, generated at previous stages of the process. At the end of this integration, a preliminary global conceptual scheme is obtained, which after passing for other restructure processes, became a global conceptual scheme defined. This global conceptual scheme is the general representation of the previous heterogeneous schemes, furthermore, it allows the unified access for all of the sources of data that produces these schemes. Keywords: Scheme Integration, Heterogeneous Data, Conceptual Scheme, Canonic Scheme, OWL. 7 Sumário 1 Introdução ............................................................................................................10 1.1 Apresentação ....................................................................................................10 1.2 Justificativa .......................................................................................................10 1.3 Objetivos ..........................................................................................................11 1.4 Organização dos Capítulos ...............................................................................12 2 BInXS ..................................................................................................................14 2.1 Definição ..........................................................................................................14 2.2 Processo de Integração .....................................................................................15 2.2.1 Conversão ......................................................................................................16 2.2.2 Integração Semântica ....................................................................................18 2.3 Linguagem de Especificação de Esquemas Conceituais Canônicos ................21 2.4 Considerações Finais ........................................................................................26 3 Processo de Unificação .......................................................................................27 3.1 Unificação da Nomenclatura dos Conceitos ....................................................29 3.2 Unificação Léxica ............................................................................................30 3.3 Unificação Não-Léxica ....................................................................................31 3.3.1 Unificação de Relacionamentos ....................................................................31 3.3.2 Tratamento de Disjunções .............................................................................33 3.4 Unificação Mista ..............................................................................................35 3.5 Considerações Finais ........................................................................................37 4 Projeto do Gerador ..............................................................................................39 4.1 Arquitetura .......................................................................................................39 4.2 Implementação..................................................................................................41 4.2.1 Arquitetura das Classes..................................................................................42 8 4.2.2 Execução........................................................................................................45 4.3 Exemplo de Utilização......................................................................................47 5 Conclusão.............................................................................................................55 5.1 Trabalhos Futuros...............................................................................................56 5.2 Atividades a Finalizar.........................................................................................56 Referências ..............................................................................................................57 Anexo 1 – Artigo .....................................................................................................60 Anexo 2 – Código Fonte .........................................................................................72 9 Lista de Figuras Figura 1: Arquitetura para um sistema baseado em mediadores..............................14 Figura 2: Processo de integração no BInXS.............................................................16 Figura 3: Exemplo de esquema conceitual...............................................................17 Figura 4: Esquema de metadados de um ECC.........................................................21 Figura 5: Conceito não léxico..................................................................................22 Figura 6: Conceito léxico.........................................................................................23 Figura 7: Relacionamento de herança......................................................................23 Figura 8: Relacionamento de associação.................................................................24 Figura 9: Cluster não léxico.....................................................................................25 Figura 10: Processo de unificação............................................................................28 Figura 11: Exemplo de tratamento de disjunções....................................................34 Figura 12: Exemplo de unificação mista (1)............................................................36 Figura 13: Exemplo de unificação mista (2)............................................................37 Figura 14: Arquitetura do funcionamento do gerador..............................................40 Figura 15: Diagrama de classes do Gerador.............................................................44 Figura 16: Diagrama de seqüência – leitura e geração dos esquemas de entrada....46 Figura 17: Diagrama de seqüência – início da unificação léxica.............................47 Figura 18: Tela de seleção dos documentos OWL...................................................48 Figura 19: Tela para escolha do nome do conceito global.......................................49 Figura 20: Tela para indicação de correspondência semântica entre relacionamentos........................................................................................................50 Figura 21: Tela para informar o nome do novo relacionamento global...................51 Figura 22: Tela para seleção de relacionamento equivalente...................................51 10 Figura 23: Tela para unificação tratamento de conceito léxico na unificação mista.........................................................................................................................52 Figura 24: Tela para seleção de conceitos correspondentes na unificação mista.... 53 11 1 Introdução 1.1 Apresentação XML (eXtensible Markup Language) é uma linguagem de marcação, padrão da W3C (World Wide Web Consortium), para a representação de dados semi-estruturados [XML 2007]. Geralmente a utilização de um documento XML é acompanhada de documentos que definem o seu esquema, como DTDs e XML Schemas [XML SCHEMA 2007]. Com sua estrutura baseada em tags, a linguagem XML é muito vantajosa, pois permite carregar informação semântica na estruturação dos dados, além de ser altamente flexível e extensível (dada sua característica de ser um dado semi-estruturado [MELLO 2000]). Por causa disso, atualmente é um dos padrões mais utilizados para o intercâmbio de dados na Web. Por representar dados semi-estruturados, os dados XML podem apresentar grande heterogeneidade por causa de sua alta flexibilidade o que faz com que seus esquemas geralmente sejam extensos para que possam suportar a gama de representações alternativas que um dado pode possuir [MELLO 2002]. Este fato, aliado ao grande e crescente volume de dados disponíveis na Web, faz com que várias fontes de dados XML apresentem diferenças nas suas representações, mesmo as que são parte de um mesmo domínio de aplicação. Na realidade, podese dizer que dados na Web são inerentemente heterogêneos [MELLO, CASTANO, HEUSER 2002]. 1.2 Justificativa Considerando essas características dos dados XML, surge a necessidade de se disponibilizar uma forma de acesso unificado às várias fontes de dados heterogêneos de um mesmo domínio de aplicação, permitindo uma consulta unificada dos dados, rompendo a barreira da heterogeneidade e particularidades de cada fonte. Alguns trabalhos na literatura tentam resolver esse problema como: MIX [LUDäSCHER 99], Xyleme [REYNAUD 2001], LSD [DOAN 2001], DIXSE [RODRIGUEZ 2001] e o BInXS [MELLO 2002]. 12 Este trabalho está inserido no contexto da abordagem BInXS. Em relação aos outros trabalhos citados, o BInXS apresenta como principais vantagens[MELLO 2002]: • Uma representação canônica conceitual para esquemas XML com relacionamentos de herança e associação que modelam a intenção semântica dos dados; • Um processo de integração semântica para estes esquemas conceituais gerados, considerando a determinação de equivalências e a resolução de conflitos para representações semi-estruturadas. O resultado deste processo é um esquema conceitual global. A representação canônica conceitual para os esquemas XML é feita por esquemas conceituais. Estes esquemas são obtidos em uma das primeiras etapas do BInXS, num processo de engenharia reversa dos esquemas XML, através de uma análise detalhada do esquema e das instâncias XML de cada fonte de dados. Os esquemas conceituais gerados baseiam-se no modelo ORM/NIAM (Object with Role Model/Natural Language Information Analysis Method) [HALPIN 98] e são armazenados na forma de documentos OWL (Web Ontology Language) [MCGUINNES & HARMELEN 2004], que são uma recomendação recente da W3C para o armazenamento de ontologias e esquemas conceituais. Na etapa de Integração Semântica, onde é feita a integração semântica dos esquemas conceituais, são tratados casos específicos na unificação de dois tipos de elementos (estruturados e texto). Para resolver o problema da definição de equivalência entre os conceitos a serem unificados o BInXS faz o uso de clusters de afinidade, onde conceitos com o mesmo valor semântico são agrupados. Estes clusters de afinidade são criados com o auxílio de Bases de Dados Terminológicas [SILVA 2005]. Depois de aplicadas uma série de regras para unificação dos conceitos e dos relacionamentos, e resolvendo os possíveis conflitos entre as representações (sub-etapa chamada Unificação), obtém-se como resultado um esquema conceitual global preliminar, que é a representação unificada dos esquemas conceituais anteriores. Esse esquema conceitual preliminar precisa passar por outros processos de reestruturação para que se obtenha no final, um esquema conceitual definitivo. 13 1.3 Objetivos O presente trabalho propõe a implementação da sub-etapa de Unificação do BInXS. Ela tem como objetivo principal o desenvolvimento de um gerador que recebe como entrada dois esquemas conceituais, armazenados em documentos OWL, e realiza com base nas regras de unificação estabelecidas pelo BInXS, a integração semântica dos conceitos e relacionamentos dos dois esquemas conceituais. O gerador deve obter como saída um esquema conceitual global preliminar, também armazenado em um documento OWL, que é a representação unificada dos dois esquemas locais. Neste trabalho não está incluída a geração dos clusters de afinidade, assim como o acesso às bases de dados terminológicas, considerando assim que o conjunto de clusters para os esquemas em questão já esteja formado. Como já citado, o gerador produz como resultado um esquema conceitual global preliminar, não estando incluídos os procedimentos de reestruturação que geram o esquema conceitual global definitivo. Esta implementação é deixada para trabalhos futuros. Como no BInXS o processo de unificação pode ser aplicado recursivamente, o esquema conceitual global resultante pode servir de entrada para uma nova unificação com um terceiro esquema e assim por diante. Durante os processos de conversão e unificação do BInXS, informações de mapeamento são geradas para estabelacer a correspondência entre os elementos e atributos definidos nos esquemas XML, e os conceitos correspondentes nos esquemas conceituais [MELLO 2005]. Desta forma pode-se formular consultas aos dados disponíveis nas fontes a partir do esquema conceitual global. Isso ainda vai ser comentando em um capítulo mais à frente deste trabalho, não obstante, qualquer procedimento como geração ou tratamento, relativos a informações de mapeamento estão excluídos no escopo deste trabalho e do gerador proposto, sendo assumidos como já definidos anteriormente na etapa anterior à Unificação. O trabalho foca na implementação das regras de unificação propostas no BInXS, unificando conceitos e relacionamentos com o auxílio de clusters de afinidade e resolvendo os conflitos entre as representações semi-estruturadas. Este processo de unificação é um processo semi-automático, e como em outras etapas do BInXS, necessita da intervenção de um usuário especialista para tomar algumas decisões e para validar os resultados gerados pela integração automática. Este trabalho implementa as formas como o usuário intervém no processo através de interfaces específicas. 14 1.4 Organização dos Capítulos Este trabalho está dividido em mais quatro capítulos. No capítulo 2 é apresentado de uma forma geral, todo processo de integração proposto pela abordagem do ambiente BInXS. O capítulo 3 apresenta mais detalhadamente as regras e metodologia do passo de unificação do BInXS, que é onde este trabalho se concentra. O capítulo 4 descreve o projeto de desenvolvimento e algumas características do gerador a ser implementado. No capítulo 5 se encontra quais as atividades a serem realizadas no restante do desenvolvimento do presente trabalho. 15 2 BInXS Este capítulo apresenta em mais detalhes o ambiente BInXS, que é a base para o desenvolvimento deste trabalho. 2.1 Definição O BInXS foi concebido como parte de uma camada de mediação de um sistema para o gerenciamento de dados semi-estruturados. Esse sistema tem uma arquitetura baseada em mediadores e é dividido em três camadas: wrapping, mediação e apresentação. Esta arquitetura pode ser vista na figura 1. Figura 1: Arquitetura para um sistema baseado em mediadores [MELLO 2002] A camada de wrapping é a camada inferior da arquitetura, composta por um conjunto de wrappers. Os wrappers são responsáveis por fazer consultas às fontes de dados XML. Para isso, essa camada recebe especificações de consulta da camada de mediação. 16 A camada de mediação, que fica no centro da arquitetura, é responsável pela tarefa de integração dos esquemas XML e das consultas às fontes. A camada de apresentação representa a interface aonde os usuários e aplicações podem fazer suas consultas às fontes de dados XML. Quando uma consulta é feita à camada de apresentação, ela envia para a camada de mediação uma consulta em uma linguagem de consulta para XML, que está de acordo com o vocabulário do esquema global. Esta consulta é traduzida para o vocabulário de cada um dos esquemas locais e enviadas para os wrappers executarem as consultas. Os resultados das consultas são traduzidos para o vocabulário do esquema global e enviados para a camada de apresentação como um único documento XML [MELLO 2002]. Como o BInXS está inserido na camada de mediação, sua função principal é a integração e unificação semântica dos esquemas das fontes (esquemas XML Schema e/ou DTDs (Document Type Definition)) locais a serem consultadas. O BInXS realiza essa integração num processo que é bottom-up (gera esquema global a partir das fontes XML locais) e semiautomático, pois necessita da intervenção de um usuário especialista no domínio durante suas etapas para realizar a validação das intenções semânticas dos dados que estão sendo integrados e seus relacionamentos. 2.2 Processo de Integração O processo de integração do BInXS é dividido em duas etapas principais como está ilustrado na figura 2 [MELLO 2002]. A primeira é a etapa de Conversão dos esquemas XML e DTDs associados às fontes XML para esquemas conceituais canônicos locais. Nesta etapa não só os esquemas são analisados, como também o conteúdo dos dados XML, ou seja as instâncias XML. Durante a conversão, informações de mapeamento, necessárias para a ligação entre os conceitos criados e os elementos e atributos correspondentes nos esquemas XML, são geradas e armazenadas. A segunda etapa é a Integração Semântica dos esquemas canônicos gerados na etapa anterior, através da integração semântica destes esquemas conceituais. Essa integração gera um esquema conceitual global, além de informações de mapeamento dos seus conceitos para com todos os elementos e atributos nas fontes XML que tenham equivalência semântica. 17 Figura 2: Processo de integração no BInXS [MELLO 2002] A seguir, estas duas etapas são descritas com mais detalhes. 2.2.1 Conversão A fase de conversão dos esquemas é baseada em uma série de regras que envolvem os conceitos do modelo XML, a análise de documentos XML e a ação de um usuário especialista [MELLO 2005]. No projeto inicial do BInXS, o processo teria como entrada apenas DTDs associadas a documentos XML [MELLO 2002]. Atualmente, graças a trabalhos desenvolvidos posteriormente [FRANTZ 2004 e GARCIA 2005], o BInXS suporta a conversão de esquemas lógicos do tipo XML Schema. Sendo assim, estas são as possíveis entradas que irão ser convertidas em esquemas conceituais dentro desta fase do processo. Esta fase é dividida em três passos: pré-processamento, conversão e reestruturação. No pré-processamento, as DTDs ou XML Schemas sofrem algumas modificações nas suas especificações, de forma a obter esquemas mais simplificados e mais bem estruturados, facilitando a conversão para esquemas conceituais. Alguns elementos podem ser manualmente 18 renomeados de forma mais adequada, assim como podem ser removidos elementos que não dizem respeito ao domínio em questão. Modificações automáticas também podem ser feitas, como por exemplo, a remoção de estruturas aninhadas, facilitando a determinação de elementos do esquema na hora da conversão. Um esquema XML pré-processado passa para o passo de conversão para um esquema conceitual canônico. Um esquema conceitual no BInXS possui dois tipos de conceitos e relacionamentos binários entre eles. Um elemento no esquema de entrada que seja composto por sub-elementos torna-se um conceito não-léxico no esquema conceitual (representados graficamente por um quadrado contínuo). Já elementos que tenham um conteúdo texto, ou que sejam atributos, tornam-se conceitos léxicos (representados por um quadrado tracejado). Através da análise de documentos XML, pode-se determinar o tipo de um conceito léxico, caso contrário é assumido o tipo default string. A figura 3 mostra a representação gráfica de um exemplo de esquema conceitual. Figura 3: Exemplo de esquema conceitual [MELLO 2002] 19 Entre os conceitos, dois tipos de relacionamentos podem existir: associação ou herança. Relacionamentos de associação (representados por uma linha) definem cardinalidades para ambos os lados do relacionamento. Estas cardinalidades podem ser definidas diretamente ou se for necessário, como auxílio de uma análise de documentos XML e validação de um usuário especialista. Relacionamentos de herança (representados por uma seta) podem ser gerados com o auxílio de um Thesaurus. Caso seja verificado que o termo de um elemento filho é uma forma mais especializada do termo correspondente ao elemento pai, uma relação de herança é criada entre os dois conceitos correspondentes. Em ambos os tipos de relacionamento, quando se deve tomar uma escolha na definição de um elemento, entre dois ou mais sub-elementos relacionados, é definida um disjunção entre os relacionamentos que estão envolvidos (representada por uma curva com um “X”). Após a aplicação de uma série de regras de conversão (algumas vezes com a intervenção do usuário), para resolver possíveis problemas como o tipo de dado dos conceitos léxicos, associações hierárquicas entre elementos XML e suas intenções semânticas, um esquema conceitual preliminar é gerado. O detalhamento destas regras de conversão não faz parte do escopo deste trabalho, que se concentra mais na etapa seguinte do processo do BInXS. Um esquema conceitual preliminar gerado no passo de conversão deve passar ainda pelo passo de reestruturação para que possa ser considerado um esquema conceitual definitivo. Neste passo são feitos alguns ajustes, tanto automáticos quanto manuais, para otimizar a definição do esquema conceitual. Exemplos destes ajustes podem ser: ajustes manuais nas cardinalidades e na nomenclatura de alguns conceitos, e ajustes automáticos como mudanças no tipo de relacionamentos e generalizações de relacionamentos. Após feitos todos os ajustes, obtém-se um esquema conceitual definitivo para cada DTD ou XML Schema. 2.2.2 Integração Semântica Na etapa de integração semântica, os esquemas conceituais gerados na fase anterior são unificados, gerando um esquema conceitual global que é uma representação semântica unificada 20 de todos os esquemas XML de entrada. Os passos que compõem esta etapa são detalhados a seguir. Agrupamento de Conceitos Sinônimos O primeiro passo para a realização da integração semântica é o agrupamento de conceitos sinônimos. Neste passo é feita uma análise dos conceitos presentes nos esquemas conceituais que serão unificados, com o intuito de criar grupos de conceitos sinônimos chamados clusters de afinidade [MELLO 2002]. Cada cluster de afinidade contém os conceitos que possuem um mesmo significado. Conceitos de esquemas diferentes que são equivalentes semanticamente. Para fazer a determinação de equivalência semântica dos conceitos e criação dos clusters de afinidade, são utilizadas bases de dados terminológicas. Estas bases mantêm termos e relacionamentos semânticos entre eles, para várias línguas, sendo semelhante a um thesaurus. Os clusters definidos automaticamente podem ser validados pelo usuário. Unificação Uma vez gerados os clusters de afinidade, vem o passo principal da integração: a unificação. É neste passo que o presente trabalho está focado. As regras e o funcionamento geral desta etapa são explicados mais detalhadamente no capítulo 3. Aqui são apresentados de forma geral os principais conceitos envolvidos no passo da unificação. A unificação dos esquemas é realizada tendo como entrada dois esquemas conceituais locais e obtendo como saída um esquema conceitual global. Este processo é recursivo, sendo que este esquema conceitual global gerado pode ser integrado a outro esquema conceitual local, e assim por diante. Desta forma, vários esquemas conceituais podem ser integrados num único esquema conceitual global. Na unificação são resolvidos conflitos de nomes, relacionamentos e disjunções, considerando os tipos dos conceitos que estão presentes em cada cluster [MELLO, CASTANO, HEUSER 2002]. Neste caso três tipos de unificação podem existir. Quando um cluster possui apenas conceitos léxicos (unificação L x L), a unificação deste cluster produz um único conceito global do tipo léxico. O tipo deste conceito será o tipo 21 mais genérico dos tipos presentes no cluster. O nome do conceito será o que tiver a maior freqüência no cluster e, se necessário, é decidido pelo usuário. Quando um cluster tem apenas conceitos não-léxicos (unificação NL x NL), a unificação dos conceitos resulta em um conceito global não-léxico. Todos os relacionamentos dos conceitos locais são considerados no conceito global. Se um relacionamento do mesmo tipo acontece entre os conceitos de um cluster em ambos os esquemas conceituais, este é unificado e representado no esquema conceitual global uma única vez, relacionando os conceitos globais correspondentes. Para a cardinalidade de relacionamentos de associação, vale a cardinalidade mais geral dentre as cardinalidades dos relacionamentos envolvidos [MELLO 2002]. Para relacionamentos disjuntos, se não existe conflito entre dois ou mais relacionamentos presentes nos dois esquemas conceituais, a disjunção é representada no esquema conceitual global. Caso contrário, se dois ou mais relacionamentos são disjuntos em um esquema conceitual, mas os relacionamentos equivalentes, presentes no outro esquema não são disjuntos entre si, essa disjunção não é representada no esquema global. Em compensação, neste caso de conflito para relacionamentos de associação, estes são representados como opcionais no esquema global (cardinalidade (0,N)). Finalmente, quando o cluster é formado por conceitos léxicos e não-léxicos (unificação NL x L), uma representação global não-léxica é utilizada no esquema global. Desta forma a representação global do conceito terá mais detalhes e será mais completa. Algumas vezes, é necessária a criação de um novo conceito léxico associado para representar o valor do conceito local no esquema global, ou um conceito não-léxico global com alternativas léxicas e não-léxicas associadas para representar os conceitos dos dois esquemas conceituais locais. Após serem unificados todos os conceitos presentes em todos os tipos de clusters, um esquema conceitual global preliminar é obtido. Inclusão de Relações de Herança e Reestruturação Para se obter o esquema conceitual global definitivo é preciso que o esquema preliminar gerado no passo anterior passe por alguns ajustes. Um deles é a inclusão de relações de herança, que procura descobrir se conceitos provenientes de esquemas conceituais diferentes possuem um relacionamento de herança entre si. 22 Isso é feito com o auxílio da base de dados terminológica e, se constatado a existência de tal relacionamento, este é definido no esquema global, se for considerado relevante pelo usuário. Outros ajustes fazem parte da reestruturação. Neste caso, ajustes automáticos e manuais são realizados para validar os resultados da unificação. Ajustes como validação das disjunções, remoção de relacionamentos redundantes e modificação de nomes de conceitos gerados automaticamente. Uma vez realizada esta reestruturação, obtém-se um esquema conceitual global definitivo, que é a saída do processo de integração do BInXS. 2.3 Linguagem de Especificação de Esquemas Conceituais Canônicos Os esquemas conceituais canônicos (ECCs) utilizados no trabalho são estruturas formadas por conceitos léxicos e não-léxicos, e por seus relacionamentos que podem ser de associação ou herança. Para a especificação desses esquemas, é utilizada neste trabalho a linguagem OWL. Sendo recomendada atualmente pela W3C para a representação de ontologias e definição de recursos na Web, a OWL é uma linguagem com marcação semântica muito clara e bem definida. Sendo assim cumpre bem os requisitos para representar os modelos conceituais envolvidos na integração semântica do BInXS. A notação da linguagem OWL é baseada em classes que representam entidades de esquemas conceituais. Essas classes possuem propriedades para descrever seus atributos e relacionamentos com outras classes. No BInXS, essas especificações são utilizadas para representar informações em três níveis: nível de metadados, nível de esquema e nível de dados. O nível de metadados é formado por classes cuja especificação, representa as características e propriedades básicas de conceitos e relacionamentos como pode ser visto na figura 4, que ilustra as classes de metadados que descrevem um ECC. 23 Figura 4: Esquema de metadados de um ECC [MELLO 2002] O nível de esquema é onde são representados os conceitos e relacionamentos dos ECCs propriamente ditos. A notação utilizada para este nível é a que está presente nos documentos OWL que são lidos e criados pelo gerador proposto neste trabalho para fazer a integração. Nesse nível cada conceito é representado por uma classe, que obrigatoriamente possui uma tag que descreve o seu tipo (léxico ou não léxico), além de tags para as informações de mapeamento. No caso dos conceitos léxicos, existe uma propriedade que descreve o tipo de dado, além de possíveis propriedades para informações de restrição e enumeração de valores. Na figura 5, pode se observar a estrutura de um conceito não léxico. Considerando como exemplo o domínio das corridas automobilísticas, este conceito representa o piloto. 24 Figura 5: Conceito não léxico Neste exemplo restrição allValuesFrom delimita um conjunto de outras classes que estão relacionadas com piloto. A figura 6 ilustra a notação de classe que representa o conceito léxico Name. Esta classe tem uma restrição do tipo hasValue, indicando qual o tipo de dado que este conceito pode ter, neste caso o seu valor é um String. Os relacionamentos também são representados por classes, pois podem ter nomes e papéis, além de poderem ter disjunções com outros relacionamentos [MELLO 2002]. O nome de uma classe de relacionamento é a concatenação dos nomes dos dois conceitos envolvidos. 25 Figura 6: Conceito léxico Para relacionamentos de associação, tem-se uma tag que descreve seu tipo (associação ou herança) e propriedades informam quais são os conceitos source e target, e suas cardinalidades, além de informações de mapeamento. Relacionamentos de herança possuem apenas propriedades relativas a identificação dos conceitos envolvidos e informações de mapeamento. Em ambos os tipos pode existir uma tag que descreve uma disjunção desta classe de relacionamento com outros relacionamentos, como pode ser observado na figura 7. Figura 7: Relacionamento de herança 26 Esta classe representa um relacionamento de herança entre os conceitos Champtionship e PilotsChampionship. Por sua vez, esse relacionamento é disjunto do outro relacionamento de herança ChamptionshipConstructorsChampionShip. Sendo assim, um campeonato pode ser de pilotos ou de construtores, mas não os dois simultaneamente. Um relacionamento de associação é ilustrado pela figura 8, onde os conceitos Pilot e Name são relacionados. A cardinalidade do relacionamento é definida pela restrição hasValue. Figura 8: Relacionamento de associação O nível de dados, último nível de especificação de um ECC, composto pelas instâncias dos conceitos e relacionamentos, diz respeito a resultados de consultas a fontes XML e não é abordado neste trabalho. Clusters de afinidade Como a proposta original do BInXS, não especifica como deve ser representado e armazenado os clusters de afinidade, o presente trabalho propõe a sua especificação também como uma classe OWL. 27 Cada cluster é representado por uma classe, que por sua vez é subclasse de algum metadado que descreve o tipo de cluster, ou seja, que tipo de conceitos ele engloba. Estas classes podem ser: LexicalCluster, NonLexicalCluster e MixedCluster. O exemplo da figura 9 mostra um cluster não léxico, que engloba os conceitos sinônimos Pilot e Driver. Essa informação é definida pela restrição allValuesFrom. Figura 9: Cluster não léxico 2.4 Considerações Finais Esse capítulo descreveu de uma forma geral a proposta do ambiente BInXS e o seu processo de geração de um esquema conceitual global, que pode representar de uma forma unificada diversas fontes de dados XML. Essa representação se dá por meio de conceitos e relacionamentos que formam um esquema conceitual canônico, especificado em notação OWL. Essa representação para os esquemas é bastante vantajosa em relação a outras propostas semelhantes, pois permite modelar a intenção semântica dos dados XML. Outra vantagem é a unificação semântica desses esquemas, que considera a determinação de equivalências e a resolução de conflitos. 28 3 Processo de Unificação O processo de unificação representa o passo principal dentro da integração semântica no BInXS, sendo o foco da implementação deste trabalho. Neste processo, os conceitos e relacionamentos dos esquemas conceituais locais são unificados, gerando conceitos globais que formarão um esquema conceitual global preliminar. Essa unificação é feita semiautomaticamente, através de regras de unificação específicas para cada tipo de cluster gerado no passo anterior (agrupamento de conceitos sinônimos). Estas regras visam à resolução de conflitos de heterogeneidade entre os conceitos de um mesmo cluster e seus relacionamentos [MELLO 2002]. Regras específicas se aplicam a cada um destes três casos de unificação: 1 – Caso L x L: Este caso é chamado de unificação léxica, quando são unificados conceitos presentes em um cluster léxico, ou seja, um cluster formado apenas por conceitos léxicos. Para cada cluster, um conceito global léxico é gerado como resultado. Existem regras para resolver os conflitos de tipo de dados e nome dos conceitos, que são explicados a seguir; 2 – Caso NL x NL: Neste caso, unificação não-léxica, são unificados os conceitos de um cluster não-léxico, formado apenas por conceitos não-léxicos. Como resultado um conceito global não-léxico é gerado. As regras definidas para este caso servem para resolver conflitos de nome de conceitos, de relacionamentos entre conceitos e de disjunções entre relacionamentos; 3 – Caso NL x L: Este caso é chamado unificação mista, onde são unificados conceitos que fazem parte de um cluster misto, ou seja, um cluster que possui tanto conceitos léxicos como conceitos não léxicos. Como resultado desta unificação é gerado um conceito global não-léxico que representa os conceitos não-léxicos presentes no cluster misto. Regras resolvem conflitos de relacionamentos e de nome. Para os conceitos léxicos presentes no cluster, é realizado um mapeamento para conceitos globais léxicos relacionados ao conceito global gerado para este cluster. Se este tipo de mapeamento não for possível, um conceito global léxico é gerado para representar estes conceitos. A figura 10 ilustra o processo de unificação através de um exemplo. 29 Figura 10: Processo de unificação [MELLO 2002] A unificação de esquemas é feita através de um algoritmo proposto em [MELLO 2002], que tem como entrada um conjunto de clusters de afinidade e a especificação de esquemas conceituais canônicos, gerando como saída um esquema global preliminar. 30 Nesse algoritmo, o esquema global gerado possui: um nome definido pelo usuário, um conjunto de conceitos globais léxicos, um conjunto de conceitos globais não-léxicos, um conjunto de relacionamentos entre os conceitos e um conjunto de disjunções entre os relacionamentos. Para cada cluster léxico é executada a unificação mista (L x L), para cada cluster não-léxico é executada a unificação não-léxica (NL x NL) e para cada cluster misto é executada a unificação mista (NL x L). O algoritmo inicialmente gera a especificação de um esquema conceitual global preliminar vazio, e progressivamente vai definindo os conceitos, relacionamentos e disjunções para o esquema. Os procedimentos para os três tipos de unificação são feitos na seguinte ordem: L x L, NL x NL e NL x L. A unificação dos clusters léxicos é executada primeiro, pois assim fica facilitada a unificação dos clusters não-léxicos e mistos, uma vez que, na unificação destes dois últimos é feita a unificação de relacionamentos e leva-se em consideração os conceitos destinos dos relacionamentos na determinação de afinidade entre relacionamentos. Estes conceitos destinos podem ser conceitos léxicos. Assim, a unificação de relacionamentos é facilitada bastante se alguns dos conceitos envolvidos já forem conceitos globais. Para a unificação dos clusters não-léxicos e mistos, a ordem de preferência é priorizada para os clusters que contenham conceitos que sejam generalizações de outros conceitos, uma vez que a unificação de conceitos especializados sofre influência dos relacionamentos dos conceitos mais genéricos. Conseqüentemente, dentre os clusters que possuem conceitos genéricos, é dada preferência para os clusters cujos conceitos tenham o maior nível na hierarquia de conceitos especializados, pois têm maior influência. A seguir, são apresentadas as regras para o tratamento de conflitos de nomes e para cada um dos três tipos de unificação de conceitos. 3.1 Unificação da Nomenclatura dos Conceitos Cada cluster pode manter vários conceitos com nomes diferentes. Como um único conceito global é gerado para cada cluster, um único nome deve ser definido para representar os conceitos integrantes que serão unificados. Para isto é aplicada a seguinte regra: para um determinado cluster, o nome do conceito global gerado na unificação dos conceitos integrantes, 31 será o que tiver o maior número de ocorrências entre todos os conceitos do cluster. Caso exista mais de um nome com o mesmo número majoritário de ocorrências, o nome do conceito global para este cluster é definido pelo usuário. Este nome escolhido pode ser o mesmo de um dos conceitos presentes no cluster, ou um sinônimo informado pelo usuário, que seja adequado a todos os conceitos. Estas regras para unificação de nomenclaturas são aplicadas a todos os clusters, não importando se são léxicos, não léxicos ou mistos. 3.2 Unificação Léxica A unificação léxica diz respeito à unificação de conceitos presentes em um cluster que contenha apenas conceitos léxicos. Para cada cluster, o resultado da unificação é a geração de um único conceito global léxico, que representa todos os conceitos integrantes do cluster. Esta unificação integra informações textuais das fontes XML, sendo que cada conceito léxico tem um nome, um tipo de dado e pode ou não possuir uma enumeração de valores permitidos. Na unificação de conceitos léxicos, para resolver conflitos de heterogeneidade relacionados a estas informações são aplicadas regras que unificam estas características para o conceito global léxico gerado. Para a unificação de nomenclaturas dos conceitos é utilizada a regra exposta na seção 3.1. Para a unificação do tipo de dado é aplicada a seguinte regra: o tipo de dado do conceito global léxico é o tipo mais genérico dentre o conjunto de tipos dos conceitos presentes no cluster, se houver compatibilidade entre todos os tipos. Caso não tenha essa compatibilidade, o tipo string é assumido. Exemplificando, se os conceitos a serem unificados forem do tipo float e integer, o tipo determinado para o conceito global será float, pois é um tipo mais genérico do que integer. Se os tipos a serem unificados forem integer e character, o tipo assumido pelo conceito global será string, pois não existe compatibilidade entre os dois tipos. Para unificação de enumerações de valores, a seguinte regra é aplicada: caso todos os conceitos integrantes do cluster léxico possuam enumeração de valores, o conceito global léxico gerado define uma enumeração igual à união da enumeração de todos os conceitos unificados. Os valores permitidos nessa enumeração final devem ser validados pelo usuário, para a eliminação 32 de redundância de valores sinônimos. Caso um ou mais conceitos do cluster não possuam enumeração de valores, o conceito global não terá enumeração. 3.3 Unificação Não-Léxica Na unificação não-léxica, são integrados os conceitos que pertencem a um cluster que possui apenas conceitos não-léxicos. Esta unificação corresponde à integração de informações estruturadas nas fontes XML, sendo que cada uma possui um nome e participa de relacionamentos que podem ou não ser disjuntos. A unificação dos nomes é feita pela regra citada na seção 3.1. As regras aplicadas para a unificação de relacionamentos e tratamento de disjunções são explicadas a seguir. 3.3.1 Unificação de Relacionamentos A unificação de relacionamentos é feita por pares de conceitos do cluster, de forma iterativa. Sendo assim, um par de conceitos de um determinado cluster não-léxico gera um conceito unificado que os substitui. Este conceito resulta da união dos relacionamentos dos dois conceitos anteriores. Por sua vez, ele será unificado com outro conceito do mesmo cluster, e assim em diante, até que reste apenas um conceito para este cluster, que será o conceito global. Quando se unificam os pares de conceitos (x e y), é possível que um relacionamento de um conceito x tenha afinidade com um relacionamento de um conceito y. Isso é determinado caso os relacionamentos de x e de y forem de associação e relacionam x e y com o mesmo conceito global ou com conceitos integrantes de um mesmo cluster de afinidade. Considera-se também afins relacionamentos de herança de x e de y caso ambos os conceitos sejam conceitos genéricos de um mesmo conceito global ou de conceitos que pertencem a um mesmo cluster de afinidade. Caso seja detectada afinidade entre dois relacionamentos, eles são unificados e representados por um único relacionamento. Se um relacionamento de x tiver afinidade com mais de um relacionamento de y (supondo que y tem mais de um relacionamento com um mesmo conceito, sendo estes relacionamentos identificados por papéis ou nomeados), o usuário deve escolher um dentre os relacionamentos de y para ser unificado com o de x. Caso não haja correspondência semântica entre o relacionamento de x e nenhum dos relacionamentos com 33 afinidade de y, o relacionamento de x deve ser representado no nível global. Para este relacionamento, um nome ou papel deve ser definido pelo usuário, para evitar conflitos com os relacionamentos de y. Se algum relacionamento de x não tiver afinidade com um relacionamento de y, pelo fato do relacionamento não estar definido em todos os esquemas que estão sendo integrados, e se ele for de associação, este relacionamento será opcional. Entretanto, se este relacionamento tiver afinidade com um relacionamento r, que esteja definido para um conceito z, sendo z um conceito genérico de y, este relacionamento será obrigatório para o conceito global. Isso desde que ele seja um relacionamento obrigatório para x, e que r seja um relacionamento obrigatório para z. Quando dois relacionamentos de dois conceitos presentes no cluster são unificados, um relacionamento é criado para o conceito global. Na definição deste relacionamento, tem-se o nome do conceito unificado e o do outro conceito global a qual ele se relaciona. Se este último ainda não foi unificado, o relacionamento é deixado indefinido, devendo este relacionamento ser posteriormente atualizado com o devido nome do conceito global, quando este for gerado. Ao unificar os relacionamentos com afinidade de x e y, as cardinalidades do relacionamento unificado são as mais gerais dentre as cardinalidades que partem de x e y e as cardinalidades que chegam a x e y. Quando um ou ambos os relacionamentos que estão sendo unificados possuem papéis ou nomes, o resultado da unificação deve ter a intervenção do usuário. Neste caso, ele deve decidir se eles têm a mesma intenção semântica para serem realmente unificados em um único relacionamento associado ao conceito global, definindo um nome ou papel adequado ao relacionamento. No caso de não possuírem a mesma intenção semântica, deve-se definir nomes ou papéis para ambos, mantendo ambos associados ao conceito global. Ao unificar dois relacionamentos afins que não possuem nomes ou papéis, mas que não tenham a mesma intenção semântica, é permitido ao usuário definir não um, mais dois relacionamentos globais com nomes ou papéis específicos para cada intenção semântica. Por exemplo, dois relacionamentos professor-cidade, onde em um esquema local esta cidade representa a cidade onde o professor trabalho e no outro, esta é a cidade onde o professor mora. Os relacionamentos têm afinidade, mas não têm a mesma intenção semântica. Neste caso o usuário pode definir dois relacionamentos para os mesmos conceitos. 34 Para situações tais que, quando relacionamentos forem unificados, o cluster que tem os conceitos destinos for não-léxico e já tiver sido unificado, já existirá um relacionamento para estes dois conceitos globais. Assim um novo relacionamento não precisa ser criado, bastando atualizar as cardinalidades do relacionamento existente com as dos relacionamentos dos conceitos que agora estão sendo unificados, prevalecendo as cardinalidades mais gerais. 3.3.2 Tratamento de Disjunções Dois conceitos não-léxicos x e y a serem unificados podem ter relacionamentos definidos como disjuntos. Deve ser feita uma análise destas disjunções para a correta definição de disjunções nos relacionamentos dos conceitos globais. Um algoritmo é proposto por [MELLO 2002] para o tratamento das disjunções, onde um conjunto de relacionamentos disjuntos D de x pode ser analisado em dois casos distintos: • Caso 1: Quando nenhum ou apenas um dos relacionamentos de y tem afinidade com algum relacionamento em D, uma disjunção é criada para os relacionamentos globais que correspondem aos relacionamentos de D; • Caso 2: Quando um conjunto de relacionamentos C de y têm afinidade com os relacionamentos de D e C possui dois ou mais relacionamentos, cada relacionamentos de C é tratado pelo seguinte procedimento: o Se o relacionamento for de associação e não for disjunto de nenhum outro relacionamento em C, o relacionamento correspondente para o conceito global é definido como opcional; o Considera-se uma disjunção para os relacionamentos do conceito global que compreende: o relacionamento global correspondente a este relacionamento analisado, os relacionamentos globais que correspondem aos relacionamentos de C que são disjuntos do relacionamento analisado e os relacionamentos globais correspondentes a relacionamentos de D que não têm afinidade com os relacionamentos de C. Essa disjunção só é representada no esquema global se: ela não tiver redundância com outra disjunção já definida para os relacionamentos do conceito global não estiver contida em outra disjunção definida para os relacionamentos do conceito global e se ela não conter 35 apenas este relacionamento analisado. Se uma disjunção já definida para os relacionamentos do conceito global estiver contida nesta agora criada, é feita a remoção da primeira. Este mesmo tratamento é aplicado para as disjunções que estão definidas para os conceitos de y. A figura 11 ilustra um exemplo para esse tratamento de disjunções. Figura 11: Exemplo de tratamento de disjunções Nesse exemplo encontra-se a disjunção que engloba o conjunto de relacionamentos D = {Journalist-Radio-Station, Journalist-Newspaper, Journalist-Publishing-House, Journalist-TVChannel} do esquema 1. Além disso, existe o conjunto de relacionamentos C = {Journalist-TVStarion, Journalist-Newspaper, Journalist-Radio-Station} que possuem afinidade com os relacionamentos de D. Considera-se que os conceitos TV-Channel e TV-Station façam parte do mesmo cluster de afinidade. Este exemplo se enquadra no caso 2, então cada relacionamento de C 36 é analisada separadamente. Primeiramente o relacionamento Journalist-TV-Station não é disjunto do relacionamento Journalist-Radio-Station, portanto o seu relacionamento correspondente no esquema global é definido como opcional. É definida uma disjunção envolvendo este relacionamento mais o Journalist-Newspaper e Journalist-Publishing-House que é o relacionamento de D que não possui afinidade com os relacionamentos de C. Em seguida o relacionamento Journalist-Newspaper é analisado, resultando em um relacionamento opcional no esquema global e uma disjunção que vem a ser redundante com a primeira que havia sido criada, sendo então ignorada. Depois com a análise de Journalist-Radio-Station, constata-se que ele não é disjunto dos outros relacionamentos de C, sendo portanto, definido como opcional no esquema global. Uma disjunção é definida para este relacionamento incluindo também o relacionamento Journalist-Publishing-House que não tem afinidade com nenhum dos relacionamentos de C. mas é disjunto dos conceitos afins no esquema 1. As duas disjunções geradas para o esquema global respeitam as disjunções dos dois esquemas locais, resolvendo seus conflitos. 3.4 Unificação Mista Na unificação mista, é feita a unificação de conceitos presentes em um cluster formado tanto por conceitos léxicos quanto por conceitos não-léxicos [MELLO 2002]. Sendo assim essa unificação integra informações textuais e estruturadas encontradas nas fontes XML, gerando um conceito global não-léxico como resultado, que representa todos os conceitos integrantes do cluster. O tipo não léxico foi escolhido por fornecer mais detalhes da organização dos dados. Para a unificação de um cluster misto, o nome do conceito global é definido pelas regras descritas na seção 3.1. Na seqüência, é feita a unificação não-léxica de todos os conceitos nãoléxicos presentes no cluster, gerando um conceito não-léxico c1. Depois disso, para cada conceito léxico presente no cluster, o usuário deve escolher uma entre três opções de tratamento para a representação deste conceito léxico no esquema global, dependendo da intenção semântica deste conceito: 1 – Se o conceito léxico tem a mesma intenção semântica de um conceito global léxico, que esteja relacionado direta ou indiretamente a c1, é feito um mapeamento para este conceito léxico relacionado que passa ser a sua representação global; 37 2 – Se não existir um conceito global léxico com a mesma intenção semântica, um novo conceito global léxico é definido no esquema global e relacionado a c1 através de um relacionamento de associação opcional; 3 – Caso o conteúdo do conceito léxico corresponda semanticamente à união dos conteúdos de vários conceitos globais ou a vários conteúdos de um ou mais conceitos globais (no caso de valores enumerados), ele se torna um conceito léxico global associado a uma especialização e1 criada para se associar a c1. Uma outra especialização e2 associada a c1 é definida para relacionar-se com os conjuntos de conceitos que possuem a mesma intenção semântica do conceito léxico do cluster misto. As duas especializações e1 e e2 criadas (conceitos não-léxicos) são disjuntas entre si. A figura 12 mostra um exemplo onde se aplica o tratamento 1, na unificação do cluster que contém os conceitos Journalist. O conceito léxico Name do esquema 1 tem a mesma intenção semântica do conceito léxico Journalist no esquema 2. Figura 12: Exemplo de unificação mista (1) Já a figura 13 ilustra um exemplo onde o tratamento 3 é aplicado pelo usuário, pois ele considera que o conteúdo do conceito léxico Journalist do esquema 2, corresponde a união dos conceitos léxicos FirstName e LastName do esquema 1. Sendo assim, duas alternativas especializadas não-léxicas para o conceito global Name são criadas. Uma representado o conceito Journalist do esquema 2, que é chamada de FullName. Este conceito é disjunto do conceito virtual DetailedName, que encapsula os outros relacionamentos de Name. 38 Figura 13: Exemplo de unificação mista (2) Caso o usuário não encontre um conceito global léxico que corresponda ao conceito léxico do cluster misto, ele tem a opção de postergar a representação global deste conceito, se nem todos os clusters mistos com conceitos relacionados a c1 estejam unificados. Ao final da unificação de todos os clusters mistos, obtêm-se como resultado um esquema conceitual global preliminar. Dentro da etapa de integração semântica do BInXS, ele ainda deve passar pelos passos de inclusão de relações de herança e reestruturação para, ao final, obter um esquema conceitual global definitivo. O presente trabalho, porém, não aborda estes passos, focando apenas neste passo de unificação de esquemas conceituais. 3.5 Considerações Finais Nesse capítulo foi descrito detalhadamente as regras para o processo de unificação do BInXS. O conjunto formal de regras propostas é conciso e eficiente, permitindo gerar uma fiel representação unificada de dois ou mais esquemas conceituais. 39 Utiliza-se os clusters de afinidade como agrupamentos de conceitos sinônimos, facilitando o tratamento da semântica dos esquemas. Regras e algoritmos mais complexos são aplicados para unificação dos relacionamentos entre os conceitos presentes nos esquemas conceituais. Vale ressaltar que o processo considera a necessidade da intervenção do usuário em determinadas etapas, especificando claramente como e onde devem ser feitas essas intervenções. 40 4 Projeto do Gerador O gerador proposto neste trabalho é desenvolvido na linguagem Java e implementa os procedimentos de unificação do BInXS descritos no capítulo anterior, permitindo ao usuário especialista no domínio intervir neste processo, quando necessário, para a geração do esquema global preliminar. Um ponto importante no projeto deste gerador é a interação com os esquemas conceituais locais. Como eles são armazenados em documentos OWL, é necessário que haja uma forma do gerador ler documentos OWL que representam os esquemas conceituais de entrada bem como meios de escrever e serializar o esquema conceitual global gerado pelo processo de integração, como um outro documento OWL de saída. Para resolver esse problema, foi escolhido como estrutura de suporte a estas tarefas de interação com documentos OWL o framework Jena [JENA 2007]. Este framework possui APIs para lidar exclusivamente com documentos OWL, facilitando a abstração das classes OWL para o algoritmo em Java. Uma série de métodos de interação permite ler um documento OWL, listar de várias formas suas propriedades, formular consultas específicas para obter algum dado, além de permitir a edição das classes OWL, modificando totalmente a sua estrutura. Também existem métodos que permitem criar novos esquemas OWL, inserir classes, elementos e atributos, modelando as várias propriedades de um esquema OWL e serializando estas informações em um documento OWL propriamente dito. A princípio, o Jena é um framework dedicado à manipulação de ontologias, mas suas funcionalidades se aplicam bem às necessidades do Gerador proposto. 4.1 Arquitetura O Gerador recebe como entrada dois esquemas conceituais armazenados em documentos OWL e um conjunto de clusters de afinidade, referentes aos conceitos destes esquemas, também especificados em notação OWL e armazenados em documentos deste tipo. A figura 14 mostra a arquitetura do Gerador. 41 Figura 14: Arquitetura do funcionamento do gerador O gerador inicialmente lê os documentos OWL (através do Jena) e cria objetos para representar esquemas, conceitos, relacionamentos e clusters, facilitando a manipulação destes elementos. Feito isso, o usuário dá início ao processo de unificação. Um esquema conceitual global preliminar vazio é criado no nível de objetos Java. Os clusters não léxicos são unificados um a 42 um, através de algoritmos específicos em um módulo de unificação L x L, sendo os conceitos resultantes deste processo gerados e inseridos no esquema global. Quando todos os clusters léxicos forem unificados, inicia-se a unificação não-léxica, no módulo de unificação NL x NL, onde os clusters não-léxicos são unificados, gerando conceitos globais não-léxicos e relacionamentos. Todos automaticamente vão sendo inseridos no esquema global. Após unificar todos os clusters não-léxicos, a unificação dos conceitos mistos é iniciada e executada pelo módulo de unificação NL x L. O Gerador produz os conceitos não-léxicos representantes de cada cluster, assim como possíveis novos conceitos léxicos necessários para resolver os conflitos de heterogeneidade. Todos os conceitos e relacionamentos que são inseridos no esquema global, assim como possíveis alterações nos conceitos e relacionamentos já inseridos são processados no nível de objetos Java. Em todos os módulos, a execução automática da unificação é interrompida quando necessário, para que o usuário especialista, através de uma interface apresentada dinamicamente, interfira no processo de unificação, escolhendo entre opções apresentadas, validando ações feitas automaticamente e inserindo informações como nomes de conceitos. Os clusters de afinidade são acessados por todos os módulos para busca e comparação de nomes de conceitos, permitindo verificar a afinidade entre os conceitos sempre que necessário. Estes clusters também são representados por objetos Java, para facilitar estas ações de comparação. Após a unificação de todos os clusters mistos, o Gerador encerra a criação do esquema conceitual global preliminar e este é serializado em um documento OWL. Esta tarefa também é realizada com o auxílio do framework Jena. 4.2 Implementação Java [JAVA 2007] foi a linguagem de programação escolhida para implementação do gerador. Java em sua essência, é uma linguagem para programação orientada a objetos, e conseqüentemente o desenvolvimento segue este paradigma. O programa é descrito por um conjunto de classes que possuem atributos e métodos e que são instanciados em objetos, durante a execução. Os atributos descrevem as características dos objetos, enquanto os métodos definem 43 o comportamento e as ações dos objetos. O projeto do gerador proposto foi desenvolvido especificamente com base na especificação Java SE (Java Standard Edition). Como ferramenta para o desenvolvimento, foi utilizada a IDE (Integrated Development Environment) Eclipse [ECLIPSE 2007] versão 3.3.1, um ambiente de desenvolvimento muito utilizado atualmente para programação com Java, devido a sua facilidade de uso e variedade de recursos, propiciada principalmente por sua grande extensibilidade. Esta característica é fundamentada pela utilização de plug-ins, encontrados em grande variedade na Web, dado que o desenvolvimento destes plug-ins é encorajado pelos desenvolvedores da ferramenta. 4.2.1 Arquitetura das Classes A criação das classes do programa é realizada com base no padrão MVC (Model-ViewControler). Este padrão de arquitetura de software, muito utilizada em aplicações para Web, divide a estrutura geral do programa em três camadas: • A camada de visão é onde fica a interface como o usuário, sendo através desta camada que o usuário interage com a aplicação através de recursos gráficos que permitem ao mesmo submeter ações para a aplicação e obter respostas da mesma. Nesta camada estão localizadas as classes que implementam a interface gráfica do gerador, ou seja, as telas que são apresentadas para o usuário; • A camada de modelo é formada por classes que representam os dados da aplicação, as entidades que abstraem a forma e as características destes dados. Nesta camada que ficam as classes que representam os esquemas conceituais, conceitos, relacionamentos e clusters, encontrados nos arquivos OWL de entrada e saída; • A camada de controle é responsável pela mediação da comunicação entre as outras duas camadas. Esta camada controla como as requisições vindas da camada de visão, irão interferir nas entidades da camada de modelo. Aqui estão localizadas as classes que implementam as regras de negócio do processo de unificação. As ações aqui são ativadas por chamadas da camada de visão, e utilizam as classes da camada de modelo, para criar, remover e modificar as propriedades das entidades. Este modelo de arquitetura apresenta como principais vantagens a modularização do software, desacoplando as classes e propiciando alguma independência entre as camadas. 44 Alterações na implementação das classes de uma camada tendem a surtir pouco efeito nas classes das outras camadas. Este gerador, no entanto não utiliza o conceito de classe de interface, geralmente utilizada em aplicações MVC por promover algumas características deste padrão, como a própria modularização das camadas e a facilidade na manutenção do software. Não foi observada a necessidade de utilização deste recurso, abstendo-se a seguir o modelo MVC principalmente como uma forma de estruturar a aplicação. Dentre os recursos oferecidos pela API do Jena estão a abstração das classes dos documentos OWL, assim como suas propriedades, para objetos definidos pela pelo framework. No entanto, o Jena é um framework cuja utilização é voltada para a criação e manipulação de ontologias, sendo assim, apresenta uma variedade muito grande de recursos, cuja finalidade está fora do escopo deste trabalho. Para facilitar a manipulação das entidades que representam as classes e afins, é feita uma conversão dos objetos do Jena para entidades próprias deste gerador, que são as classes presentes na camada de modelo. Estes objetos apresentam recursos que se adequam mais as necessidades da aplicação e aos objetivos deste trabalho. Na figura 15 pode-se observar o diagrama de classes da aplicação, feita seguindo a linguagem de especificação UML (Unified Modeling Language) para a modelagem e análise de software. Neste diagrama pode-se observar as características e disposição das classes descritas a seguir. Este diagrama, assim como todos os outros diagramas UML encontrados neste trabalho, foi criado utilizando o plugin do Eclipse Omondo [OMONDO 2007] para modelagem UML. Neste diagrama não estão representados todos os atributos e métodos de todas as classes, mas apenas os mais essenciais. São ilustrados os relacionamentos de composição e herança entre as classes. Uma classe representa o esquema conceitual, que é o conjunto de conceitos e relacionamentos entre eles. Como existem dois tipos de conceito, léxico e não-léxico, foi criada uma superclasse Conceito e duas subclasses, ConceitoLexico e ConceitoNaoLexico, que herdam a as características em comum da classe Conceito como um conjunto de relacionamentos de associação e de herança. Cada subclasse possui atributos específicos para cada uma como tipo de dado e valor para a classe ConceitoLexico. O mesmo acontece com as classes que representam os relacionamentos, onde as classes RelacionamentoAssociacao e RelacionamentoHeranca herdam as características em comum da superclasse Relacionamento. 45 Figura 15: Diagrama de classes do Gerador 46 Os clusters de afinidade também são representado, por uma classe que guarda uma lista de conceitos afins, alem do tipo do cluster (léxico, não-léxico ou misto). A classe ConjuntoClusters armazena uma lista de todos os clusters utilizados na execução do gerador. Outra classe chamada Metadados guarda o nome dos recursos que descrevem as classes OWL, que representam os conceitos e relacionamentos. Esta classe é formada por atributos estáticos, e é utilizada apenas como apoio para comparação na fase de conversão das classes OWL para objetos do modelo e vice-versa. As regras de negócio da fase de conversão do OWL para as entidades ficam na classe Controlador, que é também responsável por controlar todo o fluxo de execução das etapas do gerador. O algoritmo que implementa as regras de unificação dos esquemas conceituais está localizado em três classes, também da camada de controle. Uma para a unificação léxica, uma para a unificação não-léxica e outra para unificação mista. Como a primeira parte da unificação de cada cluster misto é de fato uma unificação de conceitos não-léxicos, a classe UnificadorMisto utiliza métodos da classe UnificadorNaoLexico para a execução destes passos. 4.2.2 Execução Na utilização do gerador, inicialmente o usuário deve selecionar como entrada, três documentos OWL, dois contendo os esquemas conceituais de entrada e outro contento o conjunto de clusters de afinidade referente aos conceitos dos esquemas conceituais citados. A partir daí, o gerador executa uma etapa de conversão das classes OWL que representam os conceitos, relacionamentos e clusters de afinidade para os objetos que são as entidades da camada de modelo que abstraem estes dados. Este passo é ilustrado na figura 16, em dois diagramas de seqüência. A classe controlador, utilizando a API do Jena, lê o arquivo que automaticamente é abstraído para um objeto da classe OntModel do Jena. O gerador então separa todos os conceitos léxicos, não-léxicos, relacionamentos de associação e de herança, para ai convertê-los para os objetos das classes próprias do gerador. Cada esquema é convertido separadamente a armazenado em um atributo da classe Controlador, que é uma instância da classe Esquema Conceitual. Cada conceito e cada relacionamento é representado como um objeto que guarda as informações necessárias para aplicação das regras de unificação, sendo que a classe Controlador 47 é a responsável por guardar em seus atributos referências para as unidades que representam as entradas do gerador o esquema conceitual um e o esquema conceitual dois. Figura 16: Diagrama de seqüência – leitura e geração dos esquemas de entrada O mesmo é feito para os clusters de afinidade. Para uma classe OWL que representa um cluster de afinidade é instanciado um objeto da classe Cluster, sendo que o controlador acaba por guardar um conjunto de clusters de afinidade. Após ter criado todas as entidades, inicia-se a fase de unificação. Para cada tipo de unificação é utilizada uma classe diferente que representa um módulo de unificação na arquitetura do gerador. São utilizadas uma classe para a unificação léxica, outra para a não léxica e uma para a unificação mista, respectivamente nesta ordem. Para cada uma destas instâncias a classe Controlador passa uma referência para a Tela de forma que estes possam chamar as telas de interação com o usuário sempre que necessário. Além disso, são passados também a lista de clusters de afinidade, uma referência para o esquema de entrada um, uma para o esquema de entrada dois, e ainda, uma para o esquema global, que no processo de unificação vai sendo preenchido com novas instancias de conceitos e 48 relacionamentos globais. Após cada unidade unificadora separar os clusters pertinentes a sua tarefa, ele inicia a execução do algoritmo que implementa as regras de unificação descritas no Capítulo 3 deste trabalho. Na parte da unificação mista, a classe UnificadorMisto faz chamadas a métodos da classe UnificadorNaoLexico, pois como já citado anteriormente, são feitas unificações de conceitos não léxicos dentro da unificação mista. A figura 17 ilustra a execução dos passos descritos através do exemplo da unificação léxica. Figura 17: Diagrama de seqüência – início da unificação léxica 4.3 Exemplo de Utilização Este trabalho não definiu uma interface gráfica que disponibilize uma visualização dos esquemas conceituais locais e do esquema global, visto que existem outros trabalho responsáveis por desenvolver uma interface gráfica mais completa para o ambiente BInXS. As telas que foram 49 desenvolvidas e que serão mostradas nesta seção, visam apenas a permitir a interferência do usuário no processo de unificação. Ao executar o gerador é apresentado ao usuário uma tela indicando que o gerador está pronto para a execução da unificação. Na seqüência é apresentada uma tela para a seleção dos dois documentos OWL onde estão armazenados os esquemas conceituais que se deseja unificar (figura 18). Figura 18: Tela de seleção dos documentos OWL Ao clicar em Procurar, é exibido uma tela padrão para seleção de arquivos no computador do usuário. Só são aceitos arquivos com a extensão .owl. Na seqüência, ele inicia a leitura do arquivo e conversão do OWL para as entidades do modelo. Ao final, é apresentada uma outra tela semelhante para a seleção do arquivo OWL contendo os clusters de afinidade relativos aos esquemas de entrada. É feita, então, a conversão desta vez para os clusters, gerando as entidades respectivas no modelo. Se os arquivos estiverem corretos, é apresentada para o usuário uma tela informando que o gerador está pronto para iniciar a unificação léxica. O usuário deve então confirmar para então iniciar o processo semi-automático de unificação. O gerador segue processando o algoritmo de unificação léxica e sempre que necessário apresenta para o usuário uma tela para a intervenção 50 dele no processo de unificação. Mais especificamente, neste caso da unificação léxica, pode eventualmente ser apresentada uma tela para o usuário informar que nome ele deseja que um novo conceito global tenha, como pode ser visto na figura 19. Isso acontece, quando, em um mesmo cluster, os dois conceitos a serem unificados tem um mesmo número majoritário de ocorrências. O usuário tem a opção de escolher entre o nome de um dos conceitos que serão unificados ou informar um outro sinônimo que seja mais adequado para representar o novo conceito global. Figura 19: Tela para escolha do nome do conceito global Os novos conceitos globais que vão sendo criados são instanciados e armazenados no esquema conceitual global. Quando todos os clusters léxicos já estiveram unificados, é apresentada para o usuário uma tela informando que a unificação não-léxica está pronta para iniciar. Ao confirmar, o usuário dá início ao processo de unificação não léxica. A tela de escolha de nomes pode ser apresentada quando necessário, da mesma forma que a unificação léxica. Neste tipo de unificação, relacionamentos são unificados e gerados. Assim sendo, algumas telas acabam sendo necessárias em certas situações. Sempre que são 51 detectados dois relacionamentos com afinidade (conectam um dos conceitos unificados com um mesmo conceito global ou pertencente ao mesmo cluster de afinidade) é apresentada uma tela para que o usuário possa indicar se eles têm ou não a mesma intenção semântica (figura 20). Figura 20: Tela para indicação de correspondência semântica entre relacionamentos Se o usuário indicar que sim, é gerado um único relacionamento global representando a unificação dos dois relacionamentos. Se algum deles possuir nome ou papéis, é apresentada uma tela para o usuário informar um nome, ou duas para informar papéis para o novo relacionamento no esquema global (figura 21). Se o usuário indicar que os relacionamentos não têm correspondência semântica, os dois relacionamentos serão representados no esquema conceitual global como relacionamentos opcionais. Neste caso, duas telas são apresentadas seguidamente para o usuário informar um nome ou os papéis para cada um dos novos relacionamentos globais. Quando for detectado que um relacionamento de um esquema tem afinidade com mais de um relacionamento do outro esquema é apresentado uma tela permitindo ao usuário selecionar em um combo box qual destes relacionamentos tem correspondência semânticas com o primeiro (figura 22). 52 Figura 21: Tela para informar o nome do novo relacionamento global Figura 22: Tela para seleção de relacionamento equivalente 53 No caso do usuário indicar que nenhum dos relacionamentos tem equivalência semântica com o primeiro, um terceiro relacionamento será gerado e representado no esquema global juntamente com os outros. Neste caso, o usuário deve informar no campo de texto ao lado um nome ou papéis para este novo relacionamento global, de forma a evitar conflitos semânticos com os outros relacionamentos. Quando todos os clusters não-léxicos estiverem unificados, uma tela é então apresentada para o usuário informando que o gerador pode começar a unificação mista. Para esta fase, além das telas já apresentadas anteriormente uma nova tela de interação é necessária. Após unificar todos os conceitos não-léxicos de um cluster misto, o gerador trata separadamente cada conceito léxico do cluster. Para cada um, ele apresenta para o usuário uma tela para que este possa indicar se o respectivo conceito léxico tem a mesma intenção semântica de algum dos conceitos relacionados direta ou indiretamente com o conceito não léxico gerado pela pré-unificação nãoléxica deste mesmo cluster (figura 23). Figura 23: Tela para unificação tratamento de conceito léxico na unificação mista Para este caso, o usuário tem as seguintes opções: 54 • Se ele selecionar “sim”, ele deve indicar em um combo Box, qual conceito tem correspondência semântica com este. Os dois conceitos serão representados por um único conceito global; • Se o usuário selecionar “sim, mais de um” ele deve indicar quais conceitos têm a mesma intenção semântica deste. Para isso, ao clicar em selecionar, é apresentada uma pequena tela para seleção dos conceitos (figura 24). Então, o gerador segue o procedimento explicado na Seção 3.4 deste trabalho; • Ao selecionar “não”, um novo conceito léxico é gerado no esquema conceitual global, para representá-lo, relacionando-o, com cardinalidade opcional com o conceito não-léxico gerando pelo mesmo cluster; • Se selecionar “postergar decisão”, o usuário pode esperar continuar a unificação mista de outros conceitos, esperando que o conceito correspondente semanticamente surja mais tarde. Figura 24: Tela para seleção de conceitos correspondentes na unificação mista 55 Ao final, quando todos os clusters mistos estiverem unificados, é apresentada ao usuário uma tela indicando o fim da unificação dos esquemas conceituais de entrada. O usuário deve informar um nome para o novo documento OWL de saída que irá armazenar o esquema conceitual global, e uma local para sua gravação. O gerador então faz uma conversão reversa do esquema global em objetos para uma classe OntModel do Jena e, utilizando um recurso do framework, serializa o esquema global em um documento OWL que é a saída do gerador. 56 5 Conclusão O presente trabalho apresentou o estudo e a implementação de uma das principais etapas do processo suportado pelo BInXS, que é a unificação e geração de um esquema conceitual global a partir de esquemas conceituas locais. A implementação do conjunto de regras proposto por [MELLO 2002], vem contribuir com o desenvolvimento de mais um módulo do ambiente BInXS. Módulo este que, juntamente com outros já desenvolvidos e alguns ainda por serem implementados, virão a formar um ambiente complexo, que através de técnicas apuradas de unificação semântica de dados, disponibiliza uma forma de acesso unificado à fontes heterogêneas de dados XML na Web. Este que é uma tema de pesquisa atualmente em grande evidência na comunidade de banco de dados, além de pesquisas na área de semântica de dados, ainda parece se situar isoladamente no meio acadêmico. Porém, com o crescimento exponencial da utilização da Web, e conseqüentemente do volume de dados disponível na mesma, a tendência parece ser a preocupação com a extração de significados dos dados para diversos fins. Uma abordagem neste sentido é a adotada pelo BInXS, que procura estruturar e representar conceitualmente dados XML de forma a gerar uma representação unificada de diversas fontes heterogêneas pertencentes a um mesmo domínio de conhecimento. Durante a pesquisa e o desenvolvimento deste trabalho focou-se em projetar e implementar um módulo de software, com regras de negócio bem definidas, assim como as entradas e saídas e o resultado final do gerador. Procurou-se utilizar as boas práticas de programação e projeto, para criar uma implementação bem estruturada, de forma a facilitar a integração deste módulo com os outros, já desenvolvidos ou de desenvolvimento futuro. Padrões de desenvolvimento bastante difundidos foram utilizados, bem como a linguagem Java, já utilizada na implementação dos outros módulos do ambiente BInXS. Atualmente o projeto do BInXS já difere um pouco da proposta original [MELLO 2002], graças a contribuições de outros trabalhos desenvolvidos, como a adoção da linguagem OWL como notação para os esquemas conceituais [FRANTZ 2004] e a possível utilização de uma banco de dados terminológico para determinação de equivalências e geração dos clusters de afinidade [SILVA 2005]. Desta forma no presente trabalho procurou-se utilizar os padrões mais 57 atualizados, para a implementação, visto que, com o andamento constante de pesquisas, o projeto do BInXS sempre pode estar sendo modificado e adaptado a novos padrões e tecnologias. 5.1 Trabalhos Futuros Como trabalhos futuros, relacionados principalmente com esta etapa de unificação do BInXS, estão a implementação dos passos de inclusão de relações de herança e reestruturação do esquema global gerando pela corrente implementação, visto que sua saída é apenas um esquema conceitual global preliminar, que necessita de um refinamento e ajustes finais. Desta forma será possível gerar o esquema conceitual global final. Outro trabalho que ainda deve ser implementado são as regras que envolvem as informações de mapeamento dos conceitos presentes nos esquemas para os dados das fontes XML, nesta etapa de unificação, visto que a resolução deste problema não foi abordada no escopo deste trabalho. Além disso, outro trabalho a ser desenvolvido futuramente é a integração de todos os módulos do BInXS, concebendo enfim uma representação completa e única deste ambiente de integração. Esta implementação deve integrar as saídas e entradas de cada módulo, com uma interface amigável e eficiente em todas as etapas, viabilizando a operação do usuário especialista em todo o sistema. 58 Referências [DOAN 2001] DOAN, AnHai; DOMINGOS, Pedro; HALEVY, Alon. Reconciling Schemas of Disparate Data Sources: A Machine-Learning Approach. In: ACM INTERNATIONAL CONFERENCE ON MANAGEMENT OF DATA, SIGMOD, 2001., 2001, Santa Barbara, USA. Proceedings… [S.l.: s.n.], 2001. p. 509-520. [ECLIPSE 2007] Eclipse, An Open Development <http://www.eclipse.org>. Acesso em: jul. 2007. Platform. Disponível em [FRANTZ 2004] FRANTZ, Arthur Pereira. Um Processo de Conversão de XML Schemas para Esquemas Conceituais. Trabalho de Conclusão de Curso. Departamento de Informática e Estatística, UFSC: Florianópolis, 2004. [HALPIN 98] HALPIN, Terry. Object-Role Modeling (ORM/NIAM), Handbook on Architectures of Information Systems. [S.l.]: Springer-Verlag, 1998. p. 81-102. [JAVA 2007] Sun Microsystems. Disponível em < http://java.sun.com/>. Acesso em: jul. 2007. [JENA 2007] A Semantic Web Framework for Java. Hewlett-Packard Development Company, LP. Disponível em <http://jena.sourceforge.net>. Acesso em: mai. 2007. [LUDäSCHER 99] LUDäSCHER, Bertram. et al. View Definition and DTD Inference for XML. In: WORKSHOP ON QUERY PROCESSING FOR SEMISTRUCTURED DATA AND NON-STANDARD DATA FORMATS, ICDT, 1999, Jerusalém, Israel. Procedings… [S.l.: s.n.], 1999. [MCGUINNES & HARMELEN 2004] MCGUINESS, Deborah L.; HARMELEN, Frank van. OWL Web Ontology Language Overview. Disponível em <http://www.w3.org/TR/owlfeatures/>. Acesso em: mai. 2007. [MELLO 2000] MELLO, Ronaldo dos Santos; DORNELES, Carina Friedrich; KADE, Adrovane; BRAGANHOLO, Vanessa de Paula; HEUSER, Carlos Alberto. Dados SemiEstruturados. SBBD 2000. [MELLO 2002] MELLO, Ronaldo dos Santos. Uma abordagem bottom-up para a integração semântica de esquemas XML. Tese de Doutorado. PPGC da UFRGS: Porto Alegre, 2002. [MELLO 2005] MELLO, Ronaldo dos Santos; HEUSER, Carlos Alberto. BInXS: A Process for Integration of XML Schemata. CAiSE 2005, LNCS 3520, pp. 151-166, 2005 [MELLO, CASTANO, HEUSER 2002] MELLO, Ronaldo dos Santos.; CASTANO, Silvana.; HEUSER, Carlos Alberto. A Method for the Unification of XML Schemata. Information and Software Technology, v.44, n.4, p. 241-249, mar 2002. 59 [OMONDO 2007] Omondo, The Live UML <http://www.eclipsedownload.com>. Acesso em: set. 2007. Company. Disponível em [REYNAUD 2001] REYNAUD, Chantal; SIROT, Jean Pierre; VODISLAV, Dan. Semantic Integration of XML Heterogeneous Data Sources. In: INTERNATIONAL DATABASE ENGINEERING & APPLICATIONS SYMPOSIUM, IDEAS, 2001, Grenoble, France. Proceedings… Los Alamitos: IEEE, 2001. p. 199-208. [RODRIGUEZ 2001] RODRIGUEZ-GIANOLLI, Patricia; MYLOPOULOS, John. A Semantic Approach to XML-Based Data Integration. In: INTERNATIONAL CONFERENCE ON CONCEPTUAL MODELING, ER, 20., 2001, Yokohama, Japan. Conceptual Modeling: proceedings. Berlin: Springer-Verlag, 2001. p. 117-132. [SILVA 2005] SILVA, Fabrício Santos da. Projeto de uma Base de Dados Terminológica. Trabalho de Conclusão de Curso. Departamento de Informática e Estatística, UFSC: Florianópolis, 2005. [XML 2007] Extensible Markup Language. World Wide Web Consortium (W3C). Disponível em <http://www.w3c.org/xml> . Acesso em: fev. 2007. [XML SCHEMA 2007] XML Schema. World Wide Web Consortium (W3C). Disponível em <http://www.w3c.org/xml/schema> . Acesso em: fev. 2007. 60 Anexo 1 – Artigo 61 Gerador de Esquema Conceitual Global através da Integração de Esquemas Conceituais Locais de Fontes de Dados XML no Ambiente BInXS Lucas Duarte Silveira INE – Departamento de Informática e Estatística UFSC – Universidade Federal de Santa Catarina [email protected] Resumo. XML é uma linguagem de marcação muito utilizada para a representação e troca de dados na Web. O fato de ela apresentar uma grande flexibilidade estrutural, faz com que existam uma grande heterogeneidade entre dados que representam informações de um mesmo domínio. Isso gera uma grande dificuldade quando se deseja consultar dados de diferentes fontes. O presente artigo propõe a implementação e o desenvolvimento de um gerador que desempenhe uma das últimas etapas do processo realizado pelo ambiente BInXS (Bottom-Up Integration of XML Schemata)., que é a integração semântica de esquemas conceituais locais, gerados em etapas anteriores do processo. Este esquema conceitual global é a representação geral dos esquemas heterogêneos anteriores e permite o acesso unificado à todas as fontes de dados que originaram estes esquemas. Palavras-chave: Integração de Esquemas, Dados Heterogêneos, Esquema Conceitual, Esquema Canônico, OWL. Abstract. XML is a markup language very utilized for the representation and exchange of data in the Web. The fact of presenting a great structural flexibility, incites de existence of a huge heterogeneity between data that represent information of a same domain. Also, it engenders such a vast difficulty when consulting data of different fonts. The present article proposes the implementation and development of a generator, which attends one of the last stages of the process consummated by the ambient BInXS (Bottom-Up Integration of XML Schemata). that is a semantic integration of local conceptual schemes, generated at previous stages of the process. This global conceptual scheme is the general representation of the previous heterogeneous schemes, furthermore, it allows the unified access for all of the sources of data that produces these schemes. Key words: Scheme Integration, Heterogeneous Data, Conceptual Scheme, Canonic Scheme, OWL. 1 Introdução XML (eXtensible Markup Language) é uma linguagem de marcação, padrão da W3C (World Wide Web Consortium), para a representação de dados semi-estruturados [XML 2007]. Geralmente a utilização de um documento XML é acompanhada de documentos que definem o seu esquema, como DTDs e XML Schemas [XML SCHEMA 2007]. Por representar dados semiestruturados, os dados XML podem apresentar grande heterogeneidade por causa 62 de sua alta flexibilidade o que faz com que seus esquemas geralmente sejam extensos para que possam suportar a gama de representações alternativas que um dado pode possuir [MELLO 2002]. Este fato, aliado ao grande e crescente volume de dados disponíveis na Web, faz com que várias fontes de dados XML apresentem diferenças nas suas representações, mesmo as que são parte de um mesmo domínio de aplicação. Considerando essas características dos dados XML, surge a necessidade de se disponibilizar uma forma de acesso unificado às várias fontes de dados heterogêneos de um mesmo domínio de aplicação. Alguns trabalhos na literatura tentam resolver esse problema como: MIX [LUDäSCHER 99], Xyleme [REYNAUD 2001], LSD [DOAN 2001], DIXSE [RODRIGUEZ 2001] e o BInXS [MELLO 2002]. Este trabalho está inserido no contexto da abordagem BInXS. Em relação aos outros trabalhos citados, o BInXS apresenta como principais vantagens [MELLO 2002]: • Uma representação canônica conceitual para esquemas XML com relacionamentos de herança e associação que modelam a intenção semântica dos dados; • Um processo de integração semântica para estes esquemas conceituais gerados, considerando a determinação de equivalências e a resolução de conflitos para representações semi-estruturadas. O resultado deste processo é um esquema conceitual global. A representação canônica conceitual para os esquemas XML é feita por esquemas conceituais. Estes esquemas são obtidos em uma das primeiras etapas do BInXS, num processo de engenharia reversa dos esquemas XML, através de uma análise detalhada do esquema e das instâncias XML de cada fonte de dados. Os esquemas conceituais gerados baseiam-se no modelo ORM/NIAM (Object with Role Model/Natural Language Information Analysis Method) [HALPIN 98] e são armazenados na forma de documentos OWL (Web Ontology Language) [MCGUINNES & HARMELEN 2004], que são uma recomendação recente da W3C para o armazenamento de ontologias e esquemas conceituais. Na etapa de Integração Semântica, onde é feita a integração semântica dos esquemas conceituais, são tratados casos específicos na unificação de dois tipos de elementos (estruturados e texto). Para resolver o problema da definição de equivalência entre os conceitos a serem unificados o BInXS faz o uso de clusters de afinidade, onde conceitos com o mesmo valor semântico são agrupados. Estes clusters de afinidade são criados com o auxílio de Bases de Dados Terminológicas [SILVA 2005]. Depois de aplicadas uma série de regras para unificação dos conceitos e dos relacionamentos, e resolvendo os possíveis conflitos entre as representações (sub-etapa chamada Unificação), obtém-se como resultado um esquema conceitual global preliminar, que é a representação unificada dos esquemas conceituais anteriores. O presente trabalho propõe a implementação da sub-etapa de Unificação do BInXS. Ela tem como objetivo principal o desenvolvimento de um gerador que recebe como entrada dois esquemas conceituais, armazenados em documentos OWL, e realiza com base nas regras de unificação estabelecidas pelo BInXS, a integração semântica dos conceitos e relacionamentos dos dois esquemas conceituais. O gerador deve obter como saída um esquema conceitual global preliminar, também armazenado em um documento OWL, que é a representação unificada dos dois esquemas locais. 63 Principalmente, é implementado as formas como o usuário intervém no processo através de interfaces específicas. representação semântica unificada de todos os esquemas XML de entrada. Os passos que compõem esta etapa são detalhados a seguir. 2 BInXS O BInXS foi concebido como parte de uma camada de mediação de um sistema para o gerenciamento de dados semiestruturados. Sendo assim, sua função principal é a integração e unificação semântica dos esquemas das fontes (esquemas XML Schema e/ou DTDs (Document Type Definition)) locais a serem consultadas. 2.1 Processo de Integração O processo de integração do BInXS é dividido em duas etapas principais [MELLO 2002]. A primeira é a etapa de Conversão dos esquemas XML e DTDs associados às fontes XML para esquemas conceituais canônicos locais. Nesta etapa não só os esquemas são analisados, como também o conteúdo dos dados XML, ou seja as instâncias XML. A segunda etapa é a Integração Semântica dos esquemas canônicos gerados na etapa anterior, através da integração semântica destes esquemas conceituais. Essa integração gera um esquema conceitual global, além de informações de mapeamento dos seus conceitos para com todos os elementos e atributos nas fontes XML que tenham equivalência semântica. A seguir, a última etapa, de Integração Semântica é descrita com mais detalhes. 2.2.2 Integração Semântica Na etapa de integração semântica, os esquemas conceituais gerados na fase anterior são unificados, gerando um esquema conceitual global que é uma Figura 1: Exemplo de esquema conceitual [MELLO 2002] Agrupamento de Conceitos Sinônimos O primeiro passo para a realização da integração semântica é o agrupamento de conceitos sinônimos. Neste passo é feita uma análise dos conceitos presentes nos esquemas conceituais que serão unificados, com o intuito de criar grupos de conceitos sinônimos chamados clusters de afinidade [MELLO 2002]. Cada cluster de afinidade contém os conceitos que possuem um mesmo significado. Conceitos de esquemas diferentes que são equivalentes semanticamente. Para fazer a determinação de equivalência semântica dos conceitos e criação dos clusters de afinidade, são utilizadas bases de dados terminológicas. Estas bases mantêm termos e relacionamentos semânticos entre eles, para várias línguas, sendo semelhante a um thesaurus. Os clusters definidos automaticamente podem ser validados pelo usuário. 64 Unificação Uma vez gerados os clusters de afinidade, vem o passo principal da integração: a unificação. É neste passo que o presente trabalho está focado. As regras e o funcionamento geral desta etapa são explicados mais detalhadamente no capítulo 3. Aqui são apresentados de forma geral os principais conceitos envolvidos no passo da unificação. A unificação dos esquemas é realizada tendo como entrada dois esquemas conceituais locais e obtendo como saída um esquema conceitual global. Este processo é recursivo, sendo que este esquema conceitual global gerado pode ser integrado a outro esquema conceitual local, e assim por diante. Desta forma, vários esquemas conceituais podem ser integrados num único esquema conceitual global. Na unificação são resolvidos conflitos de nomes, relacionamentos e disjunções, considerando os tipos dos conceitos que estão presentes em cada cluster [MELLO, CASTANO, HEUSER 2002]. Neste caso três tipos de unificação podem existir. Quando um cluster possui apenas conceitos léxicos (unificação L x L), a unificação deste cluster produz um único conceito global do tipo léxico. O tipo deste conceito será o tipo mais genérico dos tipos presentes no cluster. O nome do conceito será o que tiver a maior freqüência no cluster e, se necessário, é decidido pelo usuário. Quando um cluster tem apenas conceitos não-léxicos (unificação NL x NL), a unificação dos conceitos resulta em um conceito global não-léxico. Todos os relacionamentos dos conceitos locais são considerados no conceito global. Se um relacionamento do mesmo tipo acontece entre os conceitos de um cluster em ambos os esquemas conceituais, este é unificado e representado no esquema conceitual global uma única vez, relacionando os conceitos globais correspondentes. Para a cardinalidade de relacionamentos de associação, vale a cardinalidade mais geral dentre as cardinalidades dos relacionamentos envolvidos [MELLO 2002]. Para relacionamentos disjuntos, se não existe conflito entre dois ou mais relacionamentos presentes nos dois esquemas conceituais, a disjunção é representada no esquema conceitual global. Caso contrário, se dois ou mais relacionamentos são disjuntos em um esquema conceitual, mas os relacionamentos equivalentes, presentes no outro esquema não são disjuntos entre si, essa disjunção não é representada no esquema global. Em compensação, neste caso de conflito para relacionamentos de associação, estes são representados como opcionais no esquema global (cardinalidade (0,N)). Finalmente, quando o cluster é formado por conceitos léxicos e não-léxicos (unificação NL x L), uma representação global não-léxica é utilizada no esquema global. Desta forma a representação global do conceito terá mais detalhes e será mais completa. Algumas vezes, é necessária a criação de um novo conceito léxico associado para representar o valor do conceito local no esquema global, ou um conceito não-léxico global com alternativas léxicas e não-léxicas associadas para representar os conceitos dos dois esquemas conceituais locais. Após serem unificados todos os conceitos presentes em todos os tipos de clusters, um esquema conceitual global preliminar é obtido. 3 Processo de Unificação O processo de unificação representa o passo principal dentro da integração semântica no BInXS, sendo o foco da implementação deste trabalho. Neste processo, os conceitos e relacionamentos dos esquemas conceituais locais são 65 unificados, gerando conceitos globais que formarão um esquema conceitual global preliminar. Essa unificação é feita semiautomaticamente, através de regras de unificação específicas para cada tipo de cluster gerado no passo anterior (agrupamento de conceitos sinônimos). Estas regras visam à resolução de conflitos de heterogeneidade entre os conceitos de um mesmo cluster e seus relacionamentos [MELLO 2002]. Regras específicas se aplicam a cada um destes três casos de unificação: 1 – Caso L x L: Este caso é chamado de unificação léxica, quando são unificados conceitos presentes em um cluster léxico, ou seja, um cluster formado apenas por conceitos léxicos. Para cada cluster, um conceito global léxico é gerado como resultado. Existem regras para resolver os conflitos de tipo de dados e nome dos conceitos, que são explicados a seguir; 2 – Caso NL x NL: Neste caso, unificação não-léxica, são unificados os conceitos de um cluster não-léxico, formado apenas por conceitos não-léxicos. Como resultado um conceito global não-léxico é gerado. As regras definidas para este caso servem para resolver conflitos de nome de conceitos, de relacionamentos entre conceitos e de disjunções entre relacionamentos; 3 – Caso NL x L: Este caso é chamado unificação mista, onde são unificados conceitos que fazem parte de um cluster misto, ou seja, um cluster que possui tanto conceitos léxicos como conceitos não léxicos. Como resultado desta unificação é gerado um conceito global não-léxico que representa os conceitos não-léxicos presentes no cluster misto. Regras resolvem conflitos de relacionamentos e de nome. Para os conceitos léxicos presentes no cluster, é realizado um mapeamento para conceitos globais léxicos relacionados ao conceito global gerado para este cluster. Se este tipo de mapeamento não for possível, um conceito global léxico é gerado para representar estes conceitos. A unificação de esquemas é feita através de um algoritmo proposto em [MELLO 2002], que tem como entrada um conjunto de clusters de afinidade e a especificação de esquemas conceituais canônicos, gerando como saída um esquema global preliminar. Nesse algoritmo, o esquema global gerado possui: um nome definido pelo usuário, um conjunto de conceitos globais léxicos, um conjunto de conceitos globais não-léxicos, um conjunto de relacionamentos entre os conceitos e um conjunto de disjunções entre os relacionamentos. Para cada cluster léxico é executada a unificação mista (L x L), para cada cluster não-léxico é executada a unificação não-léxica (NL x NL) e para cada cluster misto é executada a unificação mista (NL x L). O algoritmo inicialmente gera a especificação de um esquema conceitual global preliminar vazio, e progressivamente vai definindo os conceitos, relacionamentos e disjunções para o esquema. Os procedimentos para os três tipos de unificação são feitos na seguinte ordem: L x L, NL x NL e NL x L. A unificação dos clusters léxicos é executada primeiro, pois assim fica facilitada a unificação dos clusters nãoléxicos e mistos, uma vez que, na unificação destes dois últimos é feita a unificação de relacionamentos e leva-se em consideração os conceitos destinos dos relacionamentos na determinação de afinidade entre relacionamentos. Estes conceitos destinos podem ser conceitos léxicos. Assim, a unificação de relacionamentos é facilitada bastante se alguns dos conceitos envolvidos já forem conceitos globais. Para a unificação dos clusters nãoléxicos e mistos, a ordem de preferência é priorizada para os clusters que contenham 66 conceitos que sejam generalizações de outros conceitos, uma vez que a unificação de conceitos especializados sofre influência dos relacionamentos dos conceitos mais genéricos. Conseqüentemente, dentre os clusters que possuem conceitos genéricos, é dada preferência para os clusters cujos conceitos tenham o maior nível na hierarquia de conceitos especializados, pois têm maior influência. 4 Projeto do Gerador O gerador proposto neste trabalho é desenvolvido na linguagem Java e implementa os procedimentos de unificação do BInXS descritos no capítulo anterior, permitindo ao usuário especialista no domínio intervir neste processo, quando necessário, para a geração do esquema global preliminar. Um ponto importante no projeto deste gerador é a interação com os esquemas conceituais locais. Como eles são armazenados em documentos OWL, é necessário que haja uma forma do gerador ler documentos OWL que representam os esquemas conceituais de entrada bem como meios de escrever e serializar o esquema conceitual global gerado pelo processo de integração, como um outro documento OWL de saída. Para resolver esse problema, foi escolhido como estrutura de suporte a estas tarefas de interação com documentos OWL o framework Jena [JENA 2007]. Este framework possui APIs para lidar exclusivamente com documentos OWL, facilitando a abstração das classes OWL para o algoritmo em Java. Uma série de métodos de interação permite ler um documento OWL, listar de várias formas suas propriedades, formular consultas específicas para obter algum dado, além de permitir a edição das classes OWL, modificando totalmente a sua estrutura. Também existem métodos que permitem criar novos esquemas OWL, inserir classes, elementos e atributos, modelando as várias propriedades de um esquema OWL e serializando estas informações em um documento OWL propriamente dito. A princípio, o Jena é um framework dedicado à manipulação de ontologias, mas suas funcionalidades se aplicam bem às necessidades do Gerador proposto. 4.1 Arquitetura O Gerador recebe como entrada dois esquemas conceituais armazenados em documentos OWL e um conjunto de clusters de afinidade, referentes aos conceitos destes esquemas, também especificados em notação OWL e armazenados em documentos deste tipo. A figura 2 mostra a arquitetura do Gerador. Figura 2: Arquitetura do funcionamento do gerador 67 O gerador inicialmente lê os documentos OWL (através do Jena) e cria objetos para representar esquemas, conceitos, relacionamentos e clusters, facilitando a manipulação destes elementos. Feito isso, o usuário dá início ao processo de unificação. Um esquema conceitual global preliminar vazio é criado no nível de objetos Java. Os clusters não léxicos são unificados um a um, através de algoritmos específicos em um módulo de unificação L x L, sendo os conceitos resultantes deste processo gerados e inseridos no esquema global. Quando todos os clusters léxicos forem unificados, inicia-se a unificação nãoléxica, no módulo de unificação NL x NL, onde os clusters não-léxicos são unificados, gerando conceitos globais não-léxicos e relacionamentos. Todos automaticamente vão sendo inseridos no esquema global. Após unificar todos os clusters nãoléxicos, a unificação dos conceitos mistos é iniciada e executada pelo módulo de unificação NL x L. O Gerador produz os conceitos não-léxicos representantes de cada cluster, assim como possíveis novos conceitos léxicos necessários para resolver os conflitos de heterogeneidade. Todos os conceitos e relacionamentos que são inseridos no esquema global, assim como possíveis alterações nos conceitos e relacionamentos já inseridos são processados no nível de objetos Java. Em todos os módulos, a execução automática da unificação é interrompida quando necessário, para que o usuário especialista, através de uma interface apresentada dinamicamente, interfira no processo de unificação, escolhendo entre opções apresentadas, validando ações feitas automaticamente e inserindo informações como nomes de conceitos. Os clusters de afinidade são acessados por todos os módulos para busca e comparação de nomes de conceitos, permitindo verificar a afinidade entre os conceitos sempre que necessário. Estes clusters também são representados por objetos Java, para facilitar estas ações de comparação. Após a unificação de todos os clusters mistos, o Gerador encerra a criação do esquema conceitual global preliminar e este é serializado em um documento OWL. Esta tarefa também é realizada com o auxílio do framework Jena. 4.2 Implementação Java [JAVA 2007] foi a linguagem de programação escolhida para implementação do gerador. Java em sua essência, é uma linguagem para programação orientada a objetos, e conseqüentemente o desenvolvimento segue este paradigma. O programa é descrito por um conjunto de classes que possuem atributos e métodos e que são instanciados em objetos, durante a execução. Os atributos descrevem as características dos objetos, enquanto os métodos definem o comportamento e as ações dos objetos. O projeto do gerador proposto foi desenvolvido especificamente com base na especificação Java SE (Java Standard Edition). Como ferramenta para o desenvolvimento, foi utilizada a IDE (Integrated Development Environment) Eclipse [ECLIPSE 2007] versão 3.3.1, um ambiente de desenvolvimento muito utilizado atualmente para programação com Java, devido a sua facilidade de uso e variedade de recursos, propiciada principalmente por sua grande extensibilidade. Esta característica é fundamentada pela utilização de plug-ins, encontrados em grande variedade na Web, dado que o desenvolvimento destes plug-ins é encorajado pelos desenvolvedores da ferramenta. 68 4.2.1 Arquitetura das Classes A criação das classes do programa é realizada com base no padrão MVC (Model-View-Controler). Este padrão de arquitetura de software, muito utilizada em aplicações para Web, divide a estrutura geral do programa em três camadas: • A camada de visão é onde fica a interface como o usuário, sendo através desta camada que o usuário interage com a aplicação através de recursos gráficos que permitem ao mesmo submeter ações para a aplicação e obter respostas da mesma. Nesta camada estão localizadas as classes que implementam a interface gráfica do gerador, ou seja, as telas que são apresentadas para o usuário; • A camada de modelo é formada por classes que representam os dados da aplicação, as entidades que abstraem a forma e as características destes dados. Nesta camada que ficam as classes que representam os esquemas conceituais, conceitos, relacionamentos e clusters, encontrados nos arquivos OWL de entrada e saída; • A camada de controle é responsável pela mediação da comunicação entre as outras duas camadas. Esta camada controla como as requisições vindas da camada de visão, irão interferir nas entidades da camada de modelo. Aqui estão localizadas as classes que implementam as regras de negócio do processo de unificação. As ações aqui são ativadas por chamadas da camada de visão, e utilizam as classes da camada de modelo, para criar, remover e modificar as propriedades das entidades. Este modelo de arquitetura apresenta como principais vantagens a modularização do software, desacoplando as classes e propiciando alguma independência entre as camadas. Alterações na implementação das classes de uma camada tendem a surtir pouco efeito nas classes das outras camadas. Este gerador, no entanto não utiliza o conceito de classe de interface, geralmente utilizada em aplicações MVC por promover algumas características deste padrão, como a própria modularização das camadas e a facilidade na manutenção do software. Não foi observada a necessidade de utilização deste recurso, abstendo-se a seguir o modelo MVC principalmente como uma forma de estruturar a aplicação. Dentre os recursos oferecidos pela API do Jena estão a abstração das classes dos documentos OWL, assim como suas propriedades, para objetos definidos pela pelo framework. No entanto, o Jena é um framework cuja utilização é voltada para a criação e manipulação de ontologias, sendo assim, apresenta uma variedade muito grande de recursos, cuja finalidade está fora do escopo deste trabalho. Para facilitar a manipulação das entidades que representam as classes e afins, é feita uma conversão dos objetos do Jena para entidades próprias deste gerador, que são as classes presentes na camada de modelo. Estes objetos apresentam recursos que se adequam mais as necessidades da aplicação e aos objetivos deste trabalho. Uma classe representa o esquema conceitual, que é o conjunto de conceitos e relacionamentos entre eles. Como existem dois tipos de conceito, léxico e não-léxico, foi criada uma superclasse Conceito e duas subclasses, ConceitoLexico e ConceitoNaoLexico, que herdam a as características em comum da classe Conceito como um conjunto de relacionamentos de associação e de herança. Cada subclasse possui atributos específicos para cada uma como tipo de dado e valor 69 para a classe ConceitoLexico. O mesmo acontece com as classes que representam os relacionamentos, onde as classes RelacionamentoAssociacao e RelacionamentoHeranca herdam as características em comum da superclasse Relacionamento. Os clusters de afinidade também são representado, por uma classe que guarda uma lista de conceitos afins, alem do tipo do cluster (léxico, não-léxico ou misto). A classe ConjuntoClusters armazena uma lista de todos os clusters utilizados na execução do gerador. Outra classe chamada Metadados guarda o nome dos recursos que descrevem as classes OWL, que representam os conceitos e relacionamentos. Esta classe é formada por atributos estáticos, e é utilizada apenas como apoio para comparação na fase de conversão das classes OWL para objetos do modelo e vice-versa. As regras de negócio da fase de conversão do OWL para as entidades ficam na classe Controlador, que é também responsável por controlar todo o fluxo de execução das etapas do gerador. O algoritmo que implementa as regras de unificação dos esquemas conceituais está localizado em três classes, também da camada de controle. Uma para a unificação léxica, uma para a unificação não-léxica e outra para unificação mista. Como a primeira parte da unificação de cada cluster misto é de fato uma unificação de conceitos não-léxicos, a classe UnificadorMisto utiliza métodos da classe UnificadorNaoLexico para a execução destes passos. 4.2.2 Execução Na utilização do gerador, inicialmente o usuário deve selecionar como entrada, três documentos OWL, dois contendo os esquemas conceituais de entrada e outro contento o conjunto de clusters de afinidade referente aos conceitos dos esquemas conceituais citados. A partir daí, o gerador executa uma etapa de conversão das classes OWL que representam os conceitos, relacionamentos e clusters de afinidade para os objetos que são as entidades da camada de modelo que abstraem estes dados. Este passo é ilustrado na figura 16, em dois diagramas de seqüência. A classe controlador, utilizando a API do Jena, lê o arquivo que automaticamente é abstraído para um objeto da classe OntModel do Jena. O gerador então separa todos os conceitos léxicos, nãoléxicos, relacionamentos de associação e de herança, para ai convertê-los para os objetos das classes próprias do gerador. Cada esquema é convertido separadamente a armazenado em um atributo da classe Controlador, que é uma instância da classe Esquema Conceitual. Cada conceito e cada relacionamento é representado como um objeto que guarda as informações necessárias para aplicação das regras de unificação, sendo que a classe Controlador é a responsável por guardar em seus atributos referências para as unidades que representam as entradas do gerador o esquema conceitual um e o esquema conceitual dois. Este trabalho não definiu uma interface gráfica que disponibilize uma visualização dos esquemas conceituais locais e do esquema global, visto que existem outros trabalho responsáveis por desenvolver uma interface gráfica mais completa para o ambiente BInXS. 70 Figura 3: Exemplo de tela para intervenção do usuário 5 Conclusão O presente trabalho apresentou o estudo e a implementação de uma das principais etapas do processo suportado pelo BInXS, que é a unificação e geração de um esquema conceitual global a partir de esquemas conceituas locais. A implementação do conjunto de regras proposto por [MELLO 2002], vem contribuir com o desenvolvimento de mais um módulo do ambiente BInXS. Módulo este que, juntamente com outros já desenvolvidos e alguns ainda por serem implementados, virão a formar um ambiente complexo, que através de técnicas apuradas de unificação semântica de dados, disponibiliza uma forma de acesso unificado à fontes heterogêneas de dados XML na Web. Este que é uma tema de pesquisa atualmente em grande evidência na comunidade de banco de dados, além de pesquisas na área de semântica de dados, ainda parece se situar isoladamente no meio acadêmico. Porém, com o crescimento exponencial da utilização da Web, e conseqüentemente do volume de dados disponível na mesma, a tendência parece ser a preocupação com a extração de significados dos dados para diversos fins. Uma abordagem neste sentido é a adotada pelo BInXS, que procura estruturar e representar conceitualmente dados XML de forma a gerar uma representação unificada de diversas fontes heterogêneas pertencentes a um mesmo domínio de conhecimento. Durante a pesquisa e o desenvolvimento deste trabalho focou-se em projetar e implementar um módulo de software, com regras de negócio bem definidas, assim como as entradas e saídas e o resultado final do gerador. Procurou-se utilizar as boas práticas de programação e projeto, para criar uma implementação bem estruturada, de forma a facilitar a integração deste módulo com os outros, já desenvolvidos ou de desenvolvimento futuro. Padrões de desenvolvimento bastante difundidos foram utilizados, bem como a linguagem Java, já utilizada na implementação dos outros módulos do ambiente BInXS. Atualmente o projeto do BInXS já difere um pouco da proposta original [MELLO 2002], graças a contribuições de outros trabalhos desenvolvidos, como a adoção da linguagem OWL como notação para os esquemas conceituais [FRANTZ 2004] e a possível utilização de uma banco de dados terminológico para determinação de equivalências e geração dos clusters de afinidade [SILVA 2005]. Desta forma no presente trabalho procurou-se utilizar os padrões mais atualizados, para a implementação, visto que, com o andamento constante de pesquisas, o projeto do BInXS sempre pode estar sendo modificado e adaptado a novos padrões e tecnologias. Referências [DOAN 2001] DOAN, AnHai; DOMINGOS, Pedro; HALEVY, Alon. Reconciling Schemas of Disparate Data Sources: A Machine-Learning Approach. In: ACM INTERNATIONAL CONFERENCE ON MANAGEMENT OF DATA, SIGMOD, 2001., 2001, Santa Barbara, USA. Proceedings… [S.l.: s.n.], 2001. p. 509-520. 71 [ECLIPSE 2007] Eclipse, An Open Development Platform. Disponível em <http://www.eclipse.org>. Acesso em: jul. 2007. [FRANTZ 2004] FRANTZ, Arthur Pereira. Um Processo de Conversão de XML Schemas para Esquemas Conceituais. Trabalho de Conclusão de Curso. Departamento de Informática e Estatística, UFSC: Florianópolis, 2004. [HALPIN 98] HALPIN, Terry. Object-Role Modeling (ORM/NIAM), Handbook on Architectures of Information Systems. [S.l.]: Springer-Verlag, 1998. p. 81-102. [JAVA 2007] Sun Microsystems. Disponível em < http://java.sun.com/>. Acesso em: jul. 2007. [JENA 2007] A Semantic Web Framework for Java. Hewlett-Packard Development Company, LP. Disponível em <http://jena.sourceforge.net>. Acesso em: mai. 2007. [LUDäSCHER 99] LUDäSCHER, Bertram. et al. View Definition and DTD Inference for XML. In: WORKSHOP ON QUERY PROCESSING FOR SEMISTRUCTURED DATA AND NONSTANDARD DATA FORMATS, ICDT, 1999, Jerusalém, Israel. Procedings… [S.l.: s.n.], 1999. [MCGUINNES & HARMELEN 2004] MCGUINESS, Deborah L.; HARMELEN, Frank van. OWL Web Ontology Language Overview. Disponível em <http://www.w3.org/TR/owlfeatures/>. Acesso em: mai. 2007. [MELLO 2000] MELLO, Ronaldo dos Santos; DORNELES, Carina Friedrich; KADE, Adrovane; BRAGANHOLO, Vanessa de Paula; HEUSER, Carlos Alberto. Dados Semi-Estruturados. SBBD 2000. [MELLO 2002] MELLO, Ronaldo dos Santos. Uma abordagem bottom-up para a integração semântica de esquemas XML. Tese de Doutorado. PPGC da UFRGS: Porto Alegre, 2002. [MELLO 2005] MELLO, Ronaldo dos Santos; HEUSER, Carlos Alberto. BInXS: A Process for Integration of XML Schemata. CAiSE 2005, LNCS 3520, pp. 151-166, 2005 [MELLO, CASTANO, HEUSER 2002] MELLO, Ronaldo dos Santos.; CASTANO, Silvana.; HEUSER, Carlos Alberto. A Method for the Unification of XML Schemata. Information and Software Technology, v.44, n.4, p. 241-249, mar 2002. [OMONDO 2007] Omondo, The Live UML Company. Disponível em <http://www.eclipsedownload.com>. Acesso em: set. 2007. [REYNAUD 2001] REYNAUD, Chantal; SIROT, Jean Pierre; VODISLAV, Dan. Semantic Integration of XML Heterogeneous Data Sources. In: INTERNATIONAL DATABASE ENGINEERING & APPLICATIONS SYMPOSIUM, IDEAS, 2001, Grenoble, France. Proceedings… Los Alamitos: IEEE, 2001. p. 199208. [RODRIGUEZ 2001] RODRIGUEZ-GIANOLLI, Patricia; MYLOPOULOS, John. A Semantic Approach to XML-Based Data Integration. In: INTERNATIONAL CONFERENCE ON CONCEPTUAL MODELING, ER, 20., 2001, Yokohama, Japan. Conceptual Modeling: proceedings. Berlin: Springer-Verlag, 2001. p. 117132. [SILVA 2005] SILVA, Fabrício Santos da. Projeto de uma Base de Dados Terminológica. Trabalho de Conclusão de Curso. Departamento de Informática e Estatística, UFSC: Florianópolis, 2005. [XML 2007] Extensible Markup Language. World Wide Web Consortium (W3C). Disponível em <http://www.w3c.org/xml> . Acesso em: fev. 2007. [XML SCHEMA 2007] XML Schema. World Wide Web Consortium (W3C). Disponível em <http://www.w3c.org/xml/schema> . Acesso em: fev. 2007. 72 Anexo 2 – Código Fonte package binx.unificador.principal.view; import java.io.File; import javax.swing.filechooser.FileFilter; public class UmFileFilter extends FileFilter { @Override public boolean accept(File file) { String fileName = file.getName().toLowerCase(); if(file.isDirectory()){ return true; }else{ return fileName.endsWith(".owl"); } } @Override public String getDescription() { return "Ontology Web Language (*.owl)"; } } package binx.unificador.principal.view; import java.io.File; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.UIManager; public class FileChooser { public JFileChooser chooser; public String filePath; public FileChooser() { this.configuraFileChooser(); chooser = new JFileChooser(); 73 // chooser.setDialogTitle("Abrir Arquivo..."); chooser.setAcceptAllFileFilterUsed(false); chooser.setMultiSelectionEnabled(false); chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);// VER ISSO chooser.setCurrentDirectory(new File(System.getProperty("user.dir"))); chooser.addChoosableFileFilter(new UmFileFilter()); } public String escolherArquivo(JFrame tela) { int retorno = chooser.showOpenDialog(tela); if(JFileChooser.APPROVE_OPTION == retorno) { filePath = chooser.getSelectedFile().getAbsolutePath(); } return filePath; } public void configuraFileChooser() { UIManager.put("FileChooser.saveButtonText", "Salvar"); UIManager.put("FileChooser.directorySaveButtonText", "Salvar Arquivo"); UIManager.put("FileChooser.saveButtonToolTipText", "Salvar Arquivo"); UIManager.put("FileChooser.openButtonText", "Abrir"); UIManager.put("FileChooser.cancelButtonText", "Cancelar"); UIManager.put("FileChooser.directoryCancelButtonText", "Cancelar"); UIManager.put("FileChooser.lookInLabelText", "Examinar: "); UIManager.put("FileChooser.fileNameLabelText", "Nome do Arquivo: "); UIManager.put("FileChooser.filesOfTypeLabelText", "Arquivos do Tipo: "); UIManager.put("FileChooser.lookInLabelText", "Examinar"); UIManager.put("FileChooser.saveInLabelText", "Salvar em"); UIManager.put("FileChooser.fileNameLabelMnemonic", new Integer('N')); // N UIManager.put("FileChooser.filesOfTypeLabelMnemonic", new Integer('T')); // T UIManager.put("FileChooser.upFolderToolTipText", "Um nível acima"); UIManager.put("FileChooser.upFolderAccessibleName", "Um nível acima"); UIManager.put("FileChooser.homeFolderToolTipText", "Desktop"); UIManager.put("FileChooser.homeFolderAccessibleName", "Desktop"); UIManager.put("FileChooser.newFolderToolTipText", "Criar nova pasta"); UIManager.put("FileChooser.newFolderAccessibleName", "Criar nova pasta"); UIManager.put("FileChooser.listViewButtonToolTipText", "Lista"); UIManager.put("FileChooser.listViewButtonAccessibleName", "Lista"); UIManager.put("FileChooser.detailsViewButtonToolTipText", "Detalhes"); UIManager.put("FileChooser.detailsViewButtonAccessibleName", "Detalhes"); UIManager.put("FileChooser.fileNameHeaderText", "Nome"); UIManager.put("FileChooser.fileSizeHeaderText", "Tamanho"); UIManager.put("FileChooser.fileTypeHeaderText", "Tipo"); UIManager.put("FileChooser.fileDateHeaderText", "Data"); UIManager.put("FileChooser.fileAttrHeaderText", "Atributos"); 74 UIManager.put("OptionPane.noButtonText", "Não"); UIManager.put("OptionPane.yesButtonText", "Sim"); UIManager.put("OptionPane.cancelButtonText", "Cancelar"); } } package binx.unificador.principal.view; import java.awt.BorderLayout; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.io.FileNotFoundException; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextField; import binx.unificador.principal.Controlador; public class Tela extends JFrame { Controlador controlador; private JPanel panel; private JButton botaoIniciar; private JButton botaoContinuarUm; private JButton botaoContinuarDois; private JButton botaoFechar; private JButton botaoProcurar1; private JButton botaoProcurar2; private JButton botaoProcurar3; private JLabel labelTitulo; private JLabel labelTituloClusters; private JLabel labelTituloClusters2; private JLabel labelEsquema1; private JLabel labelEsquema2; private JLabel labelArquivo1; private JLabel labelArquivo2; private JLabel labelArquivo3; private JTextField entradaArquivoUm; private JTextField entradaArquivoDois; private JTextField entradaArquivoTres; public Tela(Controlador umControlador) { 75 super("Unificador de Esquemas Conceituais"); this.controlador = umControlador; panel = new JPanel(); botaoIniciar = new JButton("Iniciar a unificação"); botaoContinuarUm = new JButton("Continuar"); botaoContinuarDois = new JButton("Continuar"); botaoFechar = new JButton("Fechar"); botaoProcurar1 = new JButton("Procurar"); botaoProcurar2 = new JButton("Procurar"); botaoProcurar3 = new JButton("Procurar"); labelTitulo = new JLabel("Selecione os arquivos contendo os esquemas conceituais que deseja unificar:"); labelTituloClusters = new JLabel("Selecione o arquivo contendo os clusters de afinidade correspondentes"); labelTituloClusters2 = new JLabel("aos esquemas conceituais de entrada:"); labelEsquema1 = new JLabel("Esquema Conceitual 1"); labelEsquema2 = new JLabel("Esquema Conceitual 2"); labelArquivo1 = new JLabel("Arquivo:"); labelArquivo2 = new JLabel("Arquivo:"); labelArquivo3 = new JLabel("Arquivo:"); entradaArquivoUm = new JTextField(); entradaArquivoDois = new JTextField(); entradaArquivoTres = new JTextField(); this.montaTela(); } public void montaTela() { this.setSize(600, 400); this.setLocationRelativeTo(null); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //Adiciona e configura os JLabels this.getContentPane().add(labelTitulo); labelTitulo.setBounds(73, 20, 500, 30); labelTitulo.setVisible(false); this.getContentPane().add(labelTituloClusters); labelTituloClusters.setBounds(73, 20, 500, 30); labelTituloClusters.setVisible(false); this.getContentPane().add(labelTituloClusters2); labelTituloClusters2.setBounds(73, 40, 400, 30); labelTituloClusters2.setVisible(false); 76 this.getContentPane().add(labelEsquema1); labelEsquema1.setBounds(17, 80, 130, 80); labelEsquema1.setVisible(false); this.getContentPane().add(labelArquivo1); labelArquivo1.setBounds(17, 101, 80, 80); labelArquivo1.setVisible(false); this.getContentPane().add(labelEsquema2); labelEsquema2.setBounds(17, 150, 130, 80); labelEsquema2.setVisible(false); this.getContentPane().add(labelArquivo2); labelArquivo2.setBounds(17, 171, 80, 80); labelArquivo2.setVisible(false); this.getContentPane().add(labelArquivo3); labelArquivo3.setBounds(17, 150, 80, 80); labelArquivo3.setVisible(false); //Adiciona e configura os JTextFields this.getContentPane().add(entradaArquivoUm); entradaArquivoUm.setBounds(70, 130, 418, 22); entradaArquivoUm.setVisible(false); this.getContentPane().add(entradaArquivoDois); entradaArquivoDois.setBounds(70, 200, 418, 22); entradaArquivoDois.setVisible(false); this.getContentPane().add(entradaArquivoTres); entradaArquivoTres.setBounds(70, 179, 418, 22); entradaArquivoTres.setVisible(false); //Adiciona e configura os JButtons this.getContentPane().add(botaoContinuarUm); botaoContinuarUm.setBounds(390, 323, 90, 28); botaoContinuarUm.setEnabled(false); botaoContinuarUm.setVisible(false); this.getContentPane().add(botaoContinuarDois); botaoContinuarDois.setBounds(390, 323, 90, 28); botaoContinuarDois.setEnabled(false); botaoContinuarDois.setVisible(false); this.getContentPane().add(botaoFechar); 77 botaoFechar.setBounds(483, 323, 90, 28); botaoFechar.setVisible(false); this.getContentPane().add(botaoProcurar1); botaoProcurar1.setBounds(490, 128, 85, 25); botaoProcurar1.setVisible(false); this.getContentPane().add(botaoProcurar2); botaoProcurar2.setBounds(490, 198, 85, 25); botaoProcurar2.setVisible(false); this.getContentPane().add(botaoProcurar3); botaoProcurar3.setBounds(490, 177, 85, 25); botaoProcurar3.setVisible(false); this.getContentPane().add(botaoIniciar); botaoIniciar.setBounds(220, 195, 150, 40); //Adiciona e configura os Listeners dos JButtons botaoContinuarUm.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent evt) { if(botaoContinuarUm.isEnabled()){ continuarUmMouseClicked(evt); } } }); botaoContinuarDois.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent evt) { if(botaoContinuarDois.isEnabled()){ continuarDoisMouseClicked(evt); } } }); botaoFechar.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent evt) { fecharMouseClicked(evt); } }); botaoProcurar1.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent evt) { procurarUmMouseClicked(evt); } }); 78 botaoProcurar2.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent evt) { procurarDoisMouseClicked(evt); } }); botaoProcurar3.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent evt) { procurarTresMouseClicked(evt); } }); botaoIniciar.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent evt) { iniciarMouseClicked(evt); } }); panel.setBounds(1, 1, 800, 600); this.getContentPane().add(panel, BorderLayout.CENTER); this.setVisible(true); } public void iniciarMouseClicked(MouseEvent evt){ botaoIniciar.setVisible(false); botaoContinuarUm.setVisible(true); botaoFechar.setVisible(true); botaoProcurar1.setVisible(true); botaoProcurar2.setVisible(true); labelTitulo.setVisible(true); labelEsquema1.setVisible(true); labelEsquema2.setVisible(true); labelArquivo1.setVisible(true); labelArquivo2.setVisible(true); entradaArquivoUm.setVisible(true); entradaArquivoDois.setVisible(true); } public void continuarUmMouseClicked(MouseEvent evt) { try { botaoContinuarUm.setEnabled(false); botaoProcurar1.setEnabled(false); botaoProcurar2.setEnabled(false); this.carregarEsquemasEntrada(); botaoContinuarUm.setVisible(false); botaoProcurar1.setVisible(false); 79 botaoProcurar2.setVisible(false); labelTitulo.setVisible(false); labelEsquema1.setVisible(false); labelEsquema2.setVisible(false); labelArquivo1.setVisible(false); labelArquivo2.setVisible(false); entradaArquivoUm.setVisible(false); entradaArquivoDois.setVisible(false); botaoContinuarDois.setVisible(true); labelTituloClusters.setVisible(true); labelTituloClusters2.setVisible(true); labelArquivo3.setVisible(true); entradaArquivoTres.setVisible(true); botaoProcurar3.setVisible(true); } catch(Exception fnfE) { fnfE.printStackTrace(); JOptionPane.showMessageDialog(null, "Falha ao carregar arquivos.\n\n" + "Nome do arquivo, da pasta, do volume ou \nconteúdo do arquivo está incorreto", "Arquivo Não Enconrado", JOptionPane.WARNING_MESSAGE); botaoContinuarUm.setEnabled(true); botaoProcurar1.setEnabled(true); botaoProcurar2.setEnabled(true); } } public void continuarDoisMouseClicked(MouseEvent evt) { try { botaoContinuarDois.setEnabled(false); botaoProcurar3.setEnabled(false); this.carregarClusters(); botaoContinuarDois.setVisible(false); labelTituloClusters.setVisible(false); labelTituloClusters2.setVisible(false); labelArquivo3.setVisible(false); entradaArquivoTres.setVisible(false); botaoProcurar3.setVisible(false); } catch(Exception fnfE) { JOptionPane.showMessageDialog(null, "Falha ao carregar arquivo.\n\n" + "Nome do arquivo, da pasta, do volume ou \nconteúdo do arquivo está incorreto", "Arquivo Não Enconrado", JOptionPane.WARNING_MESSAGE); botaoContinuarDois.setEnabled(true); 80 botaoProcurar3.setEnabled(true); } } public void fecharMouseClicked(MouseEvent evt) { System.exit(0); } public void procurarUmMouseClicked(MouseEvent evt) { try { FileChooser fileChooser = new FileChooser(); entradaArquivoUm.setText(fileChooser.escolherArquivo(this)); fileChooser = null; } catch(Exception e) { JOptionPane.showMessageDialog(null, "Erro ao procurar o arquivo :"+ e.getMessage(), "Erro", JOptionPane.ERROR_MESSAGE); } this.liberaBotaoContinuaUm(); } public void procurarDoisMouseClicked(MouseEvent evt) { try { FileChooser fileChooser = new FileChooser(); entradaArquivoDois.setText(fileChooser.escolherArquivo(this)); fileChooser = null; } catch(Exception e) { JOptionPane.showMessageDialog(null, "Erro ao procurar o arquivo :"+ e.getMessage(), "Erro", JOptionPane.ERROR_MESSAGE); } this.liberaBotaoContinuaUm(); } public void procurarTresMouseClicked(MouseEvent evt) { try { FileChooser fileChooser = new FileChooser(); entradaArquivoTres.setText(fileChooser.escolherArquivo(this)); fileChooser = null; } catch(Exception e) { JOptionPane.showMessageDialog(null, "Erro ao procurar o arquivo :"+ e.getMessage(), JOptionPane.ERROR_MESSAGE); } "Erro", 81 this.liberaBotaoContinuaDois(); } public boolean liberaBotaoContinuaUm() { if(entradaArquivoUm.getText().endsWith(".owl") && entradaArquivoDois.getText().endsWith(".owl")) { botaoContinuarUm.setEnabled(true); return true; } else { botaoContinuarUm.setEnabled(false); return false; } } public boolean liberaBotaoContinuaDois() { if(entradaArquivoTres.getText().endsWith(".owl")) { botaoContinuarDois.setEnabled(true); return true; } else { botaoContinuarDois.setEnabled(false); return false; } } public void carregarEsquemasEntrada() throws Exception { controlador.criaModelosEntrada(entradaArquivoUm.getText(), entradaArquivoDois.getText()); } public void carregarClusters() throws Exception { controlador.criaModeloClusters(entradaArquivoTres.getText()); } public String nomeConceitoDois) { mostraTelaEscolhaNome(String return null; } public void mostraTelaSelecaoRelacAfin() { } public void mostraTelaIndicaSemanticaRelac() { } nomeConceitoUm, String 82 public void mostraTelaEscolhaUnificacaoMista() { } } package br.com.lucas.telas; import java.awt.BorderLayout; import javax.swing.JButton; import javax.swing.JPanel; import javax.swing.SwingUtilities; import javax.swing.WindowConstants; /** * This code was edited or generated using CloudGarden's Jigloo * SWT/Swing GUI Builder, which is free for non-commercial * use. If Jigloo is being used commercially (ie, by a corporation, * company or business for any purpose whatever) then you * should purchase a license for each developer using Jigloo. * Please visit www.cloudgarden.com for details. * Use of Jigloo implies acceptance of these licensing terms. * A COMMERCIAL LICENSE HAS NOT BEEN PURCHASED FOR * THIS MACHINE, SO JIGLOO OR THIS CODE CANNOT BE USED * LEGALLY FOR ANY CORPORATE OR COMMERCIAL PURPOSE. */ public class TelaUm extends javax.swing.JFrame { private JPanel panel; private JButton botaoContinuar; private JButton botaoFechar; /** * Auto-generated main method to display this JFrame */ public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { TelaUm inst = new TelaUm(); inst.setLocationRelativeTo(null); inst.setVisible(true); } }); } public TelaUm() { super(); 83 initGUI(); } private void initGUI() { try { setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); { panel = new JPanel(); getContentPane().add(getPanel(), BorderLayout.CENTER); // panel.setLayout(panelLayout); panel.setSize(800, 600); panel.setPreferredSize(new java.awt.Dimension(584, 364)); panel.setLayout(null); { botaoFechar = new JButton(); panel.add(botaoFechar); botaoFechar.setText("Fechar"); botaoFechar.setBounds(483, 323, 90, 28); botaoFechar.setFont(new java.awt.Font("Arial",1,12)); botaoFechar.setOpaque(false); botaoFechar.setAlignmentX(483.0f); botaoFechar.setAlignmentY(323.0f); } { botaoContinuar = new JButton(); panel.add(botaoContinuar); botaoContinuar.setText("Continuar"); botaoContinuar.setBounds(390, 323, 90, 28); botaoContinuar.setFont(new java.awt.Font("Arial",1,12)); botaoContinuar.setAlignmentX(390.0f); botaoContinuar.setAlignmentY(323.0f); } } pack(); this.setSize(600, 400); } catch (Exception e) { e.printStackTrace(); } } public JPanel getPanel() { return panel; } 84 } package br.com.lucas.telas; import java.awt.BorderLayout; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JTextField; import javax.swing.SwingUtilities; import javax.swing.WindowConstants; /** * This code was edited or generated using CloudGarden's Jigloo * SWT/Swing GUI Builder, which is free for non-commercial * use. If Jigloo is being used commercially (ie, by a corporation, * company or business for any purpose whatever) then you * should purchase a license for each developer using Jigloo. * Please visit www.cloudgarden.com for details. * Use of Jigloo implies acceptance of these licensing terms. * A COMMERCIAL LICENSE HAS NOT BEEN PURCHASED FOR * THIS MACHINE, SO JIGLOO OR THIS CODE CANNOT BE USED * LEGALLY FOR ANY CORPORATE OR COMMERCIAL PURPOSE. */ public class TelaDois extends javax.swing.JFrame { private JPanel panel; private JTextField nomeInformado; private JRadioButton radioButtonNomeInformado; private JRadioButton radioButtonConceitoDois; private JRadioButton radioButtonConceitoUm; private JLabel textoDois; private JLabel conceitoDois; private JLabel conceitoUm; private JLabel textoUm; private JButton botaoContinuar; private JButton botaoFechar; /** * Auto-generated main method to display this JFrame */ public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { TelaDois inst = new TelaDois(); inst.setLocationRelativeTo(null); 85 inst.setVisible(true); } }); } public TelaDois() { super(); initGUI(); } private void initGUI() { try { setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); { panel = new JPanel(); getContentPane().add(getPanel(), BorderLayout.CENTER); panel.setSize(800, 600); panel.setPreferredSize(new java.awt.Dimension(584, 364)); panel.setLayout(null); { botaoFechar = new JButton(); panel.add(botaoFechar); botaoFechar.setText("Fechar"); botaoFechar.setBounds(483, 323, 90, 28); botaoFechar.setFont(new java.awt.Font("Arial",1,12)); botaoFechar.setOpaque(false); botaoFechar.setAlignmentX(483.0f); botaoFechar.setAlignmentY(323.0f); } { botaoContinuar = new JButton(); panel.add(botaoContinuar); botaoContinuar.setText("Continuar"); botaoContinuar.setBounds(390, 323, 90, 28); botaoContinuar.setFont(new java.awt.Font("Arial",1,12)); botaoContinuar.setAlignmentX(390.0f); botaoContinuar.setAlignmentY(323.0f); } { textoUm = new JLabel(); panel.add(textoUm); textoUm.setText("Os seguintes conceitos serão unificados:"); textoUm.setBounds(68, 29, 244, 16); 86 textoUm.setFont(new java.awt.Font("Arial",1,12)); } { conceitoUm = new JLabel(); panel.add(conceitoUm); conceitoUm.setText("- \"Conceito 1\""); conceitoUm.setBounds(68, 62, 76, 16); conceitoUm.setFont(new java.awt.Font("Arial",0,12)); } { conceitoDois = new JLabel(); panel.add(getConceitoDois()); conceitoDois.setText("- \"Conceito 2\""); conceitoDois.setBounds(68, 84, 76, 16); conceitoDois.setFont(new java.awt.Font("Arial",0,12)); } { textoDois = new JLabel(); panel.add(textoDois); textoDois.setText("Informe o nome do novo conceito global resultante da unificação:"); textoDois.setBounds(68, 122, 394, 16); textoDois.setFont(new java.awt.Font("Arial",1,12)); } { radioButtonConceitoUm = new JRadioButton(); panel.add(radioButtonConceitoUm); radioButtonConceitoUm.setText("Conceito 1"); radioButtonConceitoUm.setBounds(68, 165, 89, 20); radioButtonConceitoUm.setFont(new java.awt.Font("Arial",0,12)); radioButtonConceitoUm.setNextFocusableComponent(botaoContinuar); } { radioButtonConceitoDois = new JRadioButton(); panel.add(radioButtonConceitoDois); radioButtonConceitoDois.setText("Conceito 2"); radioButtonConceitoDois.setBounds(68, 194, 89, 20); radioButtonConceitoDois.setFont(new java.awt.Font("Arial",0,12)); } { 87 radioButtonNomeInformado = new JRadioButton(); panel.add(radioButtonNomeInformado); radioButtonNomeInformado.setText("Informe um outro nome:"); radioButtonNomeInformado.setBounds(68, 164, 20); radioButtonNomeInformado.setFont(new java.awt.Font("Arial",0,12)); } { nomeInformado = new JTextField(); panel.add(nomeInformado); nomeInformado.setBounds(228, 222, 312, 22); } } pack(); this.setSize(600, 400); } catch (Exception e) { e.printStackTrace(); } } public JPanel getPanel() { return panel; } public JLabel getConceitoDois() { return conceitoDois; } } package br.com.lucas.telas; import java.awt.BorderLayout; import javax.swing.ComboBoxModel; import javax.swing.DefaultComboBoxModel; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.SwingUtilities; import javax.swing.WindowConstants; /** 223, 88 * This code was edited or generated using CloudGarden's Jigloo * SWT/Swing GUI Builder, which is free for non-commercial * use. If Jigloo is being used commercially (ie, by a corporation, * company or business for any purpose whatever) then you * should purchase a license for each developer using Jigloo. * Please visit www.cloudgarden.com for details. * Use of Jigloo implies acceptance of these licensing terms. * A COMMERCIAL LICENSE HAS NOT BEEN PURCHASED FOR * THIS MACHINE, SO JIGLOO OR THIS CODE CANNOT BE USED * LEGALLY FOR ANY CORPORATE OR COMMERCIAL PURPOSE. */ public class TelaTres extends javax.swing.JFrame { private JPanel panel; private JLabel labelNomePapel; private JLabel labelRelacionamento; private JTextField descricaoRelacionamento; private JComboBox comboRelacionamentos; private JLabel textoCinco; private JLabel jLabel1; private JLabel textoQuatro; private JLabel textoTres; private JLabel esquemaDois; private JLabel textoDois; private JLabel relacionamentoUm; private JLabel textoUm; private JButton botaoContinuar; private JButton botaoFechar; /** * Auto-generated main method to display this JFrame */ public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { TelaTres inst = new TelaTres(); inst.setLocationRelativeTo(null); inst.setVisible(true); } }); } public TelaTres() { super(); initGUI(); } private void initGUI() { 89 try { setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); { panel = new JPanel(); getContentPane().add(getPanel(), BorderLayout.CENTER); // panel.setLayout(panelLayout); panel.setSize(800, 600); panel.setPreferredSize(new java.awt.Dimension(584, 364)); panel.setLayout(null); panel.setFont(new java.awt.Font("Arial",0,10)); { botaoFechar = new JButton(); panel.add(botaoFechar); botaoFechar.setText("Fechar"); botaoFechar.setBounds(483, 323, 90, 28); botaoFechar.setFont(new java.awt.Font("Arial",1,12)); botaoFechar.setOpaque(false); botaoFechar.setAlignmentX(483.0f); botaoFechar.setAlignmentY(323.0f); } { botaoContinuar = new JButton(); panel.add(botaoContinuar); botaoContinuar.setText("Continuar"); botaoContinuar.setBounds(390, 323, 90, 28); botaoContinuar.setFont(new java.awt.Font("Arial",1,12)); botaoContinuar.setAlignmentX(390.0f); botaoContinuar.setAlignmentY(323.0f); } { textoUm = new JLabel(); panel.add(textoUm); textoUm.setText("O seguinte relacionamento:"); textoUm.setBounds(48, 37, 178, 16); textoUm.setFont(new java.awt.Font("Arial",1,12)); } { relacionamentoUm = new JLabel(); panel.add(relacionamentoUm); relacionamentoUm.setText("\"JournalistAddress\""); relacionamentoUm.setBounds(48, 65, 472, 16); relacionamentoUm.setFont(new java.awt.Font("Arial",0,12)); } 90 { textoDois = new JLabel(); panel.add(textoDois); textoDois.setText("pertencente ao "); textoDois.setBounds(48, 93, 101, 16); textoDois.setFont(new java.awt.Font("Arial",1,12)); } { esquemaDois = new JLabel(); panel.add(esquemaDois); esquemaDois.setText("Esquema Conceitual 1,"); esquemaDois.setBounds(142, 93, 134, 16); esquemaDois.setFont(new java.awt.Font("Arial",1,12)); } { textoTres = new JLabel(); panel.add(textoTres); textoTres.setText("tem afinidade com mais de um relacionamento"); textoTres.setBounds(276, 93, 278, 16); textoTres.setFont(new java.awt.Font("Arial",1,12)); } { textoQuatro = new JLabel(); panel.add(textoQuatro); textoQuatro.setText("do "); textoQuatro.setBounds(48, 115, 17, 16); textoQuatro.setFont(new java.awt.Font("Arial",1,12)); } { jLabel1 = new JLabel(); panel.add(jLabel1); jLabel1.setText("Esquema Conceitual 2."); jLabel1.setFont(new java.awt.Font("Arial",1,12)); jLabel1.setBounds(71, 115, 134, 16); } { textoCinco = new JLabel(); panel.add(textoCinco); textoCinco.setText("Indique qual relacionamentos tem correspondência semântica com o primeiro:"); textoCinco.setBounds(48, 165, 500, 16); textoCinco.setFont(new java.awt.Font("Arial",1,12)); } destes 91 { ComboBoxModel comboRelacionamentosModel = new DefaultComboBoxModel( new String[] { "Nenhum", "JournalistAddress", "JournalistAddress" }); comboRelacionamentos = new JComboBox(); panel.add(comboRelacionamentos); comboRelacionamentos.setModel(comboRelacionamentosModel); comboRelacionamentos.setBounds(48, 216, 214, 22); } { descricaoRelacionamento = new JTextField(); panel.add(descricaoRelacionamento); descricaoRelacionamento.setBounds(268, 216, 292, 22); descricaoRelacionamento.setText("workAddress"); } { labelRelacionamento = new JLabel(); panel.add(labelRelacionamento); labelRelacionamento.setText("Relacionamento"); labelRelacionamento.setBounds(48, 195, 94, 16); labelRelacionamento.setFont(new java.awt.Font("Arial",1,12)); } { labelNomePapel = new JLabel(); panel.add(labelNomePapel); labelNomePapel.setText("Nome ou Papel"); labelNomePapel.setBounds(268, 195, 94, 16); labelNomePapel.setFont(new java.awt.Font("Arial",1,12)); } } pack(); this.setSize(600, 400); } catch (Exception e) { e.printStackTrace(); } } public JPanel getPanel() { return panel; } 92 } package br.com.lucas.telas; import java.awt.BorderLayout; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JSeparator; import javax.swing.SwingUtilities; import javax.swing.WindowConstants; /** * This code was edited or generated using CloudGarden's Jigloo * SWT/Swing GUI Builder, which is free for non-commercial * use. If Jigloo is being used commercially (ie, by a corporation, * company or business for any purpose whatever) then you * should purchase a license for each developer using Jigloo. * Please visit www.cloudgarden.com for details. * Use of Jigloo implies acceptance of these licensing terms. * A COMMERCIAL LICENSE HAS NOT BEEN PURCHASED FOR * THIS MACHINE, SO JIGLOO OR THIS CODE CANNOT BE USED * LEGALLY FOR ANY CORPORATE OR COMMERCIAL PURPOSE. */ public class TelaQuatro extends javax.swing.JFrame { private JPanel panel; private JRadioButton radioButtonNao; private JRadioButton radioButtonSim; private JLabel textoTres; private JLabel textoDois; private JSeparator jSeparator1; private JLabel nomePapelDois; private JLabel nomePapelUm; private JLabel relacionamentoDois; private JLabel relacionamentoUm; private JLabel jLabel2; private JLabel jLabel1; private JSeparator separadorDois; private JSeparator separador; private JLabel labelNomePapel; private JLabel labelRelacionamento; private JLabel labelEsquemaDois; private JLabel labelEsquemaUm; private JLabel textoUm; private JButton botaoContinuar; 93 private JButton botaoFechar; /** * Auto-generated main method to display this JFrame */ public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { TelaQuatro inst = new TelaQuatro(); inst.setLocationRelativeTo(null); inst.setVisible(true); } }); } public TelaQuatro() { super(); initGUI(); } private void initGUI() { try { setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); { panel = new JPanel(); getContentPane().add(panel, BorderLayout.CENTER); // panel.setLayout(panelLayout); panel.setSize(800, 600); panel.setPreferredSize(new java.awt.Dimension(584, 364)); panel.setLayout(null); { botaoFechar = new JButton(); panel.add(botaoFechar); botaoFechar.setText("Fechar"); botaoFechar.setBounds(483, 323, 90, 28); botaoFechar.setFont(new java.awt.Font("Arial",1,12)); botaoFechar.setOpaque(false); botaoFechar.setAlignmentX(483.0f); botaoFechar.setAlignmentY(323.0f); } { botaoContinuar = new JButton(); panel.add(botaoContinuar); botaoContinuar.setText("Continuar"); botaoContinuar.setBounds(390, 323, 90, 28); 94 botaoContinuar.setFont(new java.awt.Font("Arial",1,12)); botaoContinuar.setAlignmentX(390.0f); botaoContinuar.setAlignmentY(323.0f); } { textoUm = new JLabel(); panel.add(textoUm); textoUm.setText("Os seguintes relacionamentos têm afinidade entre si:"); textoUm.setBounds(44, 22, 315, 16); textoUm.setFont(new java.awt.Font("Arial",1,12)); } { labelEsquemaUm = new JLabel(); panel.add(labelEsquemaUm); labelEsquemaUm.setText("Esquema Conceitual 1:"); labelEsquemaUm.setBounds(42, 54, 137, 16); labelEsquemaUm.setFont(new java.awt.Font("Arial",1,12)); } { labelEsquemaDois = new JLabel(); panel.add(labelEsquemaDois); labelEsquemaDois.setText("Esquema Conceitual 2:"); labelEsquemaDois.setBounds(42, 135, 137, 16); labelEsquemaDois.setFont(new java.awt.Font("Arial",1,12)); } { labelRelacionamento = new JLabel(); panel.add(labelRelacionamento); labelRelacionamento.setText("Relacionamento:"); labelRelacionamento.setBounds(44, 77, 101, 16); labelRelacionamento.setFont(new java.awt.Font("Arial",1,12)); } { labelNomePapel = new JLabel(); panel.add(labelNomePapel); labelNomePapel.setText("Nome ou Papel:"); labelNomePapel.setBounds(51, 99, 94, 16); labelNomePapel.setFont(new java.awt.Font("Arial",1,12)); } 95 { separador = new JSeparator(); panel.add(separador); separador.setBounds(31, 127, 521, 10); } { separadorDois = new JSeparator(); panel.add(separadorDois); separadorDois.setBounds(30, 46, 523, 9); } { jLabel1 = new JLabel(); panel.add(jLabel1); jLabel1.setText("Relacionamento:"); jLabel1.setFont(new java.awt.Font("Arial",1,12)); jLabel1.setBounds(42, 158, 101, 16); } { jLabel2 = new JLabel(); panel.add(jLabel2); jLabel2.setText("Nome ou Papel:"); jLabel2.setFont(new java.awt.Font("Arial",1,12)); jLabel2.setBounds(50, 180, 94, 16); } { relacionamentoUm = new JLabel(); panel.add(relacionamentoUm); relacionamentoUm.setText("JournalistTVStation"); relacionamentoUm.setBounds(151, 77, 350, 16); relacionamentoUm.setFont(new java.awt.Font("Arial",0,12)); } { relacionamentoDois = new JLabel(); panel.add(relacionamentoDois); relacionamentoDois.setText("JournalistTVChannel"); relacionamentoDois.setBounds(149, 158, 121, 16); relacionamentoDois.setFont(new java.awt.Font("Arial",0,12)); } { nomePapelUm = new JLabel(); panel.add(nomePapelUm); nomePapelUm.setText("Nenhum"); nomePapelUm.setBounds(151, 99, 342, 16); 96 nomePapelUm.setFont(new java.awt.Font("Arial",0,12)); } { nomePapelDois = new JLabel(); panel.add(nomePapelDois); nomePapelDois.setText("Nenhum"); nomePapelDois.setBounds(150, 180, 56, 16); nomePapelDois.setFont(new java.awt.Font("Arial",0,12)); } { jSeparator1 = new JSeparator(); panel.add(jSeparator1); jSeparator1.setBounds(30, 204, 521, 10); } { textoDois = new JLabel(); panel.add(textoDois); textoDois.setText("Indique se os dois relacionamentos têm a mesma intenção semântica e podem ser"); textoDois.setBounds(42, 212, 495, 16); textoDois.setFont(new java.awt.Font("Arial",1,12)); } { textoTres = new JLabel(); panel.add(textoTres); textoTres.setText("unificados:"); textoTres.setBounds(42, 228, 70, 16); textoTres.setFont(new java.awt.Font("Arial",1,12)); } { radioButtonSim = new JRadioButton(); panel.add(radioButtonSim); radioButtonSim.setText("Sim, eles devem ser unificados em um único relacionamento global"); radioButtonSim.setBounds(42, 254, 504, 20); radioButtonSim.setFont(new java.awt.Font("Arial",1,12)); } { radioButtonNao = new JRadioButton(); panel.add(radioButtonNao); radioButtonNao.setText("Não, eles devem ser representados separadamente no esquema conceitual global"); radioButtonNao.setBounds(42, 275, 504, 20); 97 radioButtonNao.setFont(new java.awt.Font("Arial",1,12)); } } pack(); this.setSize(600, 400); } catch (Exception e) { e.printStackTrace(); } } public JPanel getPanel() { return panel; } } package br.com.lucas.telas; import java.awt.BorderLayout; import javax.swing.ComboBoxModel; import javax.swing.DefaultComboBoxModel; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JSeparator; import javax.swing.JTextField; import javax.swing.SwingUtilities; import javax.swing.WindowConstants; /** * This code was edited or generated using CloudGarden's Jigloo * SWT/Swing GUI Builder, which is free for non-commercial * use. If Jigloo is being used commercially (ie, by a corporation, * company or business for any purpose whatever) then you * should purchase a license for each developer using Jigloo. * Please visit www.cloudgarden.com for details. * Use of Jigloo implies acceptance of these licensing terms. * A COMMERCIAL LICENSE HAS NOT BEEN PURCHASED FOR * THIS MACHINE, SO JIGLOO OR THIS CODE CANNOT BE USED * LEGALLY FOR ANY CORPORATE OR COMMERCIAL PURPOSE. */ public class TelaCinco extends javax.swing.JFrame { private JPanel panel; 98 private JSeparator separador; private JComboBox comboConceitos; private JButton buttonSelecionar; private JTextField conceitosSelecionados; private JRadioButton radioButton; private JRadioButton radioButtonNao; private JRadioButton radioButtonSimMais; private JRadioButton radioButtonSim; private JLabel conceitoGlobal; private JLabel textoCinco; private JLabel textoQuatro; private JLabel textoTres; private JLabel labelEsquemaConceitual; private JLabel textoDois; private JLabel conceitoLexico; private JLabel textoUm; private JButton botaoContinuar; private JButton botaoFechar; /** * Auto-generated main method to display this JFrame */ public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { TelaCinco inst = new TelaCinco(); inst.setLocationRelativeTo(null); inst.setVisible(true); } }); } public TelaCinco() { super(); initGUI(); } private void initGUI() { try { // setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); this.setTitle("Unificação Mista"); { panel = new JPanel(); getContentPane().add(getPanel(), BorderLayout.CENTER); panel.setLayout(panelLayout); panel.setSize(800, 600); 99 panel.setPreferredSize(new java.awt.Dimension(584, 364)); panel.setLayout(null); { botaoFechar = new JButton(); panel.add(botaoFechar); botaoFechar.setText("Fechar"); botaoFechar.setBounds(483, 323, 90, 28); botaoFechar.setFont(new java.awt.Font("Arial",1,12)); botaoFechar.setOpaque(false); botaoFechar.setAlignmentX(483.0f); botaoFechar.setAlignmentY(323.0f); } { botaoContinuar = new JButton(); panel.add(botaoContinuar); botaoContinuar.setText("Continuar"); botaoContinuar.setBounds(390, 323, 90, 28); botaoContinuar.setFont(new java.awt.Font("Arial",1,12)); botaoContinuar.setAlignmentX(390.0f); botaoContinuar.setAlignmentY(323.0f); } { textoUm = new JLabel(); panel.add(textoUm); textoUm.setText("O seguinte conceito léxico:"); textoUm.setBounds(40, 23, 173, 16); textoUm.setFont(new java.awt.Font("Arial",1,12)); } { conceitoLexico = new JLabel(); panel.add(conceitoLexico); conceitoLexico.setText("Journalist"); conceitoLexico.setBounds(40, 45, 509, 16); conceitoLexico.setFont(new java.awt.Font("Arial",0,12)); } { textoDois = new JLabel(); panel.add(textoDois); textoDois.setText("pertence ao"); textoDois.setBounds(39, 67, 77, 16); textoDois.setFont(new java.awt.Font("Arial",1,12)); } { labelEsquemaConceitual = new JLabel(); 100 panel.add(labelEsquemaConceitual); labelEsquemaConceitual.setText("Esquema Conceitual 2."); labelEsquemaConceitual.setBounds(116, 67, 132, 16); labelEsquemaConceitual.setFont(new java.awt.Font("Arial",1,12)); } { textoTres = new JLabel(); panel.add(textoTres); textoTres.setText("Indique se este conceito tem a mesma intenção semântica de um dos conceitos já "); textoTres.setBounds(39, 89, 475, 16); textoTres.setFont(new java.awt.Font("Arial",1,12)); } { textoQuatro = new JLabel(); panel.add(textoQuatro); textoQuatro.setText("relacionados, direta ou indiretamente com o seguinte conceito global, originado de seu"); textoQuatro.setBounds(40, 111, 532, 16); textoQuatro.setFont(new java.awt.Font("Arial",1,12)); } { textoCinco = new JLabel(); panel.add(textoCinco); textoCinco.setText("próprio cluster de afinidade:"); textoCinco.setBounds(40, 133, 198, 16); textoCinco.setFont(new java.awt.Font("Arial",1,12)); } { conceitoGlobal = new JLabel(); panel.add(conceitoGlobal); conceitoGlobal.setText("Journalist"); conceitoGlobal.setBounds(40, 155, 509, 16); conceitoGlobal.setFont(new java.awt.Font("Arial",0,12)); } { radioButtonSim = new JRadioButton(); panel.add(radioButtonSim); radioButtonSim.setText("Sim. Indique qual:"); radioButtonSim.setBounds(40, 193, 161, 20); 101 radioButtonSim.setFont(new java.awt.Font("Arial",1,12)); } { radioButtonSimMais = new JRadioButton(); panel.add(radioButtonSimMais); radioButtonSimMais.setText("Sim, mais de um. Indique quais:"); radioButtonSimMais.setBounds(40, 220, 219, 20); radioButtonSimMais.setFont(new java.awt.Font("Arial",1,12)); } { radioButtonNao = new JRadioButton(); panel.add(radioButtonNao); radioButtonNao.setText("Não."); radioButtonNao.setBounds(40, 247, 56, 20); radioButtonNao.setFont(new java.awt.Font("Arial",1,12)); } { radioButton = new JRadioButton(); panel.add(radioButton); radioButton.setText("Postergar decisão."); radioButton.setBounds(40, 274, 142, 20); radioButton.setFont(new java.awt.Font("Arial",1,12)); } { conceitosSelecionados = new JTextField(); panel.add(conceitosSelecionados); conceitosSelecionados.setText("2 conceitos selecionados"); conceitosSelecionados.setBounds(368, 219, 22); } { buttonSelecionar = new JButton(); panel.add(buttonSelecionar); buttonSelecionar.setText("Selecionar..."); buttonSelecionar.setBounds(259, 220, 104, 20); buttonSelecionar.setFont(new java.awt.Font("Arial",1,12)); } { ComboBoxModel comboConceitosModel = new DefaultComboBoxModel( 193, 102 new String[] { "Selecione", "Name", "FirstName", "LastName" }); comboConceitos = new JComboBox(); panel.add(comboConceitos); comboConceitos.setModel(comboConceitosModel); comboConceitos.setBounds(206, 192, 355, 22); } { separador = new JSeparator(); panel.add(separador); separador.setBounds(39, 182, 522, 10); } } pack(); this.setSize(600, 400); } catch (Exception e) { e.printStackTrace(); } } public JPanel getPanel() { return panel; } } package br.com.lucas.telas; import java.awt.BorderLayout; import javax.swing.JButton; import javax.swing.JPanel; import javax.swing.SwingUtilities; import javax.swing.WindowConstants; /** * This code was edited or generated using CloudGarden's Jigloo * SWT/Swing GUI Builder, which is free for non-commercial * use. If Jigloo is being used commercially (ie, by a corporation, * company or business for any purpose whatever) then you * should purchase a license for each developer using Jigloo. * Please visit www.cloudgarden.com for details. * Use of Jigloo implies acceptance of these licensing terms. * A COMMERCIAL LICENSE HAS NOT BEEN PURCHASED FOR * THIS MACHINE, SO JIGLOO OR THIS CODE CANNOT BE USED * LEGALLY FOR ANY CORPORATE OR COMMERCIAL PURPOSE. */ 103 public class TelaSeis extends javax.swing.JFrame { private JPanel panel; private JButton botaoContinuar; private JButton botaoFechar; /** * Auto-generated main method to display this JFrame */ public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { TelaSeis inst = new TelaSeis(); inst.setLocationRelativeTo(null); inst.setVisible(true); } }); } public TelaSeis() { super(); initGUI(); } private void initGUI() { try { setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); { panel = new JPanel(); getContentPane().add(getPanel(), BorderLayout.CENTER); // panel.setLayout(panelLayout); panel.setSize(800, 600); panel.setPreferredSize(new java.awt.Dimension(584, 364)); panel.setLayout(null); { botaoFechar = new JButton(); panel.add(botaoFechar); botaoFechar.setText("Fechar"); botaoFechar.setBounds(483, 323, 90, 28); botaoFechar.setFont(new java.awt.Font("Arial",1,12)); botaoFechar.setOpaque(false); botaoFechar.setAlignmentX(483.0f); botaoFechar.setAlignmentY(323.0f); } { botaoContinuar = new JButton(); 104 panel.add(botaoContinuar); botaoContinuar.setText("Continuar"); botaoContinuar.setBounds(390, 323, 90, 28); botaoContinuar.setFont(new java.awt.Font("Arial",1,12)); botaoContinuar.setAlignmentX(390.0f); botaoContinuar.setAlignmentY(323.0f); } } pack(); this.setSize(600, 400); } catch (Exception e) { e.printStackTrace(); } } public JPanel getPanel() { return panel; } } package br.com.lucas.telas; import java.awt.BorderLayout; import javax.swing.JButton; import javax.swing.JPanel; import javax.swing.SwingUtilities; import javax.swing.WindowConstants; /** * This code was edited or generated using CloudGarden's Jigloo * SWT/Swing GUI Builder, which is free for non-commercial * use. If Jigloo is being used commercially (ie, by a corporation, * company or business for any purpose whatever) then you * should purchase a license for each developer using Jigloo. * Please visit www.cloudgarden.com for details. * Use of Jigloo implies acceptance of these licensing terms. * A COMMERCIAL LICENSE HAS NOT BEEN PURCHASED FOR * THIS MACHINE, SO JIGLOO OR THIS CODE CANNOT BE USED * LEGALLY FOR ANY CORPORATE OR COMMERCIAL PURPOSE. */ public class TelaSete extends javax.swing.JFrame { private JPanel panel; private JButton botaoContinuar; private JButton botaoFechar; 105 /** * Auto-generated main method to display this JFrame */ public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { TelaSete inst = new TelaSete(); inst.setLocationRelativeTo(null); inst.setVisible(true); } }); } public TelaSete() { super(); initGUI(); } private void initGUI() { try { setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); { panel = new JPanel(); getContentPane().add(getPanel(), BorderLayout.CENTER); // panel.setLayout(panelLayout); panel.setSize(800, 600); panel.setPreferredSize(new java.awt.Dimension(584, 364)); panel.setLayout(null); { botaoFechar = new JButton(); panel.add(botaoFechar); botaoFechar.setText("Fechar"); botaoFechar.setBounds(483, 323, 90, 28); botaoFechar.setFont(new java.awt.Font("Arial",1,12)); botaoFechar.setOpaque(false); botaoFechar.setAlignmentX(483.0f); botaoFechar.setAlignmentY(323.0f); } { botaoContinuar = new JButton(); panel.add(botaoContinuar); botaoContinuar.setText("Continuar"); botaoContinuar.setBounds(390, 323, 90, 28); 106 botaoContinuar.setFont(new java.awt.Font("Arial",1,12)); botaoContinuar.setAlignmentX(390.0f); botaoContinuar.setAlignmentY(323.0f); } } pack(); this.setSize(600, 400); } catch (Exception e) { e.printStackTrace(); } } public JPanel getPanel() { return panel; } } package br.com.lucas.telas; import java.awt.BorderLayout; import java.awt.Canvas; import javax.swing.BorderFactory; import javax.swing.ButtonGroup; import javax.swing.DefaultComboBoxModel; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JCheckBoxMenuItem; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JProgressBar; import javax.swing.JRadioButton; import javax.swing.JScrollBar; import javax.swing.JTextArea; import javax.swing.JToggleButton; import javax.swing.ListModel; import javax.swing.SwingUtilities; import javax.swing.WindowConstants; import javax.swing.border.BevelBorder; import javax.swing.border.LineBorder; import javax.swing.border.SoftBevelBorder; /** * This code was edited or generated using CloudGarden's Jigloo * SWT/Swing GUI Builder, which is free for non-commercial * use. If Jigloo is being used commercially (ie, by a corporation, 107 * company or business for any purpose whatever) then you * should purchase a license for each developer using Jigloo. * Please visit www.cloudgarden.com for details. * Use of Jigloo implies acceptance of these licensing terms. * A COMMERCIAL LICENSE HAS NOT BEEN PURCHASED FOR * THIS MACHINE, SO JIGLOO OR THIS CODE CANNOT BE USED * LEGALLY FOR ANY CORPORATE OR COMMERCIAL PURPOSE. */ public class TelaNove extends javax.swing.JFrame { private JPanel panel; private JButton botaoCancelar; private JButton botaoOK; private JList jList1; private ButtonGroup buttonGroup2; private ButtonGroup buttonGroup1; /** * Auto-generated main method to display this JFrame */ public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { TelaNove inst = new TelaNove(); inst.setLocationRelativeTo(null); inst.setVisible(true); } }); } public TelaNove() { super(); initGUI(); } private void initGUI() { try { // setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); this.setTitle("Seleção de Conceitos"); { panel = new JPanel(); getContentPane().add(getPanel(), BorderLayout.CENTER); panel.setLayout(panelLayout); panel.setSize(800, 600); panel.setPreferredSize(new java.awt.Dimension(323, 285)); panel.setLayout(null); panel.add(getJList1()); 108 panel.add(getBotaoOK()); panel.add(getBotaoCancelar()); } pack(); this.setSize(355, 321); } catch (Exception e) { e.printStackTrace(); } } public JPanel getPanel() { return panel; } private ButtonGroup getButtonGroup1() { if(buttonGroup1 == null) { buttonGroup1 = new ButtonGroup(); } return buttonGroup1; } private ButtonGroup getButtonGroup2() { if(buttonGroup2 == null) { buttonGroup2 = new ButtonGroup(); } return buttonGroup2; } private JList getJList1() { if(jList1 == null) { ListModel jList1Model = new DefaultComboBoxModel( new String[] { "Name", "LastName", "Newspaper", "Radio-Station" }); jList1 = new JList(); jList1.setModel(jList1Model); jList1.setBounds(0, 0, 339, 249); jList1.setFont(new java.awt.Font("Arial",0,12)); "FirstName", jList1.setBorder(BorderFactory.createEtchedBorder(BevelBorder.LOWERED)); } return jList1; } private JButton getBotaoOK() { if(botaoOK == null) { botaoOK = new JButton(); 109 botaoOK.setText("OK"); botaoOK.setBounds(191, 255, 52, 22); botaoOK.setFont(new java.awt.Font("Arial",1,12)); } return botaoOK; } private JButton getBotaoCancelar() { if(botaoCancelar == null) { botaoCancelar = new JButton(); botaoCancelar.setText("Cancelar"); botaoCancelar.setBounds(248, 255, 85, 22); botaoCancelar.setFont(new java.awt.Font("Arial",1,12)); } return botaoCancelar; } } /** * */ package binx.unificador.principal; /** * @author Lucas Duarte Silveira * */ public class Principal { Controlador controlador; public Principal() { controlador = new Controlador(); } public static void main(String[] args) { new Principal(); } } package binx.unificador.principal; import java.io.FileNotFoundException; import java.io.FileOutputStream; 110 import java.io.OutputStream; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import binx.unificador.model.Conceito; import binx.unificador.model.ConceitoLexico; import binx.unificador.model.ConceitoNaoLexico; import binx.unificador.model.ConjuntoClusters; import binx.unificador.model.EsquemaConceitual; import binx.unificador.model.Metadados; import binx.unificador.model.RelacionamentoAssociacao; import binx.unificador.model.RelacionamentoHeranca; import binx.unificador.principal.view.Tela; import com.hp.hpl.jena.ontology.AllValuesFromRestriction; import com.hp.hpl.jena.ontology.HasValueRestriction; import com.hp.hpl.jena.ontology.OntClass; import com.hp.hpl.jena.ontology.OntModel; import com.hp.hpl.jena.ontology.OntModelSpec; import com.hp.hpl.jena.ontology.Restriction; import com.hp.hpl.jena.ontology.UnionClass; import com.hp.hpl.jena.rdf.model.Literal; import com.hp.hpl.jena.rdf.model.ModelFactory; import com.hp.hpl.jena.rdf.model.RDFList; import com.hp.hpl.jena.rdf.model.RDFNode; import com.hp.hpl.jena.rdf.model.Resource; public class Controlador { Tela tela; OntModel modelUm; OntModel modelDois; OntModel modelClusters; EsquemaConceitual esquemaEntradaUm; EsquemaConceitual esquemaEntradaDois; EsquemaConceitual esquemaGlobal; ConjuntoClusters conjuntoClusters; public Controlador() { esquemaEntradaUm = new EsquemaConceitual(); esquemaEntradaDois = new EsquemaConceitual(); esquemaGlobal = new EsquemaConceitual(); conjuntoClusters = new ConjuntoClusters(); tela = new Tela(this); } 111 public void criaModelosEntrada(String URLArquivoDois) throws Exception { URLArquivoUm, String modelUm = ModelFactory.createOntologyModel(); modelDois = ModelFactory.createOntologyModel(); modelUm.read("file:" + URLArquivoUm); modelDois.read("file:" + URLArquivoDois); this.geraEsquemaEntradaUm(); this.geraEsquemaEntradaDois(); } public void criaModeloClusters(String URLArquivo) throws Exception { String nomes = "Começo\n"; String localName; modelClusters = ModelFactory.createOntologyModel(); modelClusters.read("file:" + URLArquivo); for(Iterator i = modelClusters.listClasses(); i.hasNext();) { OntClass classe = (OntClass)i.next(); if(classe.getLocalName() != null) { nomes = nomes + "classe: " + classe.getLocalName(); for(Iterator it = classe.listSuperClasses(true); it.hasNext();) { OntClass classe2 = (OntClass)it.next(); if((classe2 != null) && (classe2.getLocalName() != null)) { nomes = nomes + " - subclasse de : " + classe2.getLocalName(); } } nomes += "\n"; } } System.out.println(nomes); } private void geraEsquemaEntradaUm() { OntClass classe; OntClass superClasse; List<OntClass> listaRelHeranca = new ArrayList<OntClass>(); List<OntClass> listaRelAssociacao = new ArrayList<OntClass>(); List<OntClass> listaConcLexicos = new ArrayList<OntClass>(); List<OntClass> listaConcNaoLexicos = new ArrayList<OntClass>(); String localName = ""; for(Iterator i = modelUm.listClasses(); i.hasNext();) { classe = (OntClass)i.next(); if(classe.getLocalName() != null) { 112 for(Iterator it = classe.listSuperClasses(true); it.hasNext();) { superClasse = (OntClass)it.next(); if((superClasse != null) && (superClasse.getLocalName() != null)) { localName = superClasse.getLocalName(); if(localName.equals(Metadados.INHERITANCE_RELATIONSHIP)) { listaRelHeranca.add(classe); }else if(localName.equals(Metadados.ASSOCIATION_RELATIONSHIP)) { listaRelAssociacao.add(classe); }else if(localName.equals(Metadados.LEXICAL_CONCEPT)) { listaConcLexicos.add(classe); }else if(localName.equals(Metadados.NON_LEXICAL_CONCEPT)) { listaConcNaoLexicos.add(classe); } } } } } this.converteRelHeranca(listaRelHeranca, this.esquemaEntradaUm); this.converteRelAssociacao(listaRelAssociacao, this.esquemaEntradaUm); // this.converteConcLexicos(listaConcLexicos, this.esquemaEntradaUm); this.converteConcNaoLexicos(listaConcNaoLexicos, this.esquemaEntradaUm); } private void geraEsquemaEntradaDois() { } private void converteRelHeranca(List<OntClass> listaRelHeranca, EsquemaConceitual esquema) { OntClass classRel; OntClass superClasse; OntClass classAux; Restriction rest; AllValuesFromRestriction allValuesRest; for(Iterator<OntClass> i = listaRelHeranca.iterator(); i.hasNext();) { classRel = (OntClass)i.next(); RelacionamentoHeranca relHeranca = new RelacionamentoHeranca(); relHeranca.setNome(classRel.getLocalName()); for(Iterator it = classRel.listSuperClasses(); it.hasNext();) { 113 try { superClasse = (OntClass)it.next(); rest = superClasse.asRestriction(); allValuesRest = rest.asAllValuesFromRestriction(); if((allValuesRest.getOnProperty().getLocalName()).equals( Metadados.SOURCE_CONCEPT)) { classAux = (OntClass)allValuesRest.getAllValuesFrom(); // relHeranca.setSourceConcept(new Conceito(classAux.getLocalName())); //////////////RESOLVER/////////////// ///////////////////////////////////// } } catch(Exception e) { } }///////////////////ARRUMAR AS DISJUNÇÕES////////////////// esquema.addRelacionamentoHeranca(relHeranca); } } private void converteRelAssociacao(List<OntClass> EsquemaConceitual esquema) { OntClass classe; listaRelAssociacao, HasValueRestriction superClasse = null; for(Iterator<OntClass> i = listaRelAssociacao.iterator(); i.hasNext();) { RelacionamentoAssociacao relAssociacao = new RelacionamentoAssociacao(); classe = i.next(); relAssociacao.setNome(classe.getLocalName()); esquema.addRelacionamentoAssociacao(relAssociacao); } } private void converteConcLexicos(List<OntClass> listaConcLexicos, EsquemaConceitual esquema) { OntClass classe; for(Iterator<OntClass> i = listaConcLexicos.iterator(); i.hasNext();) { ConceitoLexico concLexico = new ConceitoLexico(); classe = (OntClass)i.next(); concLexico.setNome(classe.getLocalName()); OntModel modelo; modelo = ModelFactory.createOntologyModel(); 114 for(Iterator it = classe.listSuperClasses(); it.hasNext();) { OntClass superClasse = (OntClass) it.next(); try { Restriction rest = superClasse.asRestriction(); System.out.println(rest.getOnProperty().getLocalName()); } catch(Exception e) { } } esquema.addConceitoLéxico(concLexico); } } private void converteConcNaoLexicos(List<OntClass> listaConcNaoLexicos, EsquemaConceitual esquema) { OntClass classe; OntClass classeAux; UnionClass unionClass; Restriction rest; AllValuesFromRestriction allValuesRest; for(Iterator<OntClass> i = listaConcNaoLexicos.iterator(); i.hasNext();) { ConceitoNaoLexico concNaoLexico = new ConceitoNaoLexico(); classe = (OntClass)i.next(); concNaoLexico.setNome(classe.getLocalName()); for(Iterator it = classe.listSuperClasses(); it.hasNext();) { OntClass superClasse = (OntClass) it.next(); try { rest = superClasse.asRestriction(); allValuesRest = rest.asAllValuesFromRestriction(); if((allValuesRest.getOnProperty().getLocalName()).equals( Metadados.RELATED_CONCEPTS)) { classeAux = (OntClass)allValuesRest.getAllValuesFrom(); unionClass = classeAux.asUnionClass(); for(Iterator ite = unionClass.listOperands(); ite.hasNext();) { OntClass aClasse = (OntClass)ite.next(); for(Iterator iter = esquemaEntradaUm.getListaRelacionamentosAssociacao().iterator(); iter.hasNext();) { RelacionamentoAssociacao relAss = (RelacionamentoAssociacao)iter.next(); 115 if(relAss.getNome().equals(aClasse.getLocalName())) { concNaoLexico.addRelacionamentoAssociacao(relAss); ////////////////////// ///////////////////// Atualizar os relacionamentos //////////////////// } } for(Iterator iter esquemaEntradaUm.getListaRelacionamentosHeranca().iterator(); iter.hasNext();) { RelacionamentoHeranca relHer = (RelacionamentoHeranca)iter.next(); = if(relHer.getNome().equals(aClasse.getLocalName())) { concNaoLexico.addRelacionamentoHeranca(relHer); ////////////////////// ///////////////////// Atualizar os relacionamentos //////////////////// } } } } } catch(Exception e) { e.printStackTrace(); } } esquema.addConceitoNaoLéxico(concNaoLexico); } } public void iniciarUnificacaoLexica() { UnificadorLexico unificadorLexico = new UnificadorLexico(this.tela); unificadorLexico.separaListaClustersLexicos(this.conjuntoClusters.getListaCluste rs()); unificadorLexico.unificarConceitos(this.esquemaEntradaUm, this.esquemaEntradaDois, this.esquemaGlobal); } 116 public void iniciarUnificacaoNaoLexica() { UnificadorNaoLexico unificadorNaoLexico UnificadorNaoLexico(this.tela); = new unificadorNaoLexico.separaListaClustersNaoLexicos(this.conjuntoClusters.getLis taClusters()); unificadorNaoLexico.unificarConceitos(this.esquemaEntradaUm, this.esquemaEntradaDois, this.esquemaGlobal); } public void iniciarUnificacaoMista() { UnificadorMisto unificadorMisto = new UnificadorMisto(this.tela); unificadorMisto.separaListaClustersMistos(this.conjuntoClusters.getListaClusters( )); unificadorMisto.unificarConceitos(this.esquemaEntradaUm, this.esquemaEntradaDois, this.esquemaGlobal); } public void converteEsquemaGlobal() { } public void gravaArquivoSaida() { } } package binx.unificador.principal; import java.util.List; import binx.unificador.model.Cluster; import binx.unificador.model.ConceitoLexico; import binx.unificador.model.EsquemaConceitual; import binx.unificador.principal.view.Tela; public class UnificadorLexico { Tela tela; List<Cluster> listaClustersLexicos; public UnificadorLexico(Tela umaTela) { this.tela = umaTela; } 117 public void separaListaClustersLexicos(List<Cluster> listaClusters) { } public void unificarConceitos(EsquemaConceitual esquemaConceitualUm, EsquemaConceitual esquemaConceitualDois, EsquemaConceitual esquemaConceitualGlobal) { tela.mostraTelaEscolhaNome("", ""); this.criaConceitoLexicoGlobal(esquemaConceitualGlobal, "", ""); } private void esquemaConceitualGlobal, criaConceitoLexicoGlobal(EsquemaConceitual String nome, String valor) { ConceitoLexico conceitoLexico = new ConceitoLexico(); conceitoLexico.setNome(nome); conceitoLexico.setValor(valor); esquemaConceitualGlobal.addConceitoLéxico(conceitoLexico); } } package binx.unificador.principal; import java.util.List; import binx.unificador.model.Cluster; import binx.unificador.model.Conceito; import binx.unificador.model.ConceitoNaoLexico; import binx.unificador.model.EsquemaConceitual; import binx.unificador.model.Relacionamento; import binx.unificador.model.RelacionamentoAssociacao; import binx.unificador.model.RelacionamentoHeranca; import binx.unificador.principal.view.Tela; public class UnificadorNaoLexico { Tela tela; List<Cluster> listaClustersLexicos; public UnificadorNaoLexico(Tela umaTela) { this.tela = umaTela; } 118 public void separaListaClustersNaoLexicos(List<Cluster> listaClusters) { } public void unificarConceitos(EsquemaConceitual esquemaConceitualUm, EsquemaConceitual esquemaConceitualDois, EsquemaConceitual esquemaConceitualGlobal) { tela.mostraTelaEscolhaNome("", ""); tela.mostraTelaIndicaSemanticaRelac(); tela.mostraTelaSelecaoRelacAfin(); this.criaConceitoNaoLexicoGlobal(esquemaConceitualGlobal, ""); this.criaRelacionamentoAssociacao(esquemaConceitualGlobal, "", null, null, null, null, null); this.criaRelacionamentoHeranca(esquemaConceitualGlobal, "", null, null, null); } private void esquemaConceitualGlobal, criaConceitoNaoLexicoGlobal(EsquemaConceitual String nomeConceito) { ConceitoNaoLexico conceitoNaoLexico = new ConceitoNaoLexico(); conceitoNaoLexico.setNome(""); conceitoNaoLexico.setRelacionamentosAssociacao(null); conceitoNaoLexico.setRelacionamentosHerança(null); esquemaConceitualGlobal.addConceitoNaoLéxico(conceitoNaoLexico); } private void esquemaConceitualGlobal, criaRelacionamentoAssociacao(EsquemaConceitual String nome, String cardinalidadeDireta, String cardinalidadeInversa, Conceito sourceConcept, Conceito targetConcept, List<Relacionamento> listaRelacionamentosDisjuntos) { RelacionamentoAssociacao relacionamentoAssociacao = new RelacionamentoAssociacao(); relacionamentoAssociacao.setNome(nome); relacionamentoAssociacao.setCardinalidadeDireta(cardinalidadeDireta); relacionamentoAssociacao.setCardinalidadeInversa(cardinalidadeInversa); relacionamentoAssociacao.setSourceConcept(sourceConcept); relacionamentoAssociacao.setTargetConcept(targetConcept); 119 relacionamentoAssociacao.addDisjuncao(null); } private void criaRelacionamentoHeranca(EsquemaConceitual esquemaConceitualGlobal, String nome, List<Relacionamento> listaRelacionamentosDisjuntos, Conceito sourceConcept, Conceito targetConcept) { RelacionamentoHeranca relacionamentoHeranca = new RelacionamentoHeranca(); relacionamentoHeranca.setNome(nome); relacionamentoHeranca.setSourceConcept(sourceConcept); relacionamentoHeranca.setTargetConcept(targetConcept); relacionamentoHeranca.addDisjuncao(null); } } package binx.unificador.principal; import java.util.List; import binx.unificador.model.Cluster; import binx.unificador.model.Conceito; import binx.unificador.model.ConceitoLexico; import binx.unificador.model.ConceitoNaoLexico; import binx.unificador.model.EsquemaConceitual; import binx.unificador.model.Relacionamento; import binx.unificador.model.RelacionamentoAssociacao; import binx.unificador.model.RelacionamentoHeranca; import binx.unificador.principal.view.Tela; public class UnificadorMisto { Tela tela; List<Cluster> listaClustersMistos; public UnificadorMisto(Tela umaTela) { this.tela = umaTela; } public void separaListaClustersMistos(List<Cluster> listaClusters) { } public void unificarConceitos(EsquemaConceitual esquemaConceitualUm, 120 EsquemaConceitual esquemaConceitualDois, EsquemaConceitual esquemaConceitualGlobal) { UnificadorNaoLexico UnificadorNaoLexico(this.tela); unificadorNaoLexico = new tela.mostraTelaEscolhaNome("", ""); tela.mostraTelaIndicaSemanticaRelac(); tela.mostraTelaSelecaoRelacAfin(); tela.mostraTelaEscolhaUnificacaoMista(); this.criaConceitoLexicoGlobal(esquemaConceitualGlobal, "", ""); this.criaConceitoNaoLexicoGlobal(esquemaConceitualGlobal, ""); this.criaRelacionamentoAssociacao(esquemaConceitualGlobal, "", null, null, null, null, null); this.criaRelacionamentoHeranca(esquemaConceitualGlobal, "", null, null, null); } private void esquemaConceitualGlobal, criaConceitoLexicoGlobal(EsquemaConceitual String nome, String valor) { ConceitoLexico conceitoLexico = new ConceitoLexico(); conceitoLexico.setNome(nome); conceitoLexico.setValor(valor); esquemaConceitualGlobal.addConceitoLéxico(conceitoLexico); } private void esquemaConceitualGlobal, criaConceitoNaoLexicoGlobal(EsquemaConceitual String nomeConceito) { ConceitoNaoLexico conceitoNaoLexico = new ConceitoNaoLexico(); conceitoNaoLexico.setNome(""); conceitoNaoLexico.setRelacionamentosAssociacao(null); conceitoNaoLexico.setRelacionamentosHerança(null); esquemaConceitualGlobal.addConceitoNaoLéxico(conceitoNaoLexico); } private void esquemaConceitualGlobal, criaRelacionamentoAssociacao(EsquemaConceitual String nome, String cardinalidadeDireta, String cardinalidadeInversa, 121 Conceito sourceConcept, Conceito targetConcept, List<Relacionamento> listaRelacionamentosDisjuntos) { RelacionamentoAssociacao relacionamentoAssociacao = new RelacionamentoAssociacao(); relacionamentoAssociacao.setNome(nome); relacionamentoAssociacao.setCardinalidadeDireta(cardinalidadeDireta); relacionamentoAssociacao.setCardinalidadeInversa(cardinalidadeInversa); relacionamentoAssociacao.setSourceConcept(sourceConcept); relacionamentoAssociacao.setTargetConcept(targetConcept); relacionamentoAssociacao.addDisjuncao(null); } private void esquemaConceitualGlobal, criaRelacionamentoHeranca(EsquemaConceitual String nome, List<Relacionamento> listaRelacionamentosDisjuntos, Conceito sourceConcept, Conceito targetConcept) { RelacionamentoHeranca relacionamentoHeranca RelacionamentoHeranca(); relacionamentoHeranca.setNome(nome); relacionamentoHeranca.setSourceConcept(sourceConcept); relacionamentoHeranca.setTargetConcept(targetConcept); relacionamentoHeranca.addDisjuncao(null); } = public List<Cluster> getListaClustersMistos() { return listaClustersMistos; } public void setListaClustersMistos(List<Cluster> listaClustersMistos) { this.listaClustersMistos = listaClustersMistos; } } package binx.unificador.model; import java.util.ArrayList; import java.util.List; public abstract class Relacionamento { Conceito sourceConcept; Conceito targetConcept; new 122 List<Relacionamento> disjuncoes; String nome; public Relacionamento() { disjuncoes = new ArrayList<Relacionamento>(); } public Conceito getSourceConcept() { return sourceConcept; } public void setSourceConcept(Conceito sourceConcept) { this.sourceConcept = sourceConcept; } public Conceito getTargetConcept() { return targetConcept; } public void setTargetConcept(Conceito targetConcept) { this.targetConcept = targetConcept; } public List getDisjuncoes() { return disjuncoes; } public void setDisjuncoes(List<Relacionamento> disjuncoes) { this.disjuncoes = disjuncoes; } public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } } package binx.unificador.model; public class RelacionamentoAssociacao extends Relacionamento { String cardinalidadeDireta; String cardinalidadeInversa; public RelacionamentoAssociacao() { super(); } 123 public void addDisjuncao(Relacionamento relacionamento) { this.disjuncoes.add((RelacionamentoAssociacao)relacionamento); } public void removeDisjuncao(Relacionamento relacionamento) { this.disjuncoes.remove((RelacionamentoAssociacao)relacionamento); } public String getCardinalidadeDireta() { return cardinalidadeDireta; } public void setCardinalidadeDireta(String cardinalidadeDireta) { this.cardinalidadeDireta = cardinalidadeDireta; } public String getCardinalidadeInversa() { return cardinalidadeInversa; } public void setCardinalidadeInversa(String cardinalidadeInversa) { this.cardinalidadeInversa = cardinalidadeInversa; } } package binx.unificador.model; public class RelacionamentoHeranca extends Relacionamento { public RelacionamentoHeranca() { super(); } public void addDisjuncao(Relacionamento relacionamento) { this.disjuncoes.add((RelacionamentoHeranca)relacionamento); } public void removeDisjuncao(Relacionamento relacionamento) { this.disjuncoes.remove((RelacionamentoHeranca)relacionamento); } } package binx.unificador.model; import java.util.ArrayList; 124 import java.util.List; public abstract class Conceito { String nome; List<RelacionamentoHeranca> relacionamentosHerança; List<RelacionamentoAssociacao> relacionamentosAssociacao; public Conceito() { relacionamentosHerança = new ArrayList<RelacionamentoHeranca>(); relacionamentosAssociacao = new ArrayList<RelacionamentoAssociacao>(); } public Conceito(String umNome) { relacionamentosHerança = new ArrayList<RelacionamentoHeranca>(); relacionamentosAssociacao = new ArrayList<RelacionamentoAssociacao>(); this.nome = umNome; } public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } public List getRelacionamentosHerança() { return relacionamentosHerança; } public void setRelacionamentosHerança(List<RelacionamentoHeranca> relacionamentosHerança) { this.relacionamentosHerança = relacionamentosHerança; } public List getRelacionamentosAssociacao() { return relacionamentosAssociacao; } public void setRelacionamentosAssociacao(List<RelacionamentoAssociacao> relacionamentosAssociacao) { this.relacionamentosAssociacao = relacionamentosAssociacao; } public void addRelacionamentoHeranca(RelacionamentoHeranca relacionamento) { this.relacionamentosHerança.add(relacionamento); } 125 public void addRelacionamentoAssociacao(RelacionamentoAssociacao relacionamento) { this.relacionamentosAssociacao.add(relacionamento); } } package binx.unificador.model; public class ConceitoLexico extends Conceito { String tipoDado; String valor; public String getValor() { return valor; } public void setValor(String valor) { this.valor = valor; } public String getTipoDado() { return tipoDado; } public void setTipoDado(String tipoDado) { this.tipoDado = tipoDado; } } package binx.unificador.model; public class ConceitoNaoLexico extends Conceito { } package binx.unificador.model; public final class Metadados { public static final String RELATED_CONCEPTS = "RelatedConcepts"; public static final String ASSOCIATION_RELATIONSHIP = "AssociationRelationship"; public static final String INHERITANCE_RELATIONSHIP = "InheritanceRelationship"; 126 public static final String NON_LEXICAL_CONCEPT = "NonLexicalConcept"; public static final String LEXICAL_CONCEPT = "LexicalConcept"; public static final String SOURCE_CONCEPT = "SourceConcept"; public static final String TARGET_CONCEPT = "TargetConcept"; public static final String DIRECT_CARDINALITY = "DirectCardinality"; public static final String INVERSE_CARDINALITY = "InverseCardinality"; public static final String DATA_TYPE = "DataType"; } package binx.unificador.model; import java.util.ArrayList; import java.util.List; public class Cluster { List<Conceito> listaConceitos; String tipo; public Cluster() { listaConceitos = new ArrayList<Conceito>(); } public Cluster(String tipoCluster) { listaConceitos = new ArrayList<Conceito>(); this.tipo = tipoCluster; } public List<Conceito> getListaConceitos() { return listaConceitos; } public void setListaConceitos(List<Conceito> listaConceitos) { this.listaConceitos = listaConceitos; } public String getTipo() { return tipo; } public void setTipo(String tipo) { this.tipo = tipo; } public void addConceitoLista(Conceito conceito) { 127 this.listaConceitos.add(conceito); } public void removeConceitoLista(Conceito conceito) { listaConceitos.remove(conceito); } } package binx.unificador.model; import java.util.ArrayList; import java.util.List; public class ConjuntoClusters { List<Cluster> listaClusters; public ConjuntoClusters() { listaClusters = new ArrayList<Cluster>(); } public List<Cluster> getListaClusters() { return listaClusters; } public void setListaClusters(List<Cluster> listaClusters) { this.listaClusters = listaClusters; } public void addCluster(Cluster cluster) { listaClusters.add(cluster); } public void removeCluster(Cluster cluster) { listaClusters.remove(cluster); } } package binx.unificador.model; import java.util.ArrayList; import java.util.List; public class EsquemaConceitual { public List<ConceitoLexico> listaConceitosLexicos; public List<ConceitoNaoLexico> listaConceitosNaoLexicos; 128 public List<RelacionamentoHeranca> listaRelacionamentosHeranca; public List<RelacionamentoAssociacao> listaRelacionamentosAssociacao; public EsquemaConceitual() { listaConceitosLexicos = new ArrayList<ConceitoLexico>(); listaConceitosNaoLexicos = new ArrayList<ConceitoNaoLexico>(); listaRelacionamentosHeranca = ArrayList<RelacionamentoHeranca>(); listaRelacionamentosAssociacao = ArrayList<RelacionamentoAssociacao>(); } new new public void addConceitoLéxico(ConceitoLexico conceito) { listaConceitosLexicos.add(conceito); } public void addConceitoNaoLéxico(ConceitoNaoLexico conceito) { listaConceitosNaoLexicos.add(conceito); } public void addRelacionamentoHeranca(RelacionamentoHeranca relacionamento) { listaRelacionamentosHeranca.add(relacionamento); } public void addRelacionamentoAssociacao(RelacionamentoAssociacao relacionamento) { listaRelacionamentosAssociacao.add(relacionamento); } public void removeConceitoLéxico(ConceitoLexico conceito) { listaConceitosLexicos.remove(conceito); } public void removeConceitoNaoLéxico(ConceitoNaoLexico conceito) { listaConceitosNaoLexicos.remove(conceito); } public void removeRelacionamentoHeranca(RelacionamentoHeranca relacionamento) { listaRelacionamentosHeranca.remove(relacionamento); } public void removeRelacionamentoAssociacao(RelacionamentoAssociacao relacionamento) { listaRelacionamentosAssociacao.remove(relacionamento); } 129 public List getListaConceitosLexicos() { return listaConceitosLexicos; } public void setListaConceitosLexicos(List<ConceitoLexico> listaConceitosLexicos) { this.listaConceitosLexicos = listaConceitosLexicos; } public List getListaConceitosNaoLexicos() { return listaConceitosNaoLexicos; } public void setListaConceitosNaoLexicos(List<ConceitoNaoLexico> listaConceitosNaoLexicos) { this.listaConceitosNaoLexicos = listaConceitosNaoLexicos; } public List getListaRelacionamentosHeranca() { return listaRelacionamentosHeranca; } public void setListaRelacionamentosHeranca(List<RelacionamentoHeranca> listaRelacionamentosHeranca) { this.listaRelacionamentosHeranca = listaRelacionamentosHeranca; } public List getListaRelacionamentosAssociacao() { return listaRelacionamentosAssociacao; } public void setListaRelacionamentosAssociacao( List<RelacionamentoAssociacao> listaRelacionamentosAssociacao) { this.listaRelacionamentosAssociacao = listaRelacionamentosAssociacao; } }