wiki:Guias/HowTo/ProjetoPAPPE
Last modified 8 years ago Last modified on 09/22/11 12:36:16

Projeto PAPPE - Expresso Semântico

Semana de 24 a 28 de janeiro

Entendimento geral sobre o projeto. Feito pesquisas sobre Semântica, Web Semântica. Leitura de artigos com os mesmos temas supracitados e ainda sobre ambigüidade, análise lexica e análise grámatical. Entrei em contato com o prof. Arthur Luiz Pagani especialista em Lingüística, embora não tenha experiência na área de semântica computacional, está disposto a prestar serviço de consultoria.

31 de janeiro

Feito pesquisa sobre tecnologias que podem ser usadas na solução do projeto:

1 de fevereiro

Reunião na parte da manhã, definido que o restante da parte da manhã ficaria para leitura. E a parte da tarde para ações de pesquisa e contato com especialistas em semântica computacional, entendimento mais amplo do projeto relacionando-o com engenharia do conhecimento.

Contato com os seguintes especialistas

2 de fevereiro

Reunião na parte da manhã, agendando uma apresentação do projeto na sexta-feira (04/02/2011), para colocar a equipe a par do projeto. Iniciado a montagem da apresentação

3 de fevereiro

Terminado a montagem da apresentação da parte da manhã e enviado para revisão. Feito a revisão da apresentação junto ao Edney e preparação para apresentação

4 de fevereiro

Apresentação sobre o projeto pappe/Expresso para a equipe com pequeno bate-papo para idéias e dúvidas.


o Adriano indicou e emprestou o livro Sistemas Inteligentes. O livro além de outros temas, faz uma abordagem sobre mineração da dados.


Iniciado pesquisa de ferramentas que implementam parcial ou completamente a solução de gerenciamento da informação.

Pesquisa por ferramentas que organizam informações pessoais (PIM)

Pesquisado por enquanto as ferramentas Microsoft Exchange e o Zimbra, ambos possuem os seguintes funcionalidades:

  • organização de emails e contatos por pastas;
  • classificação de emails e contatos por tags

O Microsoft Exchange, possui um sistema diferenciado na organização usando um sistema de "arquivamento e retenção"

  • Arquivo Pessoal
    • é uma caixa de correio adicional que é associada com a caixa de entrada principal do usuário, podendo trocar informações entre essas duas caixas
  • Diretivas de retenção
    • funciona como um filtro de email, mas essa é configurada pela administrador do sistema, permite mover uma mensagem da caixa de entrada para o arquivo pessoal automaticamente, ou colocar uma data de expiração no email
  • Pesquisa em Múltiplas Caixas de Correio
    • nome auto-explicativo, faz buscas em varias caixas de correio do usuário
  • Retenção Legal
    • quando um usuário é excluido ou bloqueado, pode-se, salvar todas as suas mensagens, agenda, etc

O Zimbra possui um recurso interresante que eles chamam de mashup, ele reconhece determinadas palavras dentro dos e-mails e adiciona ações a ela. Por exemplo: se ele achar num e-mail a palavra amanhã ele ira destacar essa palavra com um link, colocando o mouse em cima do link ele vai exibir um tooltip mostrando a data e os compromissos na agenda, e clicando ele abre a agenda.

Lotus Notes também dispõem de um sistema de organização da informação padrão, utilizando tags, pastas e agrupamento de emails.

Todas essas ferramentas possuem bastante recursos de usabilidade, tornando mais fácil a tafefa de organizar a informação e de interação com a ferramenta, como icones, exibição de informações relevantes na tela. Mas nenhuma tem um recurso realmente inovador quanto a questão de gerenciamento de informação.

Outras ferramentas de organização?

GATE (General Architecture for Text Engineering)

O site aktors possui algumas ferramentas sobre semântica, uma interessante é a annie que permite classificar pessoas, locais, endereços, organizações. É uma ferramenta que faz parte do GATE que é open-source, escrito em java, fiz o download para estudar o funcionamento

7 de fevereiro

Reunião geral com as equipes para ficar a par das atividades gerais de cada setor da empresa. Terminando a pesquisa sobre o Lotus Notes, e, continuando a pesquisa sobre ferramentas de PIM.

Sugestões de alguns livros que tratam o assunto de web semãntica

A empresa Gnowsis tem um projeto de start up para relacionamento de PI de forma semântica, básicamente se casa com nosso projeto como pode ser vista na apresentação do projeto. Em paralelo disponibilizam o Refinder uma ferramenta em versão beta, roda via browser, ajuda a organizar a informação, linkando emails, contatos, projetos, arquivos, encontros, permitindo uma integração entre eles. Fiz uma inscrição para testar a ferramenta. Não disponibilizam nenhum código

Fiz o teste do Refinder, como dito antes é uma ferramente que roda via browser, o que ele faz na verdade é indexar links e relaciona-los, também permite criar dentro dele contatos, projetos, nota, tópico, compromissos. Quando se adiciona algo dentro do Refinder ele sugere outras coisas que foram adicionadas e permite fazer a relação entre elas, assim sempre que abrir por exemplo, um contato que está relacionado com um projeto e email o Refinder ira exibi-los.

  • Algumas vezes as sugestões dele não tem relação nenhuma com o que está sendo adicionado.
  • Como essa relação é feita manualmente, sempre tem todas as informações ao alcance de forma fácil

Encontrei um video do John Hebeler dando um mini-curso sobre Semantic Web Programming. Video

Comunidade sobre web semântica [http://www.swnyc.org/index.php?title=New_York_Semantic_Web_Meetup ]

Estundando site aksw que possui varios projetos sobre semântica, alguns em PHP

Ferramenta encontrada OntoWiki, maior parte escrita em PHP. Ferramenta de Wiki em formato semântico, com API para recuperar esses dados, roda no mysql / virtuoso

8 de fevereiro

Estutando a ferramenta ontowiki e o site aksw

Encontrei no site uma ferramenta em PHP POWL, possiu uma API para RDF e para RDFS/OWL. Tem suporte a banco MySQl / Postgres/ Oracle. Permite ver e editar as ontologias e um RDQL query builder. Apesar do projeto estar sem atualização desde 07/11/2006, pode servir para uma consulta de código ou modelagem de dados futura.

O projeto do ontowiki hospedada no google code esta ativo é um wiki semântico, colaborativo, que permite a criação e publicação de bases de conhecimento em RDF. Facilita a criação de conexões(redes?) semânticas. Interessante para o projeto para verificar como ele armazena, busca essas informações e gera essas conexões tanto para código fonte para a API do Expresso quanto para a modelagem do banco de Dados.

Ainda não obtive nenhum contato da prof. Renata Viera, apesar de ter enviado outro e-mail para ela.

Lendo o Livro Sistemas Inteligêntes

  • Para implementar a semântica web, é necessário um modelo de dados que permita a distribuição da informação

9 de fevereiro

Parte da manhã: Workshop do Edney sobre o pSync

Parte da tarde: Iniciando montagem da apresentação comparando as ferramentas de PIM (exchange, lotus, zimbra)

10 de fevereiro

Parte da manhã terminando a apresentação sobre as ferramentas de PIM

Parte da tarde: Leitura do livro Semantic for the working ontologist

OWL (Ontology Web Language) define as regras do dominio, entende-se também as restrições. Ao contrário do modelado no começo o livro fala que essas regras são parte da modelagem. A modelagem é feita usando RDF e os recursos adicionais de OWL para criar essas regras/restrições.

Para implementação desses recursos de semântica web é necessário montar uma visão macro dessa aplicação web semântica.

  • definir os tipos de entrada de dados (e de onde vem)
  • como a aplicação irá usar o RDF.

Definição dos Recursos

  • RDF Parser / Serializer responsável por interpretar e tratar os RDF do formato XML para triples e vice-versa. Os RDF podem ter vários formatos dentre eles o mais comum é a representação por XML definida pelo W3C
  • RDF Store basicamente um banco de dados para armazenar e recuperar essas informações RDF
  • RDF Query Engine está relacionado com o RDF Store. A query engine fornece a capacidade para recuperar informações de um RDF Store usando uma linguagem de consulta estruturada.

Links para Leitura passados pelo Edney

11 de fevereiro

Fazendo a leitura do pdf Final NEPOMUK Architecture, que explica como foi planejado a montagem do projeto NEPOMUK para um SSD (Social Semantic Desktop).

Para a modelagem do projeto eles usaram um método que chamaram de engenharia reversa no qual é levantado todas as funcionalidades que o usuário irá usar em um ambiente semântico e formular diferentes casos de usos. Após isso é feito a generalização dos casos individuais e extração das funcionalidades em comum.

Dentro da implementação dos recursos de semântica existem vários serviços provem todas essas funcionalides. Eles podem ser divididos grosseiramente em serviços focados no sistema (no caso do nepomuk desktop) e serviços focados no aspecto social

  • Sistema -> estes serviços abordam a questão da melhoria do PIM e a interligação entre as aplicações.
  • Social -> estes serviços são responsáveis pela troca de informação para fora do ambiente.

Mapa mental do usuário

  • Annotation Mode (AM)
  • Information Element Model (IEM)
  • Persoal Information Management

14 de fevereiro

glscube system storage para dados e metadados semânticos.

Personas

  • O sr. João da Silva é funcionário da empresa Correntes Elétricas LTDA que usa o Expresso como solução de comunicação. Ele é um usuário que não classifica a informação e por isso tem dificuldade em recupera-las, gostaria que isso fosse feito automaticamente pois acha trabalhoso classificar e-mails, compromissos e contatos. Ele não entende de semântica mas usa o google frequentemente para buscas e deseja, no expresso, recuperar suas informações, digitando no máximo duas palavras, e de preferência exibindo as interações mais recentes primeiro de forma relevante com os resultados separados por tipo (email/contatos/compromissos), também gostaria de poder navegar nos resultados mais antigos. Deseja ter a ultima busca salva (ultimas X buscas salvas)
  • Já a Maria Virgulina é uma usuária mais avançada que o João, ela utiliza tags para marcar emails e contatos para facilitar a organização e a recuperação dessas informações. Quando faz uma busca ela deseja que tudo relacionado apareça na tela, pode também remover algum e-mail, conversa ou contato que apareceu na busca e não deveria. Também gostaria de poder salvar a busca para facilitar agrupar mensagens de projetos, compromissos, etc.
  • O Mario utiliza todas as funcionalidades que o sistema oferece, classifica e marca com tags os recursos de comunicação(emails, contatos, agenda), faz a ligação direta entre eles sempre que possível. Além da busca normal ele também utiliza um sistema de busca avaçado usando palavras-chaves para filtrar uma informação. Por exemplo ele utiliza uma séries de palavras-chaves para recuperar todos os e-mails que chegaram que tenham um pdf em anexo que foi escrito pelo João.

15 de fevereiro

Pesquisa por sistema de armazenamento para os dados semânticos.

RDF e RDB O modelo de dados semânticos está diretamente conectado com o modelo relacional de banco de dados. O modelo relacional consiste em tabelas que consistem em linhas ou registros. Cada registro consiste em um conjunto de campos. Um registro não é nada mas o conteúdo campos, assim como um nó RDF não é nada mas as conexões: a propriedade valor (the property values). O mapeamento é muito direto:

  • um registro é um nó RDF;
  • um campo (coluna) é uma RDF propriedadeTipo (propertyType);
  • o campo do registro (célula) é o valor

No semantic overflow há pessoas que recomendam o uso de base de dados noSQL como Cassandra ou HBase.

O site sparql.org faz referências a dois sistemas de armazenamento que podem ser usado pelo Jena (Framework RDF para Java)

  • TDB é um componente do Jena para armazenamento e consultas RDF
  • SDB é um componente do Jena que permite escalar armazenamento e consultas RDF em banco de dados SQL convencionais
    • Microsoft SQL Server 2005 including SQL Server Express
    • Oracle 10gR2 including Oracle Express
    • IBM DB2 including DB2 Express
    • PostgreSQL v8
    • MySQL 5.0 (>=5.0.22)
    • HSQLDB 1.8
    • H2 1.0.73
    • Apache Derby 10.2

LER >> Http://simile.mit.edu/reports/stores/

16 de fevereiro

Montar um ambiente de testes abstraindo o local storage pelo RDF2GO, passos:

  • Verificar o modelo que o Expresso utiliza para adicionar um contato
  • PIM Service
    • Ontologia básica (como classificar o contato)
    • Importar ontologias (foaf, owl, rdfs)
    • Verificar a validade da ontologia
    • Reconhecer qual ontologia está sendo usada (Local Data Aligment)
  • LIB para manipular os RDF
  • Classe para manipular DB (RDF2GO)
  • Modelo ER da base de dados para armazenar RDF
  • Criar contatos
  • Buscar contatos (Local Search)
  • Alterar informações de contatos (tag, relacionamentos, etc)

17 de fevereiro

Definição da ontologia básica para a prova de conceito

Dominio: contatos (dados para identificar contatos) Escopo: dados e relacionamentos entre esses contatos

para que será usada a ontologia: para retornar contatos relevantes de acordo com o termo buscado pelo usuário como por exemplo um projeto, grupo, área de atuaçõa e relacionamentos.

Algumas perguntas para definir o escopo caso tenham alguma idéia de pergunta colaborar

  • qual o melhor contato para falar sobre o assunto xxxxx?
  • quais os contatos que entendem de xxxx?
  • quem é o responsável pela equipe/grupo/setor/... xxxxx?

Nivel de detalhamento exigido

  • todos os dados pessoas usados hoje no expresso
  • cargo
  • especialidade
  • setor
  • relacionamentos
    • funcionario de
    • amigo de
    • etc

Començando a programar a prova de conceito usando o RDF2GO, fiz primeiro um estudo sobre essa classe e consegui gravar um contato em um arquivo RDF e recuperar seu nome com SPARQL.

Começando a abstrair a classe para o modelo proposto no dia 16 de fevereiro

21 de fevereiro

Fazendo a modelagem dos contatos, está mais complicado do que eu pensava. Tem que fazer um relacionamento entre cada propriedade da ontologia para conseguir recupera-lá depois.

Estou montando a estrutura de acordo com a ontologia do nepomuk. Consegui fazer a parte de gravação mas para recupera-los de forma semântica está dificil. Para deixar mais claro eu gravei 3 contatos num arquivo RDF consigo recupera-los fazendo uma query por todos os contatos, mas não consigo algo 'quero todos os contatos que possuam e-mail' ou 'todos os contatos que não possuam e-mail'.

Estou estudando como se faz isso

material de consulta utilizado hoje foram:

22 de fevereiro

Já está definido todos os campos necessários para gravar um contato, esses campos foram retirados do Expresso, segue a lista:

  • apelido
  • nome
  • sobrenome
  • nascimento
  • notas
  • email
    • principal
    • alternativo
  • telefone
    • casa
    • celular
    • trabalho
    • fax
    • pager
  • endereço comercial/residencial
    • pais
    • estado
    • cidade
    • endereço 1
    • endereço 2
    • complemento
    • cep

Consegui fazer uma busca mais complexa usando o sparql. Buscando só quem tem e-mail, só nome, ou todas as subClasses de uma Classe A query parte deste principio SELECT campos WHERE {

sujeito predicado objeto

}

predicado é a ligação entre o sujeito e o objeto que geralmente são o que se busca

Estou tendo que refazer novamente a montagem da ontologia de contatos, pois a modelagem dentro do Java com o RDF2Go não está gravando com os prefixos corretos, procurei no manual uma maneira de corrigir mas não achei.

Vou refazer com o Proteje e/ou na mão e carrego esse modelo de ontologia pelo RDF2Go fica mais fácil para ser usando.

Mesmo com a ontologia sendo feita fora será necessário deixar no java os links de cada atributo que será usado, como por exemplo: nome, sobrenome. Para gerar uma URI.

O programa já grava parcialmente os dados de um contato e faz uma busca simples em sparql. Outro fator para ser verificado é que os dados dos contatos ficam dentro de um RDF mas ele não contém todos os elementos da ontologia nem mantém uma estrutura de 'heranças' como esse exemplo aqui. Eu acredito que teria que ser feito automaticamente pelo RDF2Go mas isso não acontece então é mais uma codificação para ser feita (fazer essa herança manualmente).

23 de fevereiro

Puxei a nepomuk contact ontology direto pelo Proteje e salvei em RDF, da para fazer a importação pelo RDF2Go, mas ele não salva no formato correto com heranças ou falando corretamente com prefixos e abreviações.

Procurei no manual do RDF2Go, nos exemplos e no google e não achei nenhum modelo de como gravar esses dados corretamente.

Edney acho que seria interessante ver uma outra lib, de manhã eu respondi que o RDF2Go estava atendendo mas agora, depois de pesquisar, ela não grava no formato rdf "correto", com propriedades, subClasses, tipo.

Achei outro livro interessante, Developer Web Ontology, em pdf (inglês) li algumas páginas abrange o básico de o que é RDF, web semântica, Sparql

Li também algumas páginas do Nepomuk procurando exemplos de uso do nco

Agora no final da tarde pesquisei um pouco sobre o Jena amanhã vou dar uma olhada no Sessame, pra ver se eles atendem o que precisamos fazer na prova de conceito o que você acha?

25 de fevereiro

Comecei o dia tentando gravar os dados no formato de "herança" como nos exemplos do nepomuk. O jena facilita na hora de colocar os prefixos das classes e propriedoades, mas na sua documentação não achei nada de como carregar uma ontologia e preencher com dados. Na internet também não tem muitos exemplos. Achei uma propriedade do Jena que permite criar containers usando o "seq" mas grava no formato que eu estou tentando. Comecei a procurar na documentação do sesame mas parece que não tem nada também Coloquei uma pergunta no SemanticOverflow? vamos ver se alguém responde.

28 de fevereiro

Estudando ainda a documentação do Jena para tentar salvar os dados no modelo de henrança, mas ainda sem sucesso. Sem respostas úteis no SemanticOverflow? Verificado o código antigo junto com o Edney, mesmo assim não obtivemos nenhum sucesso para gravar os dados da forma correta. Procurando no google e na documentação pra ver se acho alguma maneira

1 de março

Continuei estudando a documentação do Jena e RDF2Go, consegui gravar os dados da maneira correta no Jena. Carregar a ontologia dentro do Jena não adianta de nada pois precisa montar todo relacionamento na mão. É necessário montar toda a ontologia que será utilizada. Começando montar a ontologia de contatos (nco) em java para a prova de conceito.

2 de março

3 de março

Continuei os testes com o RDF2Go para montar as estruturas complexas, ainda sem sucesso. Lido parte da documentação do NCO e NIE, e a do PIMO junto com o Edney Feito testes de consultas sparql dentro do Jena para recuperar dados gravados, e, recuperar também subPropriedades usar o seguinte padrão

SELECT * {

?subject ?predicate ?object . ?predicate rdfs:subClassOf xxxx

}

pode-se usar subClassOf ou qualquer outro termo definido na ontologia.

Discussão de qual modelo adotar para criação da classe para modelar os RDF, generica ou especifica.

Estudo do modelo que o NEPOMUK usa para essa modelagem.

Gerado a ontologia NIE no RDFReactor e tentando modelar esses dados no RDF2Go

Ainda precisa verificar como setar prefixo.

4 de março

Mais estudos no Reactor e RDF2Go para gerar as estruturas complexas e prefixos, com sucesso importanto a classe do Jena dentro do RDF2Go.

Feito a classe para gravar os contatos buscando dentro do banco do expresso.

10 de março

A parte de gravar e recuperar as informações esta pronta utilizando a lib RDF2Go junto com o RDFReactor.

Falta verificar o "update" atualização dos dados que já estão dentro do "banco"

No Jena achei uma solução utilizando o UpdateFactory??.create(sparql) e depois UpdateAction??(update, model)

Ainda não encontrei nada para o RDF2Go, tentei usar a solução do jena mas não funcionou. Temos que achar uma forma do RDF2Go permitir executar um sparql de update ou somente de delete/insert

exemplo de sparql update (ainda tem q testar para ver se funciona), que atualiza o nome de Cleverson para Abobrinha em qua a URI é postgres>...#56

PREFIX nco:< http://www.semanticdesktop.org/ontologies/2007/03/22/nco#> DELETE {?s nco:nameGiven 'Cleverson'} INSERT {?s nco:nameGiven 'Abobrinha'} WHERE {?s a nco:Role . FILTER(str(?s) = ' postgres://expressoprognus/phpgw_cc_contact/#56' ) }

11 de março

Ainda pesquisando uma forma de atualizar o modelo usando o RDF2Go, consegui adicionar uma nova propridade ao modelo criado mas da erro quando tento remover uma propriedade que já existe.

Estou realizando um findStatement:

ClosableIterator?<org.ontoware.rdf2go.model.Statement> st = model.findStatements(Variable.ANY, model.createURI(NS+"nameGiven"), model.createPlainLiteral("Cleverson"));

Para buscar a URI do usuario que tem o nameGiven 'Cleverson'

E depois adiciono outro nome:

org.ontoware.rdf2go.model.Statement tmp = st.next(); model.addStatement(tmp.getSubject(), model.createURI(NS+"nameGiven"), model.createPlainLiteral("Abobrinha"));

Ele fica com 2 nameGiven no modelo final do RDF

mas quando vou tentar remover o nome Cleverson da uma exception

model.removeStatements(tmp);

Tentei criar uma nova classe PersonContact? mas da erro também

Soluções possíveis:

  • Tentar resolver esse problema (não tem muita documentação e exemplos que ajudem)
  • Tentar jogar isso para um banco de dados que suporte sparql e ver se é possivel atualizar por ele
  • Utilizar outra lib para manipular os rdf

14 de março

Ainda pesquisando um método para realizar UPDATE SPARQL dentro do modelo RDF2Go

De a acordo com a resposta do SemanticOverflow?? o RDF2Go acessa apenas as chamadas de API para manipulação do modelo, e permite alteração somente com o addStatement e removeStatement

Provavelmente sera necessário jogar esse modelo pra um banco de dados, talvez esse dara suporte para realizar as consultas sparql com comandos de UPDATE

Como estamos utilizando o RDf2Go fazendo uma chamada para o Jena estou estudando uma forma de salvar esse modelo pelo Jena

15 de março

Não consegui encontrar nenhuma maneira de fazer um update usando o RDF2Go.

Comecei a fazer uma pesquisa no Jena e vi que ele tem suporte para geração de classes em Java a partir da ontologia.

Feita esse geração de classe, refeito o programa para gravar os contatos em rdf no modelo do Jena, e feita a atualização com sucesso utilizando os comando do UpdateFactory??.

Instalado o virtuoso database, salvo o modelo de dados dentro do virtuoso. Também feito o select e update de dados com sucesso usando os recursos do proprio virtuoso. O unico incoveniente é ter que informar um nome de grafo para gravar os dados rdf

16 de março

Segunda etapa da prova de conceito.

Extração de dados de email do cyrus imap.

Feito o estudo inicial de como se conectar com ao imap usando a api javamail.

Consegui recuperar as mensagens com sucesso, mas será necessário fazer um parser simples para verificar se a mensagem possui anexo(s). Caso possua ela é considerada uma MULTIPART e tem que ser tratada de uma forma diferente, além de ter que extrair os metadados desses arquivos.

Visto também a ontologia do Nepomuk NMO (Nepomuk Message Ontology) e NFO (Nepomuk File Ontology)

17 de março

Procurando um extrator de metadados, comecei a estudar o Virtuoso Cartrigde, que tem as funcionalides de um extrator. Também achei o Aperture um extrator da dados e metadados em java.

Falta definir qual sera a melhor ferramente para a prova de conceito a do Virtuoso é muito complexa e o Aperture está sem atualização desde Julho/2010

Recuperando as mensagens do Cyrus, falta só salvar os anexos e descobrir o tipo, tamanho e metadados

18 de março

Reunião na parte da manhã com o Edney para definir os relatórios entregáveis do projeto. Começado a especificação dos relatórios, durante o processo surgiram novas duvidas sobre o projeto que devem ser respondidas. Auxiliado o Eugenio com alguns duvidas sobre o projeto

21 de março

Continuando a especificação dos relatórios, Criado o documento Modelo de arquitetura para solução de busca semântica no Expresso tratando topicos:

  • Introdução
  • Conceituação
  • Expresso
  • Personas
    • Usuário com conhecimentos básicos
    • Usuário com conhecimentos intermediários
    • Usuário com conhecimentos avançados
  • Modelo arquitetural
    • Modelo Arquitetural Nepomuk
    • Componetes
    • Ontologias
    • Banco Local (Local Storage)
    • Extrador de metadados (Data Wrapper)
    • PIM Service
    • Pesquisa Local (Local Search e Ranker)
  • Tecnologias

24 de março

fechando os tópicos do Modelo de arquitetura para solução de busca semântica no Expresso

  • Expresso
  • Modelo arquitetural
    • Componetes
    • Ontologias
  • Tecnologias

25 de março

Revendo a arquitetura da solução e detalhamento dos componentes

28 de março

Reunião para redefinir as personas e suas necessidades

Levantado as necessidades de cada persona e reescrito

29 de março

Fazendo um mapeamento de todas as funções no Expresso que podem gerar dados semânticos nas interação de e-mail, compromissos e contatos

30 de março

Inicio da montagem das telas com sugestões para solução de anotação das informações e busca

31 de março

Inicio da montagem das telas com sugestões para solução de anotação das informações e busca

01 de abril

Leitura do documento Modelo de arquitetura para solução de busca semântica no Expresso Correção dos tópicos introdução, arquitetura da solução e estado da arte

04 de abril

Pesquisa sobre o componente Lucene para extração e indexação de arquivos, o Lucene possui uma extensão chamado Tika que permite extrair essas informações (dados e metadados).

Organizado os códigos das prova de conceito

Leitura dos textos/links:

05 de abril

Escrito esboço do relatório de acompanhamento do projeto

06 de abril

Revisão no texto do relatório de acompanhamento do projeto Reunião com Luiz (Especialista em semântica da equipe da Renata) Pesquisa sobre o Tika ferramenta para extrair metadados

07 de abril

Escrevendo resumos dos textos citados nos relatório de acompanhamento do projeto. Reunindo documentos necessários para anexar ao relatório (lista presença da aprensentação, orçamento de livros)

08 de abril

Escrevendo texto de resumos sobre os textos citados no relatório de acompanhamento do projeto.

13 de abril

Revisão do relatório de acompanhamento do projeto, revisado resumo dos textos lidos, referencias

14 de abril

Revisão do relatório de acompanhamento do projeto, revisado resumo dos textos lidos, referencias

15 de abril

Pesquisa sobre metodos de anotação, extensão de ontologias

18 de abril

Pesquisa sobre artigos do jornal de web semantica

Volume 1, issue 2

Volume 1, issue 4

Volume 2, issue 1

Volume 2, issue 2

Volume 5, issue 3

Volume 6, issue 3

Volume 7, issue 2

Iniciando detalhamento das DFD do usuário básico aqui

19 de abril

Definição do detalhamento das DFDs do usuário básico

Modelo UML:

@startuml
actor Administrador
participant "Expresso Administração Semantica" as Expresso

'Admin ativa recuso no expresso
Administrador ->  Expresso: Ativar/Desativar\nExpresso Semântico para usuário

'Expresso manda ID do usuário para web service
box "Core Expresso Semântico" #LightBlue
    participant WebService
    participant SemanticService << (C,#ADD1B2) >>
    participant SemanticSpace << (C,#ADD1B2) >>
end box
Expresso -> WebService: userID

'Ativando recursos semânticos para usuário
WebService  ->  SemanticService:
activate SemanticService
SemanticService  ->  SemanticService: Ativa/Desativa FLAG para\ngravar dados\nsemânticos gerados\npelo usuário\n


SemanticService -> SemanticSpace: criar espaços\ndescrição e mental
activate SemanticSpace

SemanticService <-- SemanticSpace: espaços de descrição\ne mapa mental criados
deactivate SemanticSpace

WebService  <-- SemanticService: Resposta de ativação/desativação\ndos recursos semântico\n(TRUE/FALSE)
deactivate SemanticService

Expresso <-- WebService: Resposta de ativação/desativação\ndos recursos semântico\n(TRUE/FALSE)
Administrador <-- Expresso: Resposta de ativação/desativação\ndos recursos semântico\n(TRUE/FALSE)

@enduml
@startuml
box "Ativando Semantica"
	participant SemanticService << (C,#ADD1B2) >>
	participant "activeSemantic(userID)" as activeSemantic
	
	SemanticService -> activeSemantic
	note right: "ativa flag do\nusuário (userID)\npara gravar dados\nsemânticos gerados\npelo Expresso"

end box

@enduml

20 de abril

Estudando webservice em PHP Structwsf para manipulação de dados semânticos Iniciado a instalação.

21 de abril

Continuação da instalação do webservice structwsf e configuração

22 de abril

Estudando a funcionalidade do webservice e teste instalação e configuração do construct plugin do Drupal para o structwsf

25 de abril

Terminando a configuração do construct. Edição do arquivo WebServiceQuerier.php removendo as chamadas do drupal para contrução do Framework que ira integrar o Expresso e o struct Inicio da definição dos casos de testes para a classe WebServiceQuerier?

26 de abril

Montado o modelo de telas para a prova de conceito utilizando o structwsf

27 de abril

28 de abril

Estudo e testes das api de manipulação de rdf para criar os rdf a ser enviados para o framework

Teste com EasyRDF

<?php

        set_include_path(get_include_path() . PATH_SEPARATOR . './easyrdf/lib/');
        include "EasyRdf.php";

        EasyRdf_Namespace::set('nco', 'http://www.semanticdesktop.org/ontologies/nco/#');
        EasyRdf_Namespace::set('rdf', 'http://www.w3.org/1999/02/22-rdf-syntax-ns#');

        $conGraph = new EasyRdf_Graph();

        //Cria recurso
        $resource = $conGraph->resource('ldap://1002');


        //adiciona nome e sobrenome
        $resource->add('nco:givenName', 'Adir');
        $resource->add('nco:familyName', 'Kuhn');


        //adiciona propriedade hasEmailAddress

        $node = $conGraph->newBNode(array());
        $resource->add('nco:hasEmailAddress', $node);

        //$EmailAddress = $conGraph->resource(md5(microtime()));
        //$EmailAddress->add('nco:emailAddress', 'adirkuhn@gmail.com');
        $node->add('rdf:type', 'nco:EmailAddress');
        $node->add('nco:emailAddress', 'adirkuhn@gmail.com');

        echo $node;
        echo "oi<hr>";
        echo $conGraph->dump();
        echo "<hr>";
        echo $conGraph->serialise("turtle");
?>

Teste com RAP

<?php
        define("RDFAPI_INCLUDE_DIR", "/var/www/teste_rap/rdfapi-php/api/");
        include(RDFAPI_INCLUDE_DIR . "RdfAPI.php");

        //namespace
        define('NCO', 'http://www.semanticdesktop.org/ontologies/nco/#');

        //dados
        $uri = "ldap://1002";
        $nome = "Adir";
        $sobrenome = "Kuhn";
        $email = "adirkuhn@gmail.com";

        //modelando
        $model = ModelFactory::getResModel(MEMMODEL);
        $res = $model->createResource($uri);
        $p_nome = $model->createProperty(NCO."givenName");
        $p_sobrenome = $model->createProperty(NCO."familyName");

        $l_nome = $model->createLiteral($nome);
        $l_sobrenome = $model->createLiteral($sobrenome);


        $res->addProperty($p_nome, $l_nome);
        $res->addProperty($p_nome, $l_sobrenome);



        $model->writeAsHTMLTable();
?>

após testes foi determinado que essas ferramentas não são totalmente satisfatórias pois apresentam bugs e limitação. Estudando a possibilidade de criar uma api para gerar RDF e criar classes PHP através das ontologias

29 de abril

Estudando o código das ferramentas RAP e EasyRDF Recapitulando forma de representação de conhecimentos em forma semântica

  • sujeito predicado objeto

Inicio da programação do gerador automatico de classes para PHP a partir de uma ontologia

02 de Maio

Termino da programação do gerador automatico de classes para PHP a partir de uma ontologia

Estudando as API EasyRDF e RAP para contrução do framework semântico para ser utilizado no Expresso Camadas de:

  • Model
  • Graph
  • Resource
  • Node

03 a 06 de Maio

Criação das classes de Model, Resource e Namespace, foi utilizado a base do ARC2. Adaptação do gerador automatico de classes para utilizar o Model.

09 de Maio

  • Atualização da classe generator.php
  • Inicio da criação do Prova de conceito (ativar recurso semantico)

10 de Maio

Montagem da tela da prova de conceito para ativação dos recursos semânticos. Na tela principal o usuário digita nome e e-mail ao postar é iniciado o ambiente, definido o nome padrão dos datasets. Utilizando a classe DatasetConstructor?.php e WebServiceQuerier?.php é verifica se os datasets existem, caso não exista os cria.

Após isso é montado os dados do usuário usando a classe Model.php, Resource.php e Namespace.php e gravado o "espaço de anotação" desse usuário

12 de Maio

Tentando configurar o SOLR para extração automática de e-mails

Plugin de extração de email configurado dentro de /root/apache-solr no servidor de testes deve-se copiar a pastas ~/apache-solr/example/example-DIH/solr/mail para ~/apache-solr/example/example/solr/mail

alterar o arquivo ~/apache-solr/example/example-DIH/solr/solr.xml adicionando linha de carregamento do core mail

  <cores adminPath="/admin/cores" defaultCoreName="collection1">
    <core name="collection1" instanceDir="." />
    <core name="mail" instanceDir="mail" />
  </cores>

mudar o arquivo ~/apache-solr/example/solr/mail/conf/data-config.xml colocando os dados de acesso ao IMAP.

mudar o arquivo ~/apache-solr/example/solr/mail/conf/solrconfig.xml para carregar as libs de dataimport

13 de Maio

Estudo do plugin do Solr MailEntityProcessor? e do Plugin Transformer para manipular os dados antes de gravar no solr e tentar gerar o RDF

no arquivo data-config.xml é necessário dizer que vai utilizar um transformer e indicar o nome da classe.

<entity processor="MailEntityProcessor" transformer="prognus.dw.extractor.Main" ... />

é necessário criar uma classe java para manipular esses dados.

ex. de transformer com jena

package prognus.dw.extractor;

import java.io.FileWriter;
import java.io.IOException;
import java.util.Map;

import ontologias.Nmo;

import org.apache.solr.handler.dataimport.Context;
import org.apache.solr.handler.dataimport.Transformer;

import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.rdf.model.RDFWriter;
import com.hp.hpl.jena.rdf.model.Resource;

public class Main extends Transformer {
	
	
	
    public Map<String, Object> transformRow(Map<String, Object> row, Context context) {
        //List<Map<String, String>> fields = context.getAllEntityFields();

    	Model m = ModelFactory.createDefaultModel();
        Resource message = m.createResource(row.get("messageId").toString(), Nmo.Message);
        message.addProperty(Nmo.messageSubject, row.get("subject").toString());
        message.addProperty(Nmo.from, row.get("from").toString());
        
        try {
        	RDFWriter w = m.getWriter();
        	w.setProperty("allowBadURIs", "true");
        	w.write(m, new FileWriter("./rdfs/"+row.get("messageId").toString()+".rdf"), null);
		} catch (IOException e) {
			e.printStackTrace();
		}
        
        return row;
    }
    
	public static void main(String[] args) throws IOException {
	}

}

compilar e gerar o jar dessa classe, colocar no servidor e carregar junto com as libs

16 de Maio

Ainda trabalhando no transformer do solr, e fazendo ajustes na lib para ler e tratar os dados dos emails

17 de Maio

Foi visto que o transformer do solr não iria atender totalmente nosso objetivo de ser um data wrapper.

Ajudando o Eugênio a compilar e testar diretamente a Classe MailEntity?, transformar em jar e tentar extrair dados de email

18 de Maio

Visto que usar os plugins e/ou as classes do solr não oferecem uma solução que é esperada para o datawrapper, que é tratar os dados legados e a possibilidade de controlar a execução.

foi definido um modelo de classe em PHP para o data wrapper que sera controlado por uma cron no sistema

19 de Maio

Criado a estrutura de pastas e os arquivos básicos para começar a escrever o data wrapper. Divido a tarefa de programação das classes com o Eugenio. Inicio da programação dos plugins do dw

20 de Maio

Pesquisado uma forma de implementar testes unitários para garantir a mínima qualidade de código, utilizando PHPUnit com a opção --coverage-html que mostra o percentual de código coberto pelo teste.

Iniciado a montagem do teste unitário para o primeiro plugin EmailWrapper?.php

23 de Maio

Ainda escrevendo os testes e programado o plugin do data wrapper EmailWrapper?.php

24 de Maio

Programando os testes e o plugin EmailWrapper?.php Decido utilizar o framework Zend para padronizar e facilitar o tratamento de arquivos como xml ou conexão com serviços como imap. Reestruturando a organização das pastas e arquivos

25 de Maio

Programando casos de teste para o Email Wrapper

26 de Maio

Ainda programando casos de teste para o Email Wrapper

27 de Maio

Começando a estudar a estrutura do DataWrapper? dentro do sistema. Feita a modelagem com o uso de fork para não sobrecarregar o servidor.

30 de Maio

Buscando formas de implementar o DW como daemon. Procurando por classes para "daemonizar" o script php e ncontrado a classe System_Daemon

31 de Maio

Começando a escrever o esqueleto básico do DW.

01 de Junho

Estudando como fazer fork dentro do php

02 de Junho

Ainda estudando como fazer fork no php.

Cada fork (filho) é uma cópia do pai (possui todas as variaveis) mas pode ser encarregada de um processamento especifico

com o comando pcntl_fork() o php-cli tenta disparar um filho e o retorno for menor que 0 ( < 0) ocorreu um erro ao criar o fork, pode ser limitação do sistma ou usuario.

se o fork for criado com sucesso ele segue dois caminhos, nesse ponto que é especificado o que o filho deve fazer

o código zero significa que vc esta dentro do filho e maior que zero ( > 0) que vc esta no pai.

ex.

$pid = pcntl_fork()

if ($pid < 0) {
    //ERRO AO CRIAR FORK
}
else {
   //FORK FOI CRIADO, UM COPIA DO PROCESSO ATUAL
   if($pid == 0) {
       //COPIA (FILHO) VAI EXECUTAR O QUE ESTA AQUI
   }
   else {
       //ENQUANTO O PAI CONTINUA SEU PROCESSAMENTO AQUI
   }
}

03 de Junho

Pesquisando formas de compartilhar memoria entre processos, para criar um buffer de processamento

06 de Junho

Tentando implementar um buffer um FIFO, estudando como funciona o enfileiramento fifo. Començando a implementar uma funcionalidade de buffer em fifo

07 de Junho

Continuando a programar o buffer em fifo, mas com alguns problemas para escrever dados.

08 de Junho

Ao criar um arquivo do tipo FIFO no computador, para escrever dados dentro dele é preciso usar as funções de arquivo do PHP

fopen para abrir, fwrite para escrever e fread para ler. Não é possivel fazer um fclose, pois senão perde-se todos os dados em memorias, caso precise persistir os dados é necessário ler toda a fifo e escrever em um arquivo fisico ou gravar em banco.

Durante os testes descobri que o fifo tem uma memoria limitada, para aumentar esse limite é necessário recompilar o kernel, o que esta fora de questão. Começando a procurar outra alternativa para o buffer.

Durante as pesquisas achamos o aperture um framework em java para pegar dados e metadados.

Começando a teste o aperture, usando o exemplo de um crawler de IMAP, ele consegue extrair os dados do IMAP mas apresenta um erro ao abrir a pasta INBOX/Monitoração Acredito que o erro deve ser por causa do acento.

09 de Junho

Erro ao processar pasta: Monitoração Tentado achar o problema e corrigir o teste do aperture, provavelmente o aperture sera usado para extrair os dados do Expresso. O problema de encoding (charset) é dentro da própria estrutura do aperture, tem que mudar o source dele para verificar esse erro. Tentei passar o nome da pasta com encoding utf-8 e unicode mas mesmo assim o aperture não consegue abrir a pasta para processar.

10 de Junho

Feito o debug do ImapCrawler? no Eclipse procurando pelo erro de encoding

13 de Junho

Ainda tentando resolver o problema de enconding do ImapCrawler?, postado a dúvida no forum do aperture.

Descoberto que o problema era no próprio código do aperture que não escapava os caracteres da pasta de maneira correta, corrigido o problema, compilando e testando.

14 de Junho

Problema de encoding já resolvido, fazendo teste de indexação de Imap. Tentando integrar aperture com o Virtuoso OpenLink?

15 de Junho

Terminado a integração do Aperture + Virtuoso, para salvar dados (RDF) diretamente no banco de dados.

16 de Junho

Começando agora a escrever um Crawler Handler para nosso modelo de ImapCrawler?.

O Crawler Handler é o responsável por gerar os container RDF e fornecer-los para agrupar os dados extraidos do IMAP, para depois serem salvos dentro do Model (Virtuoso)

17 de Junho

Montado proposta para o DataWrapper? https://docs.google.com/document/d/1Kr8Res8fyGINPTmzm_agSlkUQ81irDRmBu214geql4Y/edit?hl=en_US

20 de Junho

Terminado o código do Crawler Handler. Durante os testes no Crawler Handler foi descoberto que durante a persistência do Model alguns itens estavam sendo duplicados. Feito uma pesquisa na documentação do Aperture na procura de alguma solução para o problema de duplicados.

Para evitar o problema de duplicados basta usar a classe ModelAccessData? e setar na opção crawler.setAccessData(this.accessData);

21 de Junho

Feito um monitor de pastas, para monitorar a pasta que irá ficar os XML de configuração dos usuários, verifica se houve adição, alteração ou remoção de algum arquivo e chama uma função de callback para recaregar a configuração.

22 de Junho

Dia tirado para fazer testes no Expresso

27 de Junho

Feito um XML parser para os arquivos de configuração.

28 de Junho

Corrigindo o XMl, escrevendo um padrão de configuração dos XML, e realizando testes de leitura

29 de Junho

Durante os testes foi descoberto que o crawler não estava lançando os subcrawler para anexos. Verificando problema dos subcrawler.

30 de Junho

Començando a escrever novo handler para lançar subcrawler

01 de Julho

Finalização do novo crawler handler, esta lançando subcrawler para arquivos em anexo

04 de Julho

Reunião na parte da manhã, foi estudado a saida do ImapCrawler? e descoberto que estava duplicando contatos.

Parte da tarde tentando corrigir o problema de contatos duplicados. Foi postado uma pergunta no fórum e feito pesquisa na documentação.

05 de Julho

Fazendo o mapeamento macro das API que irão integrar o Expresso com as funcionalidades semâticas

06 de Julho

Terminando o mapeamento da API no DOCS Definição de funcionamento dos recursos semântico no Expresso Documentação dos endpoints do structWSF http://openstructs.org/structwsf/individual-ws-documentation

07 de Julho

Fazendo Modelagem da API juntamente com o Tezza

08 de Julho

Terminado a primeira parte Modelagem inicial da API e construido um esquelo básico das classes em PHP

11 de Julho

Reunião para redefinir o modelo da API semântica

12 de Julho

Reunião com o pessoal da PUCRS. Remodelagem da API Semântica

13 de Julho

Montagem dos exemplos de descrição dos recursos de email, contatos e compromissos para o pessoal da PUCRS

14 de Julho

Teminando a montagem dos exemplos de descrição dos recursos de email, contatos e compromissos para o pessoal da PUCRS

15 de Julho

Leitura da documentação da pimo Montagem do exemplo de utilização da pimo para enviar para o pessoal da PUCRS

18 de Julho

Montado diagrama de sequencia para descrição de dados semanticos para busca e criação de email, contato e compromisso na agenda

19 de Julho

Aplicação de padrões de projeto na modelagem da API. Na parte da tarde houve uma reunião com o pessoal da PUCRS, foi apresentado a ferramenta Protègè e o estudo dos RDF/XML que mandamos anteriormente

20 de Julho

Feita algumas alterações no modelo da API. Estudo sobre a arquitetura TSA (thin server architecture), viabilidade e beneficios de aplicar no nosso modelo. Falta levantar vantagens e modelos possiveis para aplicação do TSA no modelo atual.

21 de Julho

Iniciando programação da API

22 de Julho

Programando API junto com o Tezza

25 de Julho

Montado o básico da classe Ambiance, Log, Session

Procurando ponto de injeção da API dentro do Expresso, analisando o e-mail: Pode-se colocar em dois locais distintos, antes de ser enviado para função do controller neste casso trabalharemos com array ou pode-se colocar a injeção de código dentro da controller, podendo manipular um objeto PHPMailer. Problemas:

  • foi detectado que falta algumas informações antes do e-mail ser enviado, como Message UID, e data real de envio (caso o e-mail fique na fila) - (indexar com DW?)

26 de Julho

Procurando pontos de injeção da API no código dentro do Expresso para Contatos e Compromissos

27 de Julho

Implementação da primeira parte do EmailSession?. Adicionado ontologias usadas dentro da API. Usando o gerador de classes nas ontologias para usar como "Semantic" Correções no gerador de classes.

28 de Julho

Correções no gerador de classes, implementação do método "get" dentro do método mágico "call" para busca dados setados no Model

29 de Julho

Modelagem da classe "User" e "UriGenerator?" na API semântica. Atualização do WebServiceClient? para usar Configurable

3 de Agosto

4 de Agosto

Reunião com o pessoal da pucrs para alinhamento, durante a reunião foi solicitado quais as consultas irão ser realizadas dentro do expresso. Após a reunião iniciei o levantamento de todos os campos (visiveis na tela do Expresso) que necessitam ser anotados e algumas consultas que serão realizadas entregar as consultas até terça-feira (09/08/2011)

Agendado o workshop presencial que será ministrado pelo consultor da PUCRS (29/30 de agosto de 2011)

5 de Agosto

Escrevendo relatórios das atividades realizadas do projeto.

8 de Agosto

9 de Agosto

10 de Agosto

Realizado atualização do modelo da API Semântica

11 de Agosto

12 de Agosto

Preparação do guia de alinhamento para a nova integrante da equipe. https://docs.google.com/document/d/1FGE3AVTDFsBjd6y7mUK2j8gins4fHhKhXyQkW840Fmo/edit?hl=en_US

15 de Agosto

Feito correção na classe generator, ela não estava buscado todas as classes da ontologia carregada

16 de Agosto

Termino da correção da classe generator e implementado ajuste de uso na classe Model

17 de Agosto

18 de Agosto

Adicionando classes de geração de URIs no Modelo da API Adicionando classe ImapProvider? para acesso ao IMAP

19 de Agosto

22 de Agosto

Preparação prova de PHP Programação da classe ImapProvider?

23 de Agosto

Programação da classe ImapProvider?

24 de Agosto

Criando script SQL para copiar agenda de um usuario de uma banco de dados de backup para o banco de produção

25 de Agosto

Criando script SQL para copiar agenda de um usuario de uma banco de dados de backup para o banco de produção [Terminado]

Continuando a atividade do ImapProvider?

26 de Agosto

Programação da ImapProvider?

29 de Agosto

Workshop sobre semântica com a equipe da PUCRS

30 de Agosto

Workshop sobre semântica com a equipe da PUCRS

31 de Agosto

Criado documento com plano de ação para desenvolvimento https://docs.google.com/document/d/1OzeNxnx8N1SCXwr_aN5In0xUsUm3R-oSyVt2KwYXlnQ/edit?hl=en_US&pli=1

Criado documento com padronização das URIs https://docs.google.com/document/d/105iqPR2o2PzRw35o2NYJ6Hfc7oN6JCMxYxNCcAUwmu0/edit?hl=en_US

01 de Setembro

Atualização do documento de plano de ação, adicionando metas em cada funcionadalide. Reunião para definição das metas e prazo de entrega

Criação dos tickets para entrega no dia 15/09/2011

02 Setembro

Implementação do método findByUri na EmailSession?

05 ~ 14 de Setembro

Força tarefa para concluir a descrição dos recursos de comunicação do Expresso.

Ticket #1217 Ticket #1218 Ticket #1219 Ticket #1220 Ticket #1221 Ticket #1222 Ticket #1223 Ticket #1224 Ticket #1226

15 ~ 16 de Setembro

Em São Paulo. Google Developer Day

Attachments