Por que eu devo ler este artigo:

Este artigo trata do uso de Ontologias para enriquecer, com mais semântica, suas aplicações. Para isso, esclarecemos conceitos importantes sobre Ontologia, citamos alguns exemplos de aplicação da tecnologia, e utilizamos o framework Jena na construção de uma Ontologia.


Para que serve:

Organização de conteúdo, refinamento de buscas, construção de bases de conhecimento e padronização de vocabulário para um determinado domínio.


Em que situação o tema é útil:

A construção de um sistema para gerenciamento de conteúdo pode utilizar uma Ontologia para guiar a organização e classificação dos dados, e auxiliar a busca. A especificação de regras para um determinado domínio pode ser feita em uma Ontologia, o que permitirá o reúso dessas regras em qualquer outro sistema.

Neste artigo mostramos a construção passo a passo de uma Ontologia, utilizando o framework Jena, ao mesmo tempo em que definimos e exemplificamos as características e os componentes de uma Ontologia.

A Web Semântica, que surgiu nesta década, é uma evolução da web que visa estruturar as informações através de relações semânticas. Segundo o Dicionário Aurélio, semântica é o estudo das palavras no que diz respeito a seus significados. O objetivo é ampliar a compreensão do conteúdo da web por pessoas e pelos computadores.

Os desenvolvedores já perceberam que com o crescimento e expansão da rede mundial de computadores, pessoas no mundo inteiro vêm alimentando bases de conhecimento, principalmente através das chamadas redes sociais.

Nota: Redes Sociais são ecossistemas de participação, onde os valores são criados pela agregação de muitas contribuições individuais de seus usuários.

Um desafio nesse contexto é que o conteúdo disponível na maioria das páginas web só tem significado para os seres humanos, já para as máquinas, ou sistemas computacionais, não passam de um conjunto de caracteres. Desta forma, a maioria dos motores de busca na web acaba levando em consideração apenas a sintaxe, e não a semântica, no momento de realizar a busca, o que nem sempre traz um resultado satisfatório. Uma busca feita pela palavra aluno, por exemplo, não trará resultados contendo o termo discente, mesmo este sendo sinônimo de aluno.

Assim, um dos objetivos fundamentais da Web Semântica é aperfeiçoar o funcionamento dos motores de busca e viabilizar a ação de agentes lógicos. Uma vez que um agente de software consiga entender semanticamente uma página web, este poderá realizar tarefas que hoje só podem ser realizadas por seres humanos, por exemplo: montar um roteiro de lugares onde se deseja ir, levando em consideração tempo e deslocamento, como visitas a médicos ou cidades que se pretende conhecer durante uma viagem.

Em síntese o objetivo é colocar uma camada de significado sobre os dados. Para isso, aplicam-se técnicas para estruturar informações através de metadados, atribuindo semântica aos dados. Para exemplificar esta questão, imaginemos um site com informações sobre tecnologia onde os leitores comentam sobre este tema. No momento da recuperação destas informações alguns motores de busca são falhos por não terem uma camada de metadados, considerando somente a sintaxe das palavras e não a semântica. A ideia da Web Semântica é vincular as informações, por exemplo, deste site de tecnologia, com uma camada de metadados que possua os termos (vocabulário) relacionados ao assunto. Assim, torna-se possível efetuar buscas contextualizadas e com uma especificidade ao domínio em questão.

A principal iniciativa da Ciência da Computação na busca por uma solução para a Web Semântica é a Ontologia. Pode-se fazer uma correlação do uso de Ontologias, nesse cenário, com o uso de arquivos em linguagem XML para definição de metadados. Apesar das Ontologias serem escritas em linguagem OWL (Web Ontology Language), que é desenvolvida a partir do XML, elas são construídas para um determinado domínio, como medicina ou geologia, e possuem elementos de representação semântica mais poderosos do que os da linguagem XML. A Ontologia também possui uma estrutura mais formal e elementos como os conceitos (ou classes) e as relações (ou propriedades) entre esses conceitos.

Apesar do uso de Ontologias em sistemas computacionais ser um campo emergente, muitas empresas estão percebendo a importância de se desenvolver projetos envolvendo este conceito. Um deles é o Gene Ontology (www.geneontology.com), projeto de bioinformática de amplitude mundial que objetiva uniformizar as descrições sobre o gene, garantindo que vários grupos de pesquisa espalhados pelo mundo trabalhem sobre o mesmo vocabulário. A Petrobras também desenvolve um projeto com a finalidade de padronizar um vocabulário para os seus grupos de pesquisa. Com isso se torna possível trabalhar cooperativamente na estruturação de uma base de informações sobre arenitos e carbonatos para a avaliação da qualidade de reservatórios de petróleo.

Outra iniciativa importante é a das organizações Globo, com um projeto que visa estruturar o seu portal através do uso de Ontologia. A ideia é utilizar uma Ontologia que trate de assuntos gerais, como pessoas ou localidades, e mais quatro ou cinco Ontologias especializadas, abordando domínios como Esporte, Política ou Economia. Através dessas Ontologias as buscas feitas no portal Globo.com poderão ser mais específicas.

Utilizando o poder das relações entre conceitos de uma Ontologia o portal pode realizar uma busca por todos os gols perdidos por um determinado jogador e retornar um resultado satisfatório, utilizando uma Ontologia de Futebol que possua a propriedade gols perdidos. Ao invés de realizar uma busca sintática, como feita normalmente pelos motores de busca, com os termos gols perdidos de Paulo, onde o resultado, certamente, conteria também alguns gols feitos por Paulo. Mesmo a solução de associar tags (palavras-chave) às informações do site, é limitada neste caso, pois as tags não se relacionam. Isto é, mesmo que as tags gols, perdidos e Paulo estejam vinculadas ao vídeo, a busca seria feita sem considerar uma relação entre elas.

O uso de Ontologias também pode estar presente em projetos menores. Estamos desenvolvendo uma solução no Instituto Recôncavo de Tecnologia para classificação e recuperação de arquivos corporativos, disponíveis nos diretórios internos da rede. A realização das buscas é feita depois de uma consulta a Ontologia Organizacional do Instituto, que informa termos sinônimos aos solicitados, como Gerente de Projetos e Coordenador, e termos que possam contextualizar a busca, como Gerência de Riscos, Cronograma e outros. Também é possível utilizar os termos da Ontologia Organizacional como tags para classificar e buscar arquivos. Essa prática é denominada Folksonomia, já conhecida na web, sendo utilizada por diversos serviços como GMail e Flickr, onde o usuário pode atribuir suas tags a e-mails e fotos para classificá-los e buscá-los mais facilmente. A Folksonomia tem como base a classificação de conteúdo feita de forma livre pelo usuário.

Fique atento, pois o desenvolvimento de aplicações envolvendo Ontologia já está se tornando uma realidade, e o desenvolvedor precisa estar preparado para essa nova demanda de trabalho. Aplicações como gerenciadores de conteúdo, motores de busca e aplicações web podem se aperfeiçoar bastante se fizerem uso de uma Ontologia.

Neste artigo, apresentaremos os elementos conceituais que compõem uma Ontologia no padrão OWL conjuntamente com um exemplo prático que constrói, através do framework Jena, passo a passo, uma Ontologia de domínio acadêmico. Por fim, apresentamos um blog com recursos de organização semântica que ilustra a aplicabilidade da Ontologia construída. Este blog permite o vínculo de textos digitados nos posts a conceitos de Ontologias que podem ser carregadas no blog. Desta forma, os usuários terão dois benefícios: a utilização de tags extraídas de termos de uma Ontologia, que tem definições formais e utilizadas por especialistas; e a possibilidade de buscas contextualizadas por outros termos da Ontologia, melhorando o filtro da busca e o seu grau de acerto.

Entendendo o conceito de Ontologia

Inspirado na filosofia, o uso do termo Ontologia foi incorporado na Ciência da Computação objetivando o estudo de mecanismos para organização da informação. Em 1991, o termo Ontologia foi proposto pelo grupo de pesquisa DARPA Knowledge Sharing Effort, que apresentou a seguinte definição: “Uma Ontologia define os termos básicos e as relações que compreendem um vocabulário de um domínio, bem como as regras para combinar termos e as relações para definir extensões para o vocabulário”.

A ontologia tem várias definições, e neste artigo adota-se a que Thomas R. Gruber publicou em 1993 no artigo A Translation Approach to Portable Ontology Specifications: “Ontologia é uma especificação explícita e formal de um conceito compartilhado”. Em outras palavras, define um vocabulário para um determinado domínio em nível semântico, eliminando possíveis ambiguidades e identificando alguns sinônimos.

Além da especificação de conceitos, uma Ontologia também define formalmente restrições de um determinado domínio através de uma estrutura de relacionamentos entre conceitos, como um grafo ou uma rede. Isso permite que a Ontologia tanto seja manipulada pela máquina como também entendida pelos seres humanos. Até este ponto, nesse artigo, você leitor poderá ainda ter alguma dúvida sobre o conceito Ontologia, porém na seção Construindo uma Ontologia com o Framework Jena você terá uma abordagem prática que ajudará numa melhor compreensão do tema.

Karin Breitman, em seu livro Web Semântica a Internet do Futuro, publicado em 2005, apresenta os seis elementos abaixo como sendo os componentes básicos de uma Ontologia:

  • Conceitos (classes): definem as subáreas, ou subgrupos, de um domínio de interesse, como Pessoa, Veículo ou Médico;
  • Relacionamento (propriedades): Formas de interligar os conceitos. Por exemplo, um possível relacionamento entre os conceitos criação e criador poder ser definido como criado_por;
  • Hierarquia: Formas como os conceitos se organizam dentro de um domínio. Como uma taxonomia, onde carro é um conceito de veículo;
  • Funções: Determinam formas especiais de relacionamento, onde um determinado número de elementos se relaciona com apenas um elemento. Por exemplo, a função propriedade_de pode interligar um carro a apenas uma pessoa;
  • Indivíduos (instâncias): é a unidade materializada de uma classe, como João da Silva ou um carro específico que possui uma placa e chassi, identificando-o unicamente;
  • Axiomas: Determinam verdades sobre um determinado domínio. Por exemplo, todo pai tem no mínimo um filho.
Nota: Taxonomia - Classifica informações hierarquicamente, utilizando a relação pai e filho (generalização “tipo-de”). Por exemplo, temos a classificação dos seres vivos, um homem é uma pessoa, e uma pessoa é um animal.

Ontologias podem ser utilizadas como metadados a fim de viabilizar a Web Semântica, classificando um conteúdo, como uma foto ou um texto, através de alguns de seus elementos (classes, instâncias ou propriedades). Dessa forma pode-se atribuir certa semântica ao dado, permitindo a manipulação e o compartilhamento dessas informações.

Web Semântica

Berners Lee, um dos criadores da Internet, definiu a Web Semântica como a evolução da web, onde o conteúdo publicado nela tem significado bem definido, permitindo que computadores e seres humanos entendam-no e trabalhem em cooperação.

A ideia é que as páginas web, além do seu conteúdo, possuam uma camada de metadados que relacionem as informações com um determinado domínio. Assim, evita-se que o retorno de uma busca pela palavra artigo, por exemplo, traga resultados ligados a artigos acadêmicos e a livros de português com definições e exemplos de artigos definidos e indefinidos. Um dos elementos essenciais da Web Semântica é a representação dos dados em Ontologias, visando a estruturação de ambientes onde robôs de pesquisa interpretem a semântica dos dados.

Outra vantagem proporcionada pela web semântica será viabilizar a execução de tarefas na web, como agendamentos ou pesquisas, atualmente feitas apenas pelos seres humanos, por intermédio de agentes lógicos. Onde esses agentes serão capazes de identificar a utilidade do site, podendo classificá-lo como uma loja de roupas, por exemplo, e extrair informações sobre o site, como endereço ou razão social, caso seja o site de uma empresa. Desse modo, um usuário poderia utilizar um desses agentes lógicos para encontrar todos os web sites de lojas de roupas que tenham lojas físicas localizadas em um determinado bairro de sua cidade.

A W3C (World Wide Web Consortium), organização que padroniza as tecnologias da web, especifica uma arquitetura para a Web Semântica em sete camadas, são elas: URI (Universal Resource Identificador)/Unicode, XML/XML Schema/namespace, RDF (Resouce Description Framework)/RDF Schema, Ontologia, Lógica, Prova e Validação, como pode ser observado na Figura 1. A seguir os detalhes sucintos de cada camada:

  • URI é um padrão para identificação única de recursos, ou objetos, na web. Já o padrão Unicode refere-se à forma de como representar textos em várias línguas;
  • XML é uma linguagem de marcação para estruturar documentos. XML Schema é uma linguagem que descreve a estrutura de um documento XML, possibilitando a definição dos tipos de dados, regras de agrupamento e restrições;
  • Namespace é uma coleção de nomes, identificados unicamente por uma URI;
  • RDF é um modelo constituído por três elementos básicos: recursos, propriedades e declarações para descrever semanticamente um domínio. Já o RDF Schema (RDFS) é uma evolução do RDF, permitindo a utilização de conceitos como Classes e fornecendo um vocabulário básico de RDF para criar relações mais poderosas;
  • Ontologia, foco do nosso artigo, estende RDFS adicionando mecanismos mais avançados para descrever um domínio;
  • As camadas de Lógica, Prova e Validação têm como objetivo obter derivações através de provas lógicas no processo dedutivo, como por exemplo, se um Homem tem algum filho, logo ele é Pai.
Arquitetura da Web Semântica
Figura 1. Arquitetura da Web Semântica

RDF (Resource Description Framework)

O RDF é um modelo de dados e também uma linguagem voltada para representar informações associadas a recursos. Recursos são objetos como arquivos e serviços presentes na web que possuem um URI. Uma das utilidades do RDF é a representação de metadados propiciando integração entre sistemas, catalogando conteúdo e compartilhando conhecimento. Sites como o eBay e Amazon, por exemplo, fazem uso do RDF em sua estrutura de pesquisa. Além disso, permite a busca e descoberta de novos recursos. O RDF é um dos pilares para a construção de Ontologias como mecanismo de compartilhamento e interpretação de dados em domínios diferentes.

A representação de informações em RDF se baseia em uma tripla (estrutura com três elementos): recurso, propriedade e valor da propriedade. A Figura 2 exibe um exemplo dessa estrutura, onde o recurso é o endereço web http://saite.no-ip.info/rdf/, a propriedade é representada por data-catalogação e o valor da propriedade é representado pela data 12/10/2005. O que significa que o site http://saite.no-ip.info/rdf/ foi catalogado no dia 12/10/2005. Através dessas triplas o modelo RDF é capaz de expressar o significado das informações, da mesma forma que a relação entre sujeito, verbo e predicado de uma frase.

Exemplo da estrutura de um RDF
Figura 2. Exemplo da estrutura de um RDF

Padrão OWL

Existem várias linguagens para codificação de uma Ontologia, contudo, no presente artigo, focaremos na OWL, pois o W3C recomenda a sua utilização para o desenvolvimento e manipulação de Ontologias. Ela é baseada em RDF e RDF Schema, e utiliza sintaxe XML. Surgiu da linguagem DAML+OIL, que foi formada pela junção de duas linguagens, a DAML (DARPA Agent Markup Language) e a OIL (Ontology Inference Layer).

Existem três tipos de linguagem OWL. A OWL Lite é uma extensão da OWL DL, que por sua vez estende OWL Full. Cada tipo se adéqua às necessidades de grupos específicos de usuários e desenvolvedores de Ontologias. A seguir, resumidamente, detalha-se cada tipo:

  • OWL Lite permite apenas simples formas de construção de uma Ontologia, como por exemplo, as formas de relacionamento que só podem utilizar cardinalidade 0 ou 1. Ela é recomendada para usuários iniciantes que utilizarão poucos recursos da linguagem;
  • OWL DL fornece todas as construções da OWL, porém tem limitações quanto a disjunções. Por exemplo, uma classe não pode ser também um indivíduo, ou um indivíduo não pode ser ao mesmo tempo uma propriedade;
  • OWL Full também fornece todas as construções da OWL, mas sem restrições.

A arquitetura da Web Semântica, apresentada na Figura 1, possui uma camada que representa a linguagem OWL, denominada Ontologia. Esta camada, como já vimos, é estruturada e montada a partir das linguagens formais RDF e RDF Schema. A OWL se diferencia destas linguagens por possuir elementos com maior poder de representação semântica. Com uma propriedade do tipo simétrica pode-se indicar o mesmo sentido em ambos os lados de uma relação, por exemplo, se Pedro é irmão de Paulo, logo Paulo (também) é irmão de Pedro. Na seção Construindo uma Ontologia com o Framework Jena, onde construiremos a Ontologia exemplo, vamos explicar melhor este e outros tipos de propriedades.

Uma Ontologia no padrão OWL se assemelha a outros modelos de representação de dados mais antigos e conhecidos, tais como Entidade e Relacionamento, e Orientação a Objetos. Os conceitos principais (classes, propriedades e indivíduos) utilizados na especificação OWL podem ser correlacionados aos conceitos desses modelos. A Tabela 1 apresenta esta equivalência em cada um dos modelos.

Conceitos/Termos Modelo de Dados Convencional Modelos Orientados a Objeto Ontologia no padrão OWL
Instâncias Elementos Individualizados ou Ocorrências Objetos ou Instâncias Indivíduos
Classificação de Grupos de Instâncias ou Objetos Entidade Classe Classe ou Conceito
Características de uma Entidade ou Classe Atributos Atributos Propriedade de Tipo de Dados
Relacionamento entre as Entidades ou Classes Relacionamento Associações Propriedade de Objetos
Tabela 1. Conceitos utilizados na Modelagem de Dados, na Orientação a Objetos e na Ontologia OWL

O Framework Jena

O framework Jena é um projeto de código aberto desenvolvido originalmente pela HP (Hewlett-Packard). Ele possui um conjunto de funcionalidades para apoiar o desenvolvimento de aplicações no contexto da Web Semântica. Além das funcionalidades para manipulação da linguagem OWL, foco deste artigo, o Jena possui recursos para gerenciar linguagens como RDF, RDFS e DAML+OIL. Outro recurso interessante é a funcionalidade para uso do SPARQL (Protocol and RDF Query Language), uma linguagem de consulta a Ontologias.

O Jena tem um portal no endereço http://jena.sourceforge.net com uma boa documentação. Sugere-se complementar as informações obtidas neste artigo no portal e no site da W3C.

Construindo uma Ontologia com o Framework Jena

O objetivo desta seção é apresentar e exemplificar os principais elementos de uma Ontologia ao mesmo tempo em que construímos uma Ontologia de domínio Acadêmico, passo a passo, codificando-a com a ajuda do framework Jena. Para melhor compreensão do processo de construção, a estrutura da Ontologia proposta foi ilustrada em um diagrama de classes na UML (Unified Modeling Language), apresentado na Figura 3.

Diagrama de Classes do Domínio Acadêmico
Figura 3. Diagrama de Classes do Domínio Acadêmico

Observações para implementação do exemplo: os códigos apresentados devem ser executados em um método main(), de uma classe qualquer, de forma sequencial; o projeto a ser criado é um projeto Java normal, podendo ser utilizado qualquer IDE; é necessário criar o diretório c:\BaseOntologia no Windows, ou /BaseOntologia no Linux, para que o exemplo funcione corretamente, pois é nessa pasta que será salva a nossa Ontologia; as seguintes bibliotecas precisam ser incluídas no projeto:

  • commons-logging-1.1.jar;
  • icuj_3_4.jar;
  • iri.jar;
  • jena.jar;
  • log4j-1.2.9.jar;
  • slf4j-api.jar;
  • slf4j-jcl-1.5.2.jar;
  • xerces-2.6.2.jar;
  • xercesImpl.jar.

Vale ressaltar que não estruturamos o exemplo apresentado em várias classes e métodos para facilitar o entendimento do mesmo, e que as bibliotecas do Jena podem ser encontradas em seu site.

Criando uma nova Ontologia

O início do código, apresentado na Listagem 1, cria fisicamente um arquivo OWL, que representa uma Ontologia. Para isso, é necessário informar o diretório onde este arquivo será armazenado, o nome da Ontologia e o tipo de linguagem OWL que será utilizado – no nosso caso será o OWL DL (ver Listagem 1). Dessa forma, o primeiro passo é a chamada ao método estático createFileModelMaker(DIR), da classe ModelFactory, que recebe como parâmetro uma String para indicar o diretório onde será armazenado o arquivo OWL, e retorna uma referência da classe ModelMaker. Com esta referência, utiliza-se o método createModel(“Academia.owl”, false) para criar o arquivo OWL (fisicamente); o primeiro parâmetro define o seu nome e o segundo indica que ele será sobrescrito, caso já exista.

Em seguida utiliza-se o método createModel(), que retorna uma referência da classe Model, um modelo base para a Ontologia. Os comandos OntModelSpec spec = new OntModelSpec(OntModelSpec.OWL_DL_MEM) e spec.setImportModelMaker(maker) definem o tipo de linguagem que será utilizada na construção ou leitura do arquivo OWL. Recomenda-se usar a constante OntModelSpec.OWL_DL_MEM, pois esta define a linguagem OWL DL, que possui os recursos necessários para este exemplo.

Ainda no processo de configuração para criar a Ontologia, deve-se utilizar a linguagem OWL escolhida, variável spec do tipo OntModelSpec, juntamente com o modelo base da Ontologia, variável base do tipo Model, como parâmetros para chamar o método ModelFactory.createOntologyModel(spec, base). A aplicação desse método retorna uma referência da classe OntModel, que representa a Ontologia e que será armazenada na variável newM, que é do mesmo tipo. Depois desses passos, estamos prontos para iniciar a definição da Ontologia de domínio Acadêmico.

String DIR = "c://BaseOntologia/";
  String URL = "file:";
  OntModel newM = null;
  try {
    ModelMaker maker = ModelFactory.createFileModelMaker(DIR);
    Model base = maker.createModel("Academia.owl", false);
    OntModelSpec spec = new OntModelSpec(OntModelSpec.OWL_DL_MEM);
       spec.setImportModelMaker(maker);
    newM = ModelFactory.createOntologyModel(spec, base);
  } catch (Exception e) {
    e.printStackTrace();
  }
Listagem 1. Comandos Jena para criação da Ontologia

Agora devemos criar as classes Pessoa, PessoaF (Pessoa Física), Professor, Aluno, Discente, ProfessorAluno, PessoaJ (Pessoa Jurídica), Universidade e Turma, seguindo a hierarquia disposta no diagrama de classes da Figura 3. Esse diagrama representa a estrutura de um ambiente Acadêmico, sugerida para o nosso exemplo.

Antes de iniciarmos a codificação da Ontologia, vamos rapidamente definir o termo Classe, também chamado de Conceito. A Classe é um dos principais componentes da notação OWL, e determina uma classificação para grupos de indivíduos que possuem características estruturais iguais ou um conjunto de indivíduos do mesmo tipo. Semelhante a Orientação a Objetos, as classes podem estar organizadas de forma hierárquica (herança, superclasse ou subclasse).

No início do processo de criação da Ontologia faz-se necessário abrir uma transação para manipulação do arquivo OWL fisicamente, que é feita através do comando begin(), chamado através da referência newM (criada na Listagem 1). Ao final do processo, para que a persistência seja efetuada, gravando no arquivo as alterações realizadas, deve-se fechar a transação através do método commit().

Definição de Classes

A Listagem 2 apresenta o código em Jena para criar classes e indicar relações hierárquicas entre elas. A variável SOURCE define a URI da Ontologia, enquanto a variável camNS define junto com o nome de cada elemento (camNS + nomeDoElemento) a URI de cada elemento da Ontologia. Como a OWL é uma linguagem web, é necessário que tanto a Ontologia quanto seus elementos (classes e propriedades) tenham um identificador único.

Já o método newM.createClass( camNS + “Pessoa” ) é a forma para a criação de uma classe, neste caso a classe Pessoa. A montagem da hierarquia das classes é bem intuitiva, demandando somente o uso do método addSuperClass(pessoaClass), chamado através da referência que será a classe filha (pessoaFClass) e passando como parâmetro a referência que será a classe pai. No exemplo, criou-se uma relação onde a classe PessoaF herda as características da classe Pessoa.

String SOURCE = URL+DIR+"Academia.owl";
  String camNS = SOURCE + "#";
   
  newM.begin();
  OntClass pessoaClass = newM.createClass( camNS + "Pessoa" );
  OntClass pessoaFClass = newM.createClass( camNS + "PessoaF" );
  pessoaFClass.addSuperClass(pessoaClass);
    
  OntClass professorClass = newM.createClass( camNS + "Professor" );
  professorClass.addSuperClass(pessoaFClass);
    
  OntClass alunoClass = newM.createClass( camNS + "Aluno" );
  alunoClass.addSuperClass(pessoaFClass);
    
  OntClass pessoaJClass = newM.createClass( camNS + "PessoaJ" );
  pessoaJClass.addSuperClass(pessoaClass);
    
  OntClass universidadeClass = newM.createClass( camNS + "Universidade" );
  universidadeClass.addSuperClass(pessoaJClass);
Listagem 2. Código em Jena para criação da hierarquia das classes

Disjunção

Outra relação entre classes é a disjunção. Ela indica que se um indivíduo está em uma classe então não pode ser classificado na classe disjunta. No nosso exemplo, as classes PessoaF e PessoaJ são disjuntas. No Jena, para indicar esta regra, basta chamar o método pessoaFClass.addDisjointWith(pessoaJClass), como feito na Listagem 3.

Equivalência

As classes também podem ser equivalentes, por exemplo, Aluno º Discente. Em nosso exemplo, na Listagem 3, o método discenteClass.addEquivalentClass(alunoClass) mapeia a equivalência entre as classes Aluno e Discente, indicando que esses termos são sinônimos.

Herança Múltipla

Além disso, podem-se definir classes usando operadores de Ç (interseção) e È (união). No nosso exemplo, a partir das classes Aluno e Professor definiu-se uma nova classe: ProfessorAluno, indicando que ela equivale à interseção entre Professor e Aluno (ProfessorAluno º Professor Ç Aluno).

Na Listagem 3 foi utilizado o método newM.createIntersectionClass( camNS + “Professoraluno”, newM.createList( new RDFNode[] {alunoClass, professorClass}) ) para criar esta classe. A relação denota que, se criarmos uma instância vinculada à classe ProfessorAluno, ela também estará vinculada à classe Professor e à classe Aluno, ou seja, uma herança múltipla, onde o individuo criado a partir da classe ProfessorAluno será um Professor e também um Aluno.

// DISJUNÇÃO
  pessoaFClass.addDisjointWith(pessoaJClass);
   
  OntClass discenteClass = newM.createClass(camNS + "Discente");
   
  // EQUIVALÊNCIA
  discenteClass.addEquivalentClass(alunoClass);
   
  // INTERSEÇÃO
  OntClass processorAlunoClass = newM.createIntersectionClass
  (camNS + "Professoraluno", newM.createList(new RDFNode[] 
  {alunoClass, professorClass}));
Listagem 3. Código em Jena para criação de relações de disjunção, equivalência e interseção

Propriedades

Outro componente da OWL são as propriedades. Estas são utilizadas para descrever atributos e relacionamentos entre as classes. Um ponto diferente da Orientação a Objetos é que na OWL primeiramente se constroem as propriedades de forma independente, para depois relacionar as mesmas com as classes. Existem dois tipos de propriedades:

  • Propriedades de Tipo de Dados (Datatype): são usadas para associar classes a atributos tipos de dados (Datatype). Por exemplo, uma Pessoa tem um atributo nome que é do tipo String, e idade que é do tipo Integer;
  • Propriedades de Objetos: são usadas para mapear relações entre classes e, consequentemente, entre indivíduos. Por exemplo, a propriedade joga_no relaciona as classes Jogador e Time, e os indivíduos Ronaldo e Corinthians.

As propriedades são como ligações de um conceito a outro conceito, ou a um atributo, como no caso da Datatype. O primeiro lado da propriedade, aquele que é lido inicialmente, é chamado domínio, e o segundo, o qual é lido após a propriedade, é denominado Range. Juntos, domínio e range indicam o sentido semântico da relação, ou como esta deve ser lida, e limitam quais tipos de Classe ou Datatype podem ser relacionados por esta propriedade. Como no exemplo da Listagem 4, onde Universidade é a classe domínio da propriedade temTurma, e Turma é a classe range dessa propriedade (Universidade tem Turma).

Neste artigo, o nosso exemplo não vai tratar de propriedade DataType. Vamos trabalhar somente com propriedades de objetos.

Propriedade Funcional e Inversa Funcional

Vale ressaltar também que as propriedades possuem algumas características: uma delas é a funcional, que indica a existência de apenas uma referência no range da propriedade, de forma semelhante a uma relação n para 1.

Na Listagem 4 uma Turma só pode pertencer a uma Universidade, porém uma Universidade pode ter várias turmas, o que implica dizer que a relação temTurma é InversaFuncional, ou seja, sua inversa é Funcional, como numa relação 1 para n.

Quando uma relação é dita funcional e inversa funcional, significa que tanto o domínio quanto o range da propriedade só podem possuir uma referência, como numa relação 1 para 1.

As outras características possíveis de uma propriedade serão explicadas no decorrer do artigo.

Hierarquia de Propriedades

Similar às classes, também é possível definir uma hierarquia de propriedades de objeto, por exemplo, a propriedade tem é uma propriedade mais genérica de temFilho. Tem pode interligar qualquer tipo de classe e temFilho apenas a classe Pessoa, já que uma Pessoa só pode ter filhos que também sejam pessoas, mas outras classes podem ter objetos variados, como um País pode ter Capital, ou um Cachorro que pode ter uma Coleira.

Para definir propriedades no Jena utilizamos o método createObjectProperty(URL + "temTurma"), chamado pela referência newM e recebendo como parâmetro o nome da propriedade. O relacionamento entre a propriedade e as classes é feito através dos métodos addDomain() e addRange().

Propriedade Inversa

Ainda na Listagem 4, associamos à propriedade temTurma uma propriedade inversa a ela, a pertence_a_Universidade. Isso indica que essas propriedades têm o mesmo significado semântico, porém com sentidos (domínio e range) invertidos. Se uma Universidade tem Turma, logo uma Turma pertence a uma Universidade. Para indicar que uma turma só pertence a uma universidade podemos aplicar à propriedade pertence_a_Universidade o método convertToFunctionalProperty(), como feito na Listagem 4, ou aplicar à propriedade temTurma o método convertToInverseFunctionalProperty().

OntClass turmaClass = newM.createClass(camNS + "Turma");
   
  ObjectProperty temTurmaProperty = newM.createObjectProperty(URL + "temTurma");
   
  temTurmaProperty.addDomain(universidadeClass);
  temTurmaProperty.addRange(turmaClass);
   
  ObjectProperty pertence_a_UniversidadeProperty = newM.createObjectProperty(URL + 
  "pertencer_a_Universidade");
   
  pertence_a_UniversidadeProperty.addDomain(turmaClass);
  pertence_a_UniversidadeProperty.addRange(universidadeClass);
  pertence_a_UniversidadeProperty.convertToFunctionalProperty();
   
  pertence_a_UniversidadeProperty.convertToFunctionalProperty();
   
  temTurmaProperty.addInverseOf(pertence_a_UniversidadeProperty);
Listagem 4. Código em Jena para criação de Propriedade de Objeto Bidirecional temTurma e pertence_a_Universidade

Propriedade Simétrica

Uma propriedade também pode ser inversa dela própria. Essa é a característica Simétrica. Na Listagem 5, temos um bom exemplo dessa característica. Nela, domínio e range podem ser invertidos sem mudança na semântica da relação. Assim, se a universidade UFBA tem proximidade com a universidade UNEB, logo a UNEB também tem proximidade com a UFBA.

ObjectProperty proximidadeProperty = newM.createObjectProperty(URL + "proximidade");
  proximidadeProperty.addDomain(universidadeClass);
  proximidadeProperty.addRange(universidadeClass);
   
  proximidadeProperty.convertToSymmetricProperty();
Listagem 5. Código em Jena para criação de Propriedade Simétrica

Vejamos como esse tipo de característica pode ser facilmente manipulado por um software. Por serem formais e lógicas, essas restrições podem ser utilizadas para que softwares realizem inferências sobre determinadas instâncias em um motor de busca. Por exemplo, pode-se implementar uma busca por sinônimos graças à propriedade de equivalência, ou inferir graças à propriedade de simetria, que o texto João é irmão de Pedro pode ser retornado em uma busca que a consulta pede Pedro como irmão de João.

Propriedade Inversa Funcional

Na Listagem 6, temos um exemplo da propriedade inversa funcional. Na nossa Ontologia, mesmo sem ter uma propriedade inversa definida, leciona é dita inversa funcional, pois o seu domínio só pode possuir uma referência (uma disciplina só pode ser lecionada por um professor). Isso implica que a volta de sua relação só aponta para uma referência, ou seja, o domínio dessa propriedade só pode ter um valor em cada relação. Nesse exemplo, uma turma só pode ser lecionada por um professor.

ObjectProperty
lecionaProperty = newM.createObjectProperty(URL + "leciona");
lecionaProperty.addDomain(professorClass);
lecionaProperty.addRange(turmaClass);
lecionaProperty.convertToInverseFunctionalProperty();
Listagem 6. Código em Jena para criação de Propriedade do Objeto leciona

Propriedade Transitiva

Outra restrição importante é a propriedade transitiva, não utilizada na criação dessa Ontologia. Esta, se atribuída a uma relação tem ligando um País a um Estado e um Estado a uma Cidade, por exemplo, indicará que se Brasil tem o estado Bahia e Bahia tem a cidade Salvador, logo o Brasil tem a cidade Salvador.

Indivíduos

Após concluirmos a construção da parte estrutural, classes e propriedades, de nossa Ontologia, vamos inserir alguns indivíduos. Como na criação de outros componentes, também na criação de indivíduos se faz necessário uma URI que, como já sabemos, é a junção da variável camNS com o nome do indivíduo. Na Listagem 7 os indivíduos foram criados através da execução do método alunoClass.createIndividual(camNS + “Fabio”), que pode ser chamado a partir de qualquer classe (ou conceito) da Ontologia.

Individual profEduardo = professorClass.createIndividual(camNS + "Eduardo");
  alunoClass.createIndividual(camNS + "Fabio");
  alunoClass.createIndividual(camNS + "Tiago");
  Individual turmaA = turmaClass.createIndividual(camNS + "Turma_A");
   
  profEduardo.addProperty(lecionaProperty, turmaA);
  turmaA.addProperty(lecionaProperty, profEduardo);
  newM.commit();
Listagem 7. Código em Jena para criação de Indivíduos ou Instâncias

Acessando Elementos de uma Ontologia

Para acessar os elementos de uma Ontologia (classes, propriedades e indivíduos) podemos utilizar os métodos iniciados com list como listClasses(), listIndividuals() ou listSubClasses(), ver Listagem 8. A partir deles pode-se chamar o método toList() para ter acesso aos elementos através de uma instância da classe java.util.List, ou se preferir, pode-se chamar também o método toSet() para ter acesso aos elementos através de uma instância do tipo java.util.Set. Além disso, para identificar qual classe ou instância está sendo manipulada dentro das iterações, temos dois métodos básicos: getURI(), que retorna o nome completo ou a URI (prefixo + nome) do objeto; e getLocalName(), que retorna apenas o nome do objeto em questão.

System.out.print("Classes da Ontologia Academica: ");
  for (OntClass concept : newM.listClasses().toList()) {
    if (concept.getLocalName() != null) {
      System.out.print(concept.getLocalName()+" ");
    }
  }
   
  System.out.println("");
  System.out.print("Instâncias da Ontologia Academica: ");
   
  for (Individual intance : newM.listIndividuals().toList()) {
    if (intance.getLocalName() != null) {
      System.out.print(intance.getLocalName()+" ");
    }
  }
   
  String uri = camNS+"Pessoa";
   
  OntClass concept = (OntClass) newM.getOntClass(uri);
   
  System.out.println("");
  System.out.print("Subclasses de Pessoa: ");
  for (OntClass subConcept : concept.listSubClasses().toList()) {
    if (subConcept.getLocalName() != null) {
      System.out.print(subConcept.getLocalName()+" ");
    }
  }
Listagem 8. Código em Jena para exibição de Conceitos e Instâncias, e as subclasses de um determinado conceito

Após a Listagem 8 nossa Ontologia de Domínio Acadêmico está pronta. Como dito anteriormente, esse código deve ser executado em um método main(), de uma classe Java qualquer, para que o arquivo OWL da Ontologia de domínio Acadêmico seja criado no caminho indicado (c:\BaseOntologia\Academia.owl). Vale lembrar que o código desenvolvido neste artigo pode ser baixado no site da Java Magazine.

Aplicando a Ontologia no Blog Semântico

Uma vez criada a nossa Ontologia Acadêmica, podemos utilizá-la em uma aplicação web para demonstrar algumas das suas utilidades. A aplicação em questão é um blog construído a partir do framework Pebble, que é uma plataforma com as principais funcionalidades de um blog já prontas. O Blog Semântico está sendo desenvolvido – pelos autores do artigo – com o intuito de permitir a construção de textos pautada em Ontologias. Quando estiver concluído, o Blog Semântico será capaz de vincular palavras de seus textos (ou posts) com termos (classes ou indivíduos) da Ontologia, como vincular a palavra Ronaldo com a classe Jogador, e sugerir, ao usuário, relações entre palavras já vinculadas.

Imagine que um usuário qualquer está escrevendo um texto sobre futebol neste blog, fazendo uso de uma Ontologia de Futebol. Após escrever a palavra Corinthians, o usuário vincula essa palavra à classe Time, contida na Ontologia. Uma vez que ele já tenha vinculado a palavra Ronaldo à classe Jogador, o nosso blog perguntará ao usuário: Ronaldo é jogador do Corinthians? Isso é perfeitamente possível uma vez que na Ontologia de Futebol existe uma relação que une as classes Jogador e Time. Sendo assim, fica fácil para o software identificar uma possível relação entre indivíduos dessas mesmas classes.

O Blog Semântico ainda está em processo de construção, por isso só dispomos do recurso de vínculo das palavras, ou termos, com as classes da Ontologia. Esse processo ocorre graças à utilização do componente Ontology Tagging, que disponibiliza as classes de uma Ontologia em forma de uma nuvem de palavras ou, como conhecida na web, nuvem de tags (ver Figura 4). Essa nuvem se modifica de acordo com as palavras digitadas em um campo texto, disponibilizando as classes da Ontologia como termos para serem associados às palavras do texto. O Blog Semântico é um bom exemplo prático para utilização de uma Ontologia.

Imagem do Blog Semântico na web
Figura 4. Imagem do Blog Semântico na web

Além dessas associações, o Blog Semântico também permite o uso dos termos ou classes da Ontologia como tags para etiquetar os conteúdos disponíveis no blog, como feito na Folksonomia.

Para utilizar a Ontologia criada no artigo no Blog Semântico é necessário fazer o upload da mesma. Para isso, no canto superior direito do blog (http://linkeddata.no-ip.org/pebble/default/) você encontrará um componente cinza com o título Ontology Tagging. Nesse componente tem um botão escrito upload, é só clicar, escolher o arquivo owl e fazer o upload da sua Ontologia. Após esta etapa efetue o login no blog com o usuário leitor e senha 123. Agora você está pronto para escrever um post sobre assuntos acadêmicos.

Quando forem digitados no texto conceitos existentes na Ontologia, a nuvem de tags irá se modificar para que o termo encontrado fique em destaque na nuvem, e o usuário possa utilizá-lo para classificar o texto digitado ou outras palavras ainda não classificadas. Feito isso, o termo classificado terá um vínculo com o conceito da Ontologia, fornecendo ao usuário definições oriundas da Ontologia, exibidas no blog quando passamos o mouse sobre o termo em questão.

Conclusão

Este artigo teve como objetivo o estudo e a definição dos componentes de uma Ontologia através de um exemplo prático que foi a construção de uma Ontologia usando o framework Jena. Tendo executado sem problemas todos os códigos apresentados no artigo, o arquivo da Ontologia criada será encontrado na pasta c:\BaseOntologia de seu computador, como definido no exemplo.

Para visualizar a Ontologia pode-se utilizar o software Protégé, uma ferramenta Open Source desenvolvida pela universidade de Stanford para leitura e construção de Ontologias em arquivos OWL. No site http://protege.stanford.edu/download/registered.html você pode fazer o download da ferramenta.

Por fim, ressalta-se que além da Web Semântica, são inúmeros os contextos para aplicação de uma Ontologia. As principais áreas de utilização são a Inteligência Artificial e a Engenharia de Software, onde é usada para modelagem conceitual ou soluções para integração e troca de informações entre sistemas.

Tom Gruber no artigo A Mash-up of Apples and Oranges, propõe a construção de uma estrutura que permita a vários sistemas, através de uma Ontologia, interagir e operar em cooperação, contribuindo mutuamente para adicionar valor ao conteúdo através do cruzamento das informações de cada um. Em seu exemplo, Gruber cita um casal que ao chegar da lua de mel resolve compartilhar os fatos da viagem com os amigos: o esposo escreve em um blog textos sobre o que fizeram; e a esposa publica as fotos tiradas em um site de gerenciamento de fotos comentando brevemente sobre cada uma. Como ambos fizeram uso de Folksonomia para classificar seus conteúdos, através de uma Ontologia de Folksonomia estes sistemas poderiam interagir entre si trazendo tags dos posts de textos para os de fotos, ou vice e versa, melhorando a classificação e a busca de ambos os conteúdos.

Conscientes de que quanto mais o conhecimento se acumula mais difícil se torna encontrar alguma coisa, inúmeros pesquisadores como Berners Lee e Tom Gruber direcionam suas publicações e projetos para iniciativas que abordem temas como Ontologia, Web Semântica e Inteligência Artificial. A exemplo disso, além dos projetos já citados, temos o TrueKnowledge (www.trueknowledge.com), que tenta responder as suas perguntas a partir de uma base de dados, e a Powerset (www.powerset.com), que é um mecanismo de busca para processar perguntas do usuário em linguagem natural (ou linguagem do usuário).


Saiu na DevMedia!
  • eXtreme Programming na prática:
    Neste DevCast vamos bater um papo sobre a eXtreme Programming (XP) para responder algumas das dúvidas mais comuns que surgem quando se está buscando uma metodologia ágil para usar em seus projetos.

Saiba mais sobre Web ;)