MAC 499 - Trabalho de Formatura Supervisionado

Instituto de Matemática e Estatística - IME

Universidade de São Paulo - USP



Ontologias e a Biblioteca Virtual



Aluno: Andrew Gan King Yuan
Orientadora: Renata Wassermann
Prof. Responsável: Carlos Eduardo Ferreira





Sumário  topo da página 
 
  • 1. Introdução
  • 2. Inteligência Artificial
  • 3. Ontologia
  • 4. Web Semântica
  • 5. URI (Universal Resource Identifier)
  • 6. Modelo RDF (Resource Description Framework)
  • 7. OWL (Web Ontology Language)
  • 8. Jena
  • 9. O Aplicativo
  • 10. Implementação
  • 11. Dificuldades encontradas
  • 12. Matérias do IME
  • 13. Bibliografia

  • 1. Introdução  topo da página 
     


               A Biblioteca Virtual é uma aplicação com interface Web criada por Danilo Conde em Iniciação Científica para os professores do LIAMF (Laboratório de Lógica, Inteligência Artificial e Métodos Formais), para controle do compartilhamento de seus acervos pessoais de livros, artigos e outros itens.Uma das funções da aplicação é realizar uma busca no Banco de Dados utilizando-se de palavras chaves.
               Minha Iniciação Científica baseia-se em realizar uma modificação nesse esquema de busca, de forma que ela seja feita não apenas de acordo com a sintaxe da palavra-chave, mas de acordo com sua semântica, de seu sentido. Não queremos apenas buscar por ocorrências da palavra-chave, mas buscar por textos e publicações que possuam um assunto relacionado a ela, sendo que não necessariamente deve haver uma ocorrência dela. Assim, deve ser realizada uma busca pela palavra-chave e também pelos seus sinônimos.
               Tais sinônimos são encontrados utilizando-se de uma ontologia a ser fornecida pela minha professora orientadora. Como a biblioteca foi criada na linguagem PHP, e não há um manipulador de ontologias para PHP, a solução encontrada foi criar um programa em Java para tal, utilizando-se de uma Framework chamada Jena, que será introduzida mais adiante neste documento. Assim, o programa Java alimentaria a busca da página PHP.
               Apesar de haver uma bolsa do CNPq disponível para esta Iniciação Científica, não pude recebê-la, pois já possuo fonte de renda, no estágio que faço. Mais informações sobre a Biblioteca Virtual podem ser encontradas em [2].
               Primeiro, eu colocarei este projeto no contexto da Inteligência Artificial, e então descreverei as áreas dela a que este projeto se relaciona e os conceitos mais importantes para o entendimento de como funcionam as ontologias, e como podemos usá-las. E então, estando compreendido o contexto, descreverei o aplicativo e sua implementação.
               Este projeto faz parte do projeto de pesquisa BIBO (Busca Inteligente Baseada em Ontologias) do Laboratório de Lógica, Inteligência Artificial e Métodos Formais (LIAMF) do Instituto de Matemática e Estatística da Universidade de São Paulo (IME-USP), coordenado pela Professora Renata Wassermann.


    2. Inteligência Artificial  topo da página 
     
               Um ser é considerado inteligente quando é capaz de atingir metas. Inteligência é a parte computacional da habilidade de alcançar essas metas no mundo. Inteligência Artificial é a ciência e a engenharia de construir máquinas inteligentes, especialmente programas de computador inteligentes. Essa é a definição de Inteligência Artificial.
               Para se criar uma máquina ou programa de computador capaz de alcançar um objetivo mais eficazmente, é desejável a compreensão de um contexto. O que temos usualmente são máquinas e programas que resolvem problemas, seguindo instruções programadas por seres humanos. Isso ocorre porque nem máquinas e nem programas possuem uma consciência, para terem a capacidade de criar suas próprias instruções. Assim, o que desenvolvedores fazem é aumentar a complexidade das instruções dadas aos programas ou às máquinas, criando a ilusão de elas estarem criando suas próprias soluções. O que sistemas de Inteligência Artificial buscam fazer é, de alguma forma, desenvolver máquinas e programas que tenham a capacidade de tomar decisões inteligentes para atingir uma meta.
               Um dos métodos adotados pela Inteligência Artificial, é o de dar ao agente (máquina ou programa) uma capacidade de compreensão de um contexto, para não simplesmente serem meros analisadores de strings e números, e executores de instruções. Em outras palavras, a compreensão de um contexto equivale a não apenas interpretar dados e a sintaxe de objetos, ou uma mera representação de objetos, mas interpretar a semântica deles, seus significados. Uma das áreas da Inteligência Artificial que estuda isso é a Ontologia.

    3. Ontologia  topo da página 
     
               Ontologia é um termo adaptado para a computação, emprestado da filosofia. Pela filosofia, a ontologia é o estudo do ser enquanto ser, de acordo com Aristóteles. Em outras palavras, Ontologia é um estudo sobre a existência. Mas em sistemas de Inteligência Artificial, dizemos que algo existe quando pode ser representado, ou, tudo que pode ser representado, existe.
               Para ontologias em sistemas de Inteligência Artificial a definição mais utilizada atualmente é a dada por Tom Gruber, um pesquisador da área: "Ontologia é uma especificação formal e explícita de uma conceitualização compartilhada". Mas o que quer dizer isso?
               Na Inteligência Artificial, os programas e sentenças lidam com vários tipos de objetos, que representam diferentes aspectos de um determinado domínio. A ontologia estuda quais são esses tipos, quais são suas propriedades básicas e quais são as conexões entre eles (relações, dependências e predicações). É uma especificação explícita de uma conceitualização. Resumidamente, é uma forma de representar um conjunto de objetos (concretos ou abstratos, reais ou irreais) e as relações entre eles, possibilitando assim que uma máquina entenda não apenas a sintaxe ou representação desse conjunto de objetos, mas também sua semântica, o significado desses objetos, e o que eles representam no nosso domínio.
               Ontologias são desenvolvidas por filósofos e cientistas trabalhando na área de Inteligência Artificial, teoria de bancos de dados, processamento de linguagem natural e representação de conhecimento.
               Para ficar mais claro o significado de ontologias, usarei um exemplo. Vamos criar uma ontologia representando o mundo acadêmico universitário. Uma classe nesse mundo seria, obviamente, universidade. Algumas instanciações de universidade poderiam ser USP, Unicamp, Unesp, entre outras. Podemos também criar a classe estudante. Para essa classe, podemos estabelecer algumas propriedades, como nome, sexo, idade, etc. Para a classe estudante, criamos as subclasses aluno e aluna, e podemos dizer que aluno é um estudante do sexo masculino e aluna uma estudante do sexo feminino. Podemos criar uma relação estudaEm. Assim, podemos dizer que uma instanciação da classe estudante estudaEm uma instanciação da classe universidade. Essa esquematização desse domínio escolhido é uma ontologia.
               As possibilidades são infinitas. Podemos também criar ontologias de um mundo imaginário, ou um mundo abstrato, ou até criar um mundo novo e descrevê-lo em uma ontologia. Podemos criar uma ontologia descrevendo sentimentos, ou descrevendo uma área de conhecimento, ou até um lugar físico, como uma cozinha por exemplo.

    4. Web Semântica  topo da página 
     
               Atualmente, a World Wide Web (WWW) possui uma imensa quantidade de informações, que vem se expandindo rapidamente. A maior parte desses dados é representada usando a Hypertext Markup Language (HTML), que foi desenvolvida para permitir que desenvolvedores web apresentem informação de uma maneira acessível para visualização por seres humanos via browser. Porém, HTML não disponibiliza um modo de descrever a informação de forma que facilite o uso de softwares para encontrá-la ou interpretá-la. Ele permite que a informação seja representada de uma forma bem estruturada, para visualização e compreensão por parte de seres humanos, mas para máquinas, toda essa informação não é de fácil compreensão. Máquinas e programas podem apenas armazenar a informação como meras sequências de caracteres, sem compreender seu significado. Um problema clássico que isso causa pode ser visto em sistemas de busca de palavras em um texto. Por exemplo, se quisermos buscar a palavra ar, poderiam aparecer diversos resultados indesejados, como andar, falar, armar, arcabouço, etc. Ou entramos em um site de busca, procurando pelo site de uma empresa chamada maçã, por exemplo :-). Certamente, receberíamos como resposta, milhares de sites sobre fazendas, plantações, feiras, supermercados, alimentação, refeições, e provavelmente, nem conseguiríamos encontrar o site realmente procurado em meio a tanta informação.

               Aí que entra a Web Semântica. A Web Semântica é um esforço conjunto para representação de dados na Web, liderado pela W3C (World Wide Web Consortium), com a participação de muitos parceiros e pesquisadores. Pelo uso de ontologias, a Web Semântica permite uma descrição bastante detalhada da informação contida em cada site. Mas como fazemos para representar uma ontologia? Para isso, foram desenvolvidas diversas linguagens de representação, baseadas em XML.. Alguns exemplos de linguagens são RDF (Resource Description Framework), SHOE (Simple HTML Ontology Extensions), XOL (Ontology Exchange Language), OML (Ontology Markup Language), DAML(DARPA Agent Markup Language), OIL(Ontology Inference Layer), DAML+OIL, OWL (Web Ontology Language), entre outros. Como essa é uma área de pequisa relativamente recente, ainda não se estabeleceu uma linguagem oficial para ontologias. De certa forma, uma linguagem é a evolução da outra, sendo que OWL é a linguagem mais atual.


    5. URI (Universal Resource Identifier)  topo da página 
     
               URIs são strings utilizadas para identificar recursos na web, como páginas, serviços, documentos, imagens, músicas, arquivos, caixas de e-mail, notícias, entre muitos outros. Há um grande número de formas de endereçamento, e mais outros podem ser ainda incorporados com o tempo. O URL (Universal Resource Locator) e o URN (Universal Resource Name) são tipos de URIs.
               Alguns exemplos de URI:

  • ftp://ftp.is.co.za/rfc/rfc1808.txt
  • gopher://spinaltap.micro.umn.edu/00/Weather/California/Los%20Angeles
  • http://www.linux.ime.usp.br/~andrew/mac499/index.htm
  • mailto:andrew@linux.ime.usp.br
  • news:comp.infosystems.www.servers.unix
  • telnet://melvyl.ucop.edu/

               A sintaxe do URI básica é

    <esquema>:<parte específica do esquema>

               Mas muitos tipo de URI possuem, em suas partes específicas, uma sintaxe semelhante, que é da forma

    <esquema>://<<autoridade><caminho>?<pergunta>

               Informações mais detalhadas podem ser encontradas em [9].


  • 6. Modelo RDF (Resource Description Framework)  topo da página 
     
               Darei uma breve descrição da sintaxe do RDF. Um modelo RDF é semelhante a um diagrama entidade relacionamento, e possui um sistema de classes, semelhante a programação orientada a objetos e sistemas de modelagem. Uma coleção de classes, normalmente criadas para um propósito ou domínio específico, é chamada de schema. As classes podem ser organizadas em uma hierarquia, além de haver também a possibilidade do uso de subclasses. Esse agrupamento de classes em uma coleção tem o propósito de especificar o significado de cada termo de uma forma mais precisa. Isso se dá pois, num mundo como a World Wide Web, existe uma infinidade de termos, tornando muito possível uma confusão entre eles. Assim, podemos entender o schema como uma espécie de dicionário, procurando especificar os termos e seus domínios de forma mais precisa. Cada termo é ligado ao seu schema através de um identificador do domínio, do contexto em que o objeto se encontra: o namespace .
               O modelo RDF é composto basicamente por 3 tipo de objetos: recursos (resources), propriedades (properties) e declarações (statements).
               Todas as coisas (classes) descritas por expressões RDF são recursos. Um recurso pode ser algum objeto presente em uma página Web, ou mesmo a própria página Web ou um conjunto delas. Um recurso não necessariamente é acessivel diretamente via Web. Pode ser também uma pessoa que trabalha em uma determinada empresa, ou um modelo de aparelho celular. Tudo aquilo que é descrito em uma ontologia, é um recurso. Cada recurso é identificado por um URI (Universal Resource Identifier) .
               Uma propriedade é um aspecto, uma característica, um atributo ou uma relação usada para descrever um recurso. Cada propriedade tem um significado específico, define seus valores permitidos, os tipos de recursos que ela pode descrever e sua relação com outras propriedades .
               Um certo recurso junto com uma propriedade nomeada mais o valor da propriedade para esse recurso é uma declaração. Esses 3 indivíduos de uma declaração são chamados, respectivamente, de sujeito (subject), predicado (predicate) e objeto (object). O objeto de uma declaração (ou seja, o valor da propriedade) pode ser um outro recurso (especificado por um URI) ou simplesmente uma string ou algum valor de tipo primitivo, definido pelo XML.
               Por exemplo, um sujeito (ou recurso) poderia ser a Robótica Cognitiva, indentificada pela URI

    file:/home/renata/ontologias/ontologies/IABibVirt.daml#RobóticaCognitiva

    em nossa ontologia. Um predicado (ou propriedade) poderia ser subClassOf, definida pelo RDF. E então, um objeto poderia ser um outro recurso, a Inteligência Artificial, de URI

    file:/home/renata/ontologias/ontologies/IABibVirt.daml#InteligênciaArtificial

               RDF também permite algumas informações adicionais sobre os recursos ou propriedades, através das propriedades rdfs:label, rdfs:comment, rdfs:seeAlso e rdfs:isDefinedBy. Uma representação em DAML do modelo descrito, seria:

    
    <daml:Class rdf:about="file:/home/renata/ontologias/ontologies/IABibVirt.daml#RobóticaCognitiva">
    	<rdfs:label>RobóticaCognitiva</rdfs:label>
    	<rdfs:comment>
    		<![CDATA[]]>
    	</rdfs:comment>
    	<oiled:creationDate>
    		<![CDATA[ 2003-07-02T14:42:30Z ]]>
    	</oiled:creationDate>
    	<oiled:creator>
    		<![CDATA[ renata ]]>
    	</oiled:creator>
    	<rdfs:subClassOf>
    		<daml:Class rdf:about="file:/home/renata/ontologias/ontologies/IABibVirt.daml#InteligênciaArtificial" />
    	</rdfs:subClassOf>
    </daml:Class>
    
    

               Para uma descrição mais detalhada, olhar em [10].


    7. OWL (Web Ontology Language)  topo da página 
     
               Aqui, darei uma breve descrição da linguagem OWL.
               A linguagem OWL foi desenvolvida para uso em aplicações que precisam processar o conteúdo de informações ao invés de simplesmente apresentá-las para humanos. Ela permite uma melhor interpretação de conteúdo Web do que a suportada por XML, RDF e RDFS, fornecendo vocabulário adicional acompanhado de uma semântica formal. Pode ser usada para representar o significado de termos de vocabulários explicitamente, e as relações entre esses termos. OWL é uma revisão da linguagem DAML+OIL. Ela é dividida em 3 sublinguagens: OWL Lite, OWL DL e OWL Full .
               Além das propriedades do RDF, OWL possui algumas peculiaridades, que aumentam a expressividade da linguagem. Algumas delas são:

  • Propriedades de igualdade e desigualdade: equivalentClass, equivalentProperty, sameAs, differentFrom, allDifferent
  • Características de propriedades: inverseOf, TransitiveProperty, SymmetricProperty, FunctionalProperty, InverseFunctionalProperty
  • Restrições sobre o tipo de propriedade: allValuesFrom, someValuesFrom
  • Restrição de cardinalidade: minCardinality, maxCardinality, cardinality
  • Intersecção de classes: intersectionOf
  • Tipos de dados: DataTypeProperty
  • Informações de cabeçalho: ontology, imports
  • Informações sobre versão: versionInfo, priorVersion, backwardCompatibleWith, inCompatibleWith, DeprecatedClass, DeprecatedProperty

               Para maiores informações sobre OWL, consultar [11].


  • 8. Jena  topo da página 
     
               Jena é uma Framework Java de código aberto para construção de aplicações de Web Semântica. É um conjunto de diversos pacotes e classes para manipulação, consulta e criação de ontologias. Foi desenvolvida em conjunto com a HP Labs Semantic Web Programme, e atualmente está na versão 2.0, disponivel em http://jena.sourceforge.net/
               O Jena é formado por diversos subsistemas. Um dos subsistemas é formado por uma API RDF, para manipulação de modelos RDF. Há um subsistema para persistência, que implementa uma extensão da classe Model, que disponibiliza persistência para modelos, pelo uso de banco de dados. Outro subsistema é o subsistema de raciocínio (reasoning subsystem). Ele incluí uma máquina para inferência baseado em regras genéricas. Ele possui alguns conjuntos de regras pré-configuradas, para cada linguagem, como RDFS, DAML+OIL, OWL e afins. Outro subsistema é o de ontologia. O Jena possui uma API para ontologias, para auxiliar programadores no uso de dados de ontologias baseados em RDF.
               Com o Jena, podemos criar ou manipular um modelo RDF como um conjunto de triplas RDF (sujeito-predicado-objeto), através de métodos baseados em declarações (statements), ou também como um conjunto de recursos com propriedades, através de métodos baseados em recursos.
               A API de ontologias possui suporte para OWL, DAML+OIL e RDFS. Essa API possui as classes Resource, Property e Statement, que, através de algumas abstrações, abrangem essas 3 linguagens, inclusive implementando também as relações entre elas. Esse subsistema trabalha diretamente ligado com o subsistema de raciocínio.
               Para consultas em modelos de ontologias, o Jena também implementa uma linguagem de consulta, o RDQL (RDF Data Query Language). Ele possui uma estrutura semelhande à do SQL.
               Para ficarmos mais claros sobre o funcionamento do Jena, vou dar algumas breves explicações sobre o seu uso e funcionamento.
               Para se criar uma nova ontologia, devemos criar um objeto da classe Model. A ontologia fica armazenada nessa classe. Mas para criar esse objeto, precisamos usar a classe ModelFactory. Essa classe fornece alguns métodos para a criação de um modelo. Ela permite criar diversos tipos de modelos, e também modelos para diferentes linguagens. O modo mais fácil é criar um modelo default, através do método ModelFactory.createDefaultModel(), que retorna um modelo RDF guardado em memória, que não faz inferências e não possui nenhuma interface ontológica especial.
               Para usar RDFS, OWL ou DAML, criamos um ontology model, que é um modelo que apresenta o RDF como uma ontologia. Para definir alguma dessas linguagens, precisamos usar perfis, que são fornecidos como argumento para a função createOntologyModel(java.lang.String languageURI). Essa função retorna um objeto do tipo OntModel. Um exemplo de criação de um ontology model usando OWL Full pode ser:

    OntModel m = ModelFactory.createOntologyModel( ProfileRegistry.OWL_LANG );

               Criado o modelo, podemos adicionar recursos, propriedades e declarações. Para criar um recurso, usamos o método createResource(String URI) da classe Model, que retorna um objeto da classe Resource. Podemos também criar proprierades e adicioná-las aos recursos, pelo método addProperty().
               Podemos também carregar em um modelo uma ontologia já montada, em um arquivo no formato XML, utilizando o método read(java.io.InputStream in, java.lang.String base) da classe Model.
               Agora que já temos uma ontologia, podemos navegá-la usando algumas funções que retornam iteradores, como listStatements() ou listProperties(), entre outros. Essas funções são da classe Model. Podemos também fornecer uma consulta RDQL para o modelo, usando a classe Query. Um exemplo seria:

    Query query = new Query(
      "SELECT ?x WHERE (<file:/home/renata/ontologias/ontologies/IABibVirt.daml#ArtificialIntelligence>,<http://www.daml.org/2001/03/daml+oil#sameClassAs>, ?x)");
    query.setSource(model);
    QueryExecution qe = new QueryEngine(query);
    QueryResults results = qe.exec();
    Iterator it = results.

    Os resultados da consulta estão no iterador.
    Esta foi uma breve demonstração do funcionamento do Jena.


    9. O Aplicativo  topo da página 
     
               A proposta desta iniciação científica foi pesquisar a respeito de ontologias e modificar o esquema de busca realizado pela Biblioteca Virtual , fazendo com que essa busca fosse realizada não somente pela palavra fornecida, mas também por seus sinônimos. Os sinônimos são indicados por uma ontologia a ser fornecida pela minha professora orientadora. O aplicativo é um tanto simples. Ele é um projeto inicial, criado para demonstrar as possibilidades do uso de ontologias e do Jena.
               Tendo em vista o proposto, a solução escolhida foi o desenvolvimento de um programa Java com interface gráfica awt. O programa realiza a consulta na ontologia utilizando-se do Jena 2, procurando em uma ontologia os sinônimos de palavras fornecidas. Assim, o programa gera os sinônimos das palavras e então abre a página de consulta da Biblioteca Virtual com o campo de consulta já preenchido pelos sinônimos. Porém, como na busca da Biblioteca Virtual não estava implementado o uso de mais de uma palavra na busca, foi necessária uma mudança em sua implementação. A seguir, darei detalhes sobre a implementação de ambos.
               O programa pode ser encontrado aqui. Para ele rodar, é necessário estar instalado na máquina o J2SDK e o Jena2, com a variável CLASSPATH apontando devidamente para as bibliotecas do J2SDK e também do Jena2, que são arquivos jar.

    10. Implementação  topo da página 
     
               Foi desenvolvido um aplicativo de nome Teste.java. A seguir, fornecerei detalhes das diferentes partes da implementação.

    10.1. Leitura das configurações

               Configurações como o nome do arquivo contendo a ontologia, o namespace da ontologia, o URI da propriedade SameClassAs e a URL da Biblioteca Virtual podem ser modificados, editando-se o arquivo teste.conf. O aplicativo, durante sua inicialização, realiza uma leitura nesse arquivo, checando os valores definidos para as variáveis contidas no arquivo, e carrega-os no aplicativo. A leitura desse arquivo é realizada utilizando-se da classe BufferedReader, que possibilita a leitura da entrada desejada linha por linha, já que se utiliza de um buffer para armazenamento dos caracteres lidos. Essa leitura é realizada pela função readLine(). É fornecido ao construtor do BufferedReader um FileReader do arquivo teste.conf, setando o arquivo como a entrada lida pelo BufferedReader.
                A formatação do arquivo foi pré-definida. Sua forma é:

    arquivoEntrada=teste.daml
    namespace=file:/home/renata/ontologias/ontologies/IABibVirt.daml#
    sameClassAs=http://www.daml.org/2001/03/daml+oil#sameClassAs
    bibliotecaVirtual=http://www.ime.usp.br/~ayuan/mac499/biblioteca/redirector.php
    			

                Assim, sua leitura se torna mais imediata, não sendo necessário o uso de StringTokenizer ou algo do tipo para checagem do arquivo. Foi definido que essa disposição do arquivo deve ser mantida, inclusive a ordem das variáveis. A leitura é realizada linha por linha, sendo definido, por exemplo, que todos os caracteres da primeira linha a partir do décimo quinto caractere é o nome do arquivo da ontologia. Assim foi realizada a leitura de cada uma das variáveis, que é realizada pela função leArquivoConf(String arquivo). Essa função lança 2 tipos de excessões. IOException e FileNotFoundException. Ela lança uma IOException caso haja algum problema com a leitura do arquivo, como a formatação do arquivo esperada não corresponder à encontrada. Ela lança uma FileNotFoundException caso o arquivo de configurações não seja encontrado. O código dessa função encontra-se logo abaixo.
    	private void leArquivoConf(String arquivo)
    		throws IOException, FileNotFoundException {
    		FileReader entrada;
    		try {
    			entrada = new FileReader(arquivo);
    			BufferedReader conf = new BufferedReader(entrada);
    			try {
    				String linha = conf.readLine();
    				this.nomeArquivo = linha.substring(15, linha.length());
    				linha = conf.readLine();
    				this.namespace = linha.substring(10, linha.length());
    				linha = conf.readLine();
    				this.sameClassAs = linha.substring(12, linha.length());
    				linha = conf.readLine();
    				this.bibVirtual = linha.substring(18, linha.length());
    			} catch (IOException e) {
    				throw new IOException();
    			}
    		} catch (FileNotFoundException e1) {
    			throw new FileNotFoundException();
    		}
    
    	}
    			

    10.2. Leitura do arquivo da Ontologia

                Agora que já sabemos o nome do arquivo contendo a ontologia, podemos carregá-la em um objeto da classe OntModel, criado pela função ModelFactory.createOntologyModel(). Então, criamos um objeto da classe FileInputStream apontando para o arquivo da ontologia, e então passamos esse objeto para a função read() da classe OntModel. Passamos também como argumento dessa função o namespace da ontologia. O arquivo da ontologia está no formato XML.
                Essa leitura descrita é realizada pela função carregaOntologia(String arquivo). Seu código encontra-se a seguir.

    	private void carregaOntologia(String arquivo)
    		throws OntologyNotFoundException {
    		try {
    
    			InputStream in = new FileInputStream(arquivo);
    
    			this.m = ModelFactory.createOntologyModel();
    			this.m.read(in, this.namespace);
    
    			System.out.println("Arquivo " + nomeArquivo + " lido");
    
    		} catch (IOException excep) {
    			throw new OntologyNotFoundException();
    		}
    	}
    			  

    10.3. Interface gráfica

               Foi desenvolvida para este programa uma interface gráfica com todas as funcionalidades requisitadas, utilizando-se do AWT. Ela é composta por um campo de texto, um combo box e 3 botões: Gerar sinônimos, Remover e Pesquisar.
               No campo de texto, deve ser fornecida a palavra cujos sinônimos desejamos encontrar. Então, deve-se clicar no botão Gerar sinônimos para que o combo box seja preenchido com os sinônimos encontrados.
               Pode-se selecionar no combo box palavras que não correspondam ao procurado, selecionando-as e então clicando no botão Remover.
               Após gerados os sinônimos, deve-se então clicar no botão Pesquisar, que fará com que o programa abra o browser e carregue a Biblioteca Virtual. Logando nela, o usuário será direcionado para a seção de pesquisa.
               Para cada um dos botões foi atribuído um ActionListener . Assim, podemos atribuir uma ação para o clique de cada um dos botões. O clique de algum deles gera uma chamada da função actionPerformed(ActionEvent e) . Na implementação dessa função, precisamos então verificar qual dos botões foi clicado, para então tomar as devidas ações. Agora, irei detalhar o que acontece com o clique de cada um deles.

    10.3.1. Gerar sinônimos

               Ao clique do botão Gerar sinônimos, cria-se um vetor de strings contendo cada palavra digitada no campo de texto. Para cada palavra, armazenada em um objeto s da classe String , realiza-se uma busca na ontologia, através da criação de um objeto da classe Query. Essa busca é realizada pelo código
    	query =
    		new Query(
    			"SELECT ?x WHERE(<"
    				+ this.namespace
    				+ s
    				+ ">, <"
    				+ this.sameClassAs
    				+ ">, ?x)");
    					
    	query.setSource(m);
    	qe = new QueryEngine(query);
    	results = qe.exec();
    
               Por meio dessa busca, estamos procurando tuplas da forma (s, SameClassAs, ?x), ou seja, todas as palavras que são da mesma classe que s. O resultado dessa busca é colocado no iterador results.
               Gerados os resultados, o iterador results percorre-os, acrescentando no combo box todas as palavras encontradas que já não estejam presentes nele, e também a própria palavra buscada. Porém, é necessário pegar apenas o nome local de cada resource encontrado, já que ele, na verdade, é referido pelo seu endereço URI. Isso é realizado pela função getLocalName() da classe Resource.

    10.3.2. Remover

               Com o clique do botão Remover, o programa procura a palavra que está selecionada no combo box, e remove-a dele. Isso é realizado pelo código
    	sinonimos.remove(sinonimos.getSelectedItem());
    

    10.3.3. Pesquisar

               Após isso, o usuário deve clicar em "pesquisar", que fará com que o aplicativo carregue o browser e abra a Biblioteca Virtual. Logando nela, o usuário será direcionado para a seção de busca, com o campo de busca já preenchido com um texto de busca gerado pelo aplicativo java.
               Esse texto de busca é formado por todas as palavras encontradas, separadas pela palavra-chave "OR". O programa monta esse texto de busca pegando cada palavra contida no combo-box.
               Montado esse texto de busca, o programa abre o browser default do usuário utilizando-se da classe BrowserControl, incluída no programa. O browser é direcionado para o endereço da Biblioteca Virtual , sendo incluído nesse endereço a busca, de forma que ela possa ser resgatada dentro da biblioteca.
               Para realizar essa interação entre o programa e a Biblioteca Virtual, tiveram que ser feitas algumas modificações na biblioteca. O programa, ao abrir o browser, abre a biblioteca na seção de login. A biblioteca detecta se foi o programa quem abriu ela, verificando se foi fornecida alguma busca. Se foi aberta pelo programa, após feito o login, o usuário é direcionado para a seção de busca, com o campo de busca já preenchido pelo texto de busca gerado pelo programa. Isso tudo é feito utilizando-se de gets e posts, no PHP, linguagem na qual a biblioteca foi desenvolvida.
               Na busca da Biblioteca Virtual foram implementadas duas palavras-chave "AND" e "OR", para podermos nos utilizar das funcionalidades exigidas pelo programa. Assim, usando-se "AND", todas as palavras encontradas devem obrigatoriamente estar no i­tem procurado. Usando-se "OR", pelo menos uma das palavras deve estar presente.


    11. Dificuldades encontradas  topo da página 
     
               O primeiro problema encontrado foi descobrir algum meio de manipular uma ontologia, já que a Biblioteca Virtual foi implementada em PHP, e não foi encontrado nada em PHP que manipulasse ontologias. Foram encontrados alguns programas servidores que faziam isso, mas não pareceu ser uma solução muito boa, já que o servidor teria que ser instalado na rede IME. Para isso, a solução mais direta encontrada foi usar Java, através do Jena.
               Assim, já que a Biblioteca Virtual é uma aplicação Web, decidi desenvolver um applet que utilizasse o Jena. Porém, foram encontrados alguns problemas para isso. As bibliotecas do Jena são grandes demais. Os arquivos são muito pesados para serem carregados pela internet toda vez que quisermos rodar o applet. Então, decidi estabelecer que todas as máquinas que quiserem se utilizar do applet deveriam ter o Jena instalado. Mas então, descobri que applet não pode carregar bibliotecas externas, como restrição de segurança. Outro problema seria ter que carregar toda vez o arquivo da ontologia, que também pode ser um arquivo grande demais.
               Por isso, decidi não usar applet, mas criar um aplicativo Java normal, que então abriria o Browser e carregaria a Biblioteca Virtual, alimentando o campo de busca.
               Como essa é uma área de pesquisa relativamente nova, houve uma certa dificuldade para encontrar fontes para estudo e também ferramentas. Além disso, é uma área bastante complexa, com muitos pequenos detalhes imprescindíveis para a compreensão do todo. Assim, foi necessária muita leitura e muito estudo para a compreensão do assunto. Todas as fontes de estudo necessárias foram citadas na bibliografia deste documento.

    12. Matérias do IME  topo da página 
     
               Matérias do IME que contribuíram para a realização desta Iniciação Científica:

    MAC110 - Introdução a Computação
    MAC122 - Princípios de Desenvolvimento de Algoritmos,
    MAC323 - Estruturas de Dados
    MAC211 - Laboratório de Programação

               Antes de ingressar no curso de Ciência da Computação do IME, eu era apenas um usuário do computador. Não tinha a menor noção de programação. Essas matérias foram essenciais para que eu me familiarizasse com as técnicas e metodologias de programação, em especial, a linguagem C, que me deu uma base para a lógica de programação. Assim, essas matérias foram as que me familiarizaram com a programação, imprescindível para esta Iniciação Científica. Além disso, em MAC211 aprendi a usar sistemas Unix e seus comandos, usados no desenvolvimento do projeto tanto no próprio ambiente Linux, como em SSHs, sendo que a Biblioteca Virtual está hospedada na rede IME, ambiente Linux.
     

    MAC242 - Laboratório de Programação II

               Nessa matéria foi que eu aprendi os conceitos da programação orientada a objetos, e a linguagem Java em particular, utilizada em todo o desenvolvimento do programa que interage com a Biblioteca Virtual. Além disso, aprendi a linguagem Perl, semelhante a PHP, que foi a linguagem utilizada no desenvolvimento da Biblioteca Virtual. Aprendi também expressões regulares, utilizadas no aplicativo para manipulação de strings.
     

    MAC426 - Sistemas de Bancos de Dados

               Nessa matéria foi aprendida a linguagem SQL, semelhante a RDQL utilizada no Jena, dando-me uma base do funcionamento de uma busca, e de como se deve pensar ao querer realizar uma busca num banco de dados, em especial a noção de tuplas.
     

    MAC425 - Inteligência Artificial

               Esta foi a matéria mais importante para a Iniciação Científica, já que nela, além de ter criado sistemas de IA em Java, foram dados alguns conceitos adotados em ontologias. Foi um curso em que eu desenvolvi bastante os meus conhecimentos da linguagem Java, pois desenvolvi diversos projetos nessa linguagem. Mas mais importante do que isso, foram algumas noções sobre a Inteligência Artificial, como o armazenamento de informações e relacionamentos entre elas, que é a forma utilizada para uma máquina compreender melhor um determinado ambiente. As ontologias giram em torno disso, pois definem classes, objetos e relacionamentos e propriedades. Toda essa maneira de pensar e encarar as ontologias foi adquirida nesse curso, que foi essencial para a realização e compreensão deste projeto.
     

    MAC438 - Programação Concorrente

               Apesar de o aplicativo não utilizar de programação concorrente diretamente, essa matéria foi bastante útil já que nela realizei em EPs muita programação Java, em projetos relativamente grandes, podendo assim desenvolver bastante meus conhecimentos sobre a linguagem.
     

    MAC332 - Engenharia de Software

               Apesar de o aplicativo criado ser apenas um aplicativo de testes, alguns conceitos de engenharia de software foram utilizados para melhor organização do código do aplicativo, em particular a abstração de funções e a modularização do código, que facilitam o entendimento do mesmo.


    13. Bibliografia  topo da página 
     
  • [1] ScientificAmerican.com - The Semantic Web
  • [2] Biblioteca Virtual
  • [3] W3C - DAML+OIL Reference Description
  • [4] Knowledge-System Technology: Ontologies and Problem-Solving Methods
  • [5] Sesame (Servidor de ontologias)
  • [6] HP - Jena Tutorial
  • [7] DAML
  • [8] Ontologia
  • [9] URI
  • [10] Sintaxe do RDF
  • [11] Sintaxe do OWL

               Seminários
    Seminário do Grupo de Lógica, Inteligência Artificial e Métodos Formais (LIAMF) - 27/5/03
    Título: Ontologias, Web Semântica e Aplicações.