ISEL 2009 / 2010 DEETC - Mestrado em Engenharia Informática Guia Aula Prática (há 1 questão para responder em relatório) Representação e Processamento de Conhecimento (RPC) 1. Instalar a biblioteca “RDFLib” (http://rdflib.net) Para instalar a biblioteca RDFLib (versão 2.4.2) e o Python (versão 2.6.5) siga as indicações em: • _instalar_e_compilar_RDFLib_e_Python.txt. Sobre documentação adicional Python: • aByteOfPython.pdf. • OReilly_Learning_Python_3rd_Edition_Oct_2007.pdf. Sobre documentação adicional RDFLib: • Punções help e dir do Python. Exemplo (directamente na “Python Shell”): o import rdflib #importar a biblioteca o dir( rdflib.Graph ) #conteúdo da classe Graph o help( rdflib.Graph ) #comentários escritos no código de Graph o help( rdflib.Graph.parse ) #comentários em Graph.parse() o help( rdflib.Graph.query ) #comentários em Graph.query() • Mais informação sobre estas funções na documentação Python e também nas páginas 52-55 de oEssencialDaLinguagemPthon.pdf. • Recorra ao código fonte disponível na pasta: rdflib-2.4.2\rdflib\ • Informação adicional em: http://code.google.com/p/rdflib/wiki/Learning O ambiente de desenvolvimento IDLE que está incluído na distribuição do Python é suficiente para a utilização nas aulas práticas. O ambiente é simples e permite que a atenção se foque nos exercícios (e não em compreender o próprio ambiente de desenvolvimento). Posteriormente poderá usar um ambiente mais completo, e.g. o “plug-in” Ecplise PyDev (http://pydev.org/). 2. Iniciar uma descrição RDF (o mesmo grafo da aula anterior) Considere o vocabulário FOAF (“Friend Of A Friend”) especificado em “z_FOAF_spec.pdf”. a) Desenhe, no papel, um grafo com três pessoas: eu, amigoA e amigoB. Cada pessoa é do tipo (rdf:type) FOAF Person.e tem um nome (ver que propriedade FOAF utilizar). b) Estenda o grafo anterior indicando que a pessoa eu conhece e é conhecida pelas outras duas e que existe uma pessoa que é conhecida pelas outras mas que não conhece uma delas; a propriedade FOAF knows é usada para descrever asserções sobre “quem conhece quem”. c) Estenda o grafo anterior indicando para a pessoa eu: o endereço de e-mail e o cognome (“nickname”); para um amigo o seu endereço de e-mail (ver que propriedades FOAF utilizar). Paulo Trigo 1/3 ISEL 2009 / 2010 DEETC - Mestrado em Engenharia Informática Guia Aula Prática (há 1 questão para responder em relatório) Representação e Processamento de Conhecimento (RPC) 3. Interrogações usando objectos SPARQL da “RDFLib” Vamos começar com a informação no directório “_mySPARQL”. Analise “a01_interrogarRDF_SPARQL.py”; em especial “ObterConhecimentoMutuo”. a) Armazene uma representação (“serialization”) “xml” da descrição RDF que definiu na questão anterior e armazene essa descrição em “foaf_my.xml”. b) Estenda o código em “a01_interrogarRDF_SPARQL.py” de modo a construir um novo grafo (recorde a aula prática anterior) que contenha apenas as pessoas que se conhecem mutuamente. c) Armazene uma representação (“serialization”) “xml” e outra “nt” do novo grafo; as representações devem ser armazenadas, respectivamente, nos ficheiros “foaf_conhecidosMutuos.xml” e “foaf_conhecidosMutuos.nt”. d) Construa uma função “obter_nome( grafo )” que devolva, para “grafo”, o cognome (“nickname”) de uma determinada pessoa. 4. Interrogações usando o analisador (“parser”) SPARQL Analise “a02_interrogarRDF_SPARQLcomParser.py” e note que a mesma interrogação da questão anterior (também neste ficheiro em “ObterConhecimentoMutuo”) será respondida por análise directa de uma “string” contendo a directiva SPARQL. a) Adicione ao seu “foaf_my.xml” o triplo <foaf:Person, rdf:type, rdfs:Class>. b) Construa uma função “obter_Instancia( grafo )” que devolva, para “grafo”, todos os elementos (nós) que sejam do tipo classe (i.e., todos x tal que <x, rdf:type, rdfs:Class> pertence ao “grafo”). Atenção aos qualificadores “rdf” e “rdfs” pois têm que ser correctamente associados aos seus “namespace” para poderem constar na “string” SPARQL. 5. Ler e avaliar expressões SPARQL Analise “b_interrogador.py; em especial “main” e “obterResultadoInterrogacao”. a) Analise os ficheiros “foaf.rdf” e “foaf_01.sparql” e configure o interrogador para executar o teste “foaf; execute o teste também usando a linha de comando (em modo consola). b) Para cada um dos ficheiros “*.rdf” desenhe o grafo que a descrição representa. c) Para cada um dos ficheiros “*.sparql” escreva, em Português, a interrogação representada. d) Construa uma descrição rdfs com 6 classes: a, b, c, d, e, f; indique que b é subclasse de a, que c é subclasse de b, que d é subclasse de b e que f é subclasse de d. Armazene esta descrição em “z01_hierarquia.rdf”. e) Construa, em “z_hierarquia_transitividade.sparql”, uma interrogação SPARQL que devolva todas as asserções <C1 rdfs:subClassOf C2> possíveis de deduzir pelo facto da relação de “subclasse” ser transitiva (ou seja, excluindo as relações directas de subclasse). Paulo Trigo 2/3 ISEL 2009 / 2010 DEETC - Mestrado em Engenharia Informática Guia Aula Prática (há 1 questão para responder em relatório) Representação e Processamento de Conhecimento (RPC) 6. Estender grafo a partir do resultado de interrogação SPARQL Considere a sua interrogação em “z_hierarquia_transitividade.sparql”. a) Construa, em “c_grafoTransitividade.py” um programa que execute a sua interrogação. b) Construa, em “z02_hierarquia.rdf”, outra descrição rdf com outra hierarquia entre conceitos; execute em “c_grafoTransitividade.py” com esta sua nova descrição. c) Estenda “c_grafoTransitividade.py” de modo a que o grafo que é interrogado seja aumentado com todas as asserções <C1 rdfs:subClassOf C2> transitivas. 7. Usar SPARQL para inferir asserções a partir das definições RDFS Vamos passar para a informação no directório “_mySPARQL_RDFS”. Considere que NS é o qualificador do “namespace”: “http://#”. a) Construa, em “exemplo.rdf” as seguintes asserções (onde todos os recurso estão em NS): “o recurso ws é do tipo disciplina, PT é do tipo docente, docente é subclasse de funcionário. b) Construa, no papel, todas as asserções que se deduzem, no grafo da alínea anterior, a partir do conceito de rdfs:Class. c) Execute “a_construirRDFS.py” de modo a obter apenas o resultado da alínea anterior. d) Execute “a_construirRDFS.py” e complete o seu grafo com a informação resultante da aplicação das regras que permitem inferir novas asserções RDFS. e) Altere “exemplo.rdf” para que “obter_subClassOf_Transitiva” gere novas asserções. Ilustre as novas asserções no grafo que está a desenhar; se o grafo começar a ficar “todo riscado” desenhe grafos separados para cada um das regras de inferência. 8. Deduzir novas asserções a partir de Property e subPropertyOf Questão a responder em relatório a entregar até ao fim da semana seguinte à da aula prática. Sugestão: consulte as regras semânticas do RDFS (e.g., em slides “b02_linguagemRDFS.pdf”. a) Analise “obter_Class”; complete “obter_Property”. b) Analise “obter_C1_subClassOf_C2”; complete “obter_P1_subPropertyOf_P2”. c) Escolha o que deve analisar e complete “obter_subPropertyOf_Reflexiva”. d) Escolha o que deve analisar e complete “obter_subPropertyOf_Transitiva”. e) Construa a função “obter_domain”. f) Construa a função “obter_range”. g) Garanta que cada uma das alíneas anteriores gera um ficheiro com as novas asserções. Paulo Trigo 3/3