Web,ruby, Ajax ou qualquer outra coisa que me venha a cabeça (com prioridade para esta última)

28 março, 2008

Primer: Guia Inicial sobre RDF e a Rede Semântica

Este documento foi traduzido para português sendo uma versão não oficial do documento original em inglês Primer: Getting into RDF & Semantic Web using N3 por Tim Berners-Lee. São possíveis erros devidos à tradução de Carlos Afonso da sua exclusiva responsabilidade de Carlos Afonso e os mesmo não são passíveis de imputação, em qualquer caso, ao W3C.



O mundo da rede semântica, como baseado em RDF, é realmente simples na base. Este artigo mostra como poderá começar a dar os primeiros passos. Usa uma linguagem simplificada -- Notation 3 ou N3 – a qual é basicamente equivalente ao RDF na sua sintaxes XML mas mais fácil de escrever quando se está a começar.

Sujeito, verbo e objecto

Em RDF, a informação é uma simples coleção de afirmações cada uma com um sugeito, verbo e objecto – e nada mais. Em N3 pode escrever-se um triplo RDF dessa forma, com um ponto final:

<#carlos> <#conhece> <#luisa> .

Tudo, seja um sugeito, um verbo ou um objecto é identificado usando-se um URI Identificador Universal de Recurso. Isto é algo como <http://www.w3.org/> ou <http://www.w3.org/2000/10/swap/test/s1.n3#includes>, mas quando falta tudo antes do sinal de cardinal "#" isso identifica o <#carlos> no documento actual seja ele qual for.

Há uma excepção: o objecto (só) pode ser um literal, como uma cadeia de caracteres ou um número inteiro:

<#carlos> <#conhece> <#luisa> .
<#carlos> <#idade> 24 .

O verbo “conhece” é aquilo que em RDF se designa por “propriedade” e pensa-se nela como um nome que exprime a relação entre os outros dois. De facto podemos escrever

<#carlos> <#filho> <#zeca> .

Alternativamente, para o tornar mais legível, podemos reescrever o mesmo como

<#carlos> tem <#filho> <#zeca> .

ou

<#zeca> é <#filho> de <#carlos> .

Há dois atalhos quando se tens várias afirmações sobre um mesmo sujeito: o ponto e vírgula ";" introduz uma outra propriedade do mesmo sujeito, uma vírgula introduz outro objecto com o mesmo predicado e sugeito.

<#carlos> <#filho>  <#zeca>, <#pedro>, <#ana> ;
       <#idade>    45 ;
       <#cordosolhos> "castanho" .

Assim, por exemplo os dados na tabela

idade

cordosolhos

carlos

45

castanho

zeca

13

verde

pedro

15

verde

Pode ser escrita como

  <#carlos>  <#idade> 45;  <#cordosolhos> "castanho" .
  <#zeca>    <#idade> 13;  <#cordosolhos> "verde" .
  <#pedro>   <#idade> 15;  <#cordosolhos> "verde" .

Por vezes, há coisas envolvidas nas afirmações que não têm qualquer identificador a quem as queira atribuir – sabe que existe um mas só deseja dar as propriedades. Isso representa-se usando parêntesis rectos com as propriedades dentro deles.

<#carlos> <#filho> [ <#idade> 14 ] , [ <#idade> 13 ].

Isto pode ser lido como querendo dizer que o #carlos tem um #filho com a #idade de "14" e um #filho com a #idade de"13". Há 2 coisas importantes a lembrar

  • Os identificadores são meros identificadores o facto de as letras c a r l o s serem usadas não querem dizer a ninguém nem a nenhuma máquina que estejamos a falar de alguém cujo nome seja "Carlos" – excepto se dissermos <#carlos> <#nome> "Carlos". O mesmo se aplica aos verbos – nunca tome as letras f i l h o como querendo dizer o que significam – iremos descobrir como mais tarde.

  • Os parentesís rectos indicam que algo existe com a propriedade dada, mas não nos dão nenhuma maneira de nos referirmos às mesmas noutro local neste ou noutro documento.

Se de facto desejarmos usar um nome poderiamos ter escrito a tabela acima como

  [ <#nome> "Carlos"; <#idade> 45;  <#cordosolhos> "castanho"  ].
  [ <#nome> "Zeca" ;  <#idade> 13;  <#cordosolhos> "verde" ].
  [ <#nome> "Pedro" ; <#idade> 15;  <#cordosolhos> "verde" ].

Há várias maneiras de combinar parêntesis rectos – mas pode perceber isso, sem a minha ajuda, dos exemplos que aí vêem. Não há muito mais a aprender sobre como exprimir dados em N3, e assim passemos à frente.

Partilha de conceitos

A rede semântica não pode definir num documento o que qualquer coisa quer dizer. Isso é algo que pode fazer em português (ou ocasionalmente em matemática) mas quando realmente comunicamos usando o conceito "título", (tal como numa ficha da Biblioteca Nacional ou numa página da Rede), dependemos de um conceito partilhado de “Título”. Na rede semântica, partilhamos de forma precisa usando exactamente a mesma URI para o conceito de título.

Podia exemplificar a tentativa de dar um título a um documento N3 por

<> <#título>  "Um exemplo simples de N3".

(O par <> inicial é uma referência URI vazia que se refer sempre ao documento em que é escrito.) O <#título> refer-se ao conceito de #título como definido no proprio documento. Isto não quererá dizer muito ao leitor. Contudo, um grupo de pessoas criou uma lista de propriedades designada por Dublin Core, entre as quais figura a sua ideia de título (title) que deram ao identificador

<http://purl.org/dc/elements/1.1/title>. Assim podemos definir muito melhor a afirmação se dissermos

<> <http://purl.org/dc/elements/1.1/title>
 "Primer: Guia Inicial sobre RDF e a Rede Semântica usando a notação N3".

Claro que isto poderá ser um pouco verboso em excesso – imagine identificadores tão longos para tudo como #idade e #cordosolhos. Assim a N3 permite estabelecer abreviações para a parte mais comprida que designamos como espaço de nomeção. Estabelece-se esse espaço de nomeação usando a expressão "@prefix":

@prefix dc:  <http://purl.org/dc/elements/1.1/> .
<> dc:title
  "Primer: Guia Inicial sobre RDF e a Rede Semântica usando a notação N3".

Note-se que no caso de se usar prefixo, usamos dois pontos (:) em vez de um sinal de cardinal entre dc e title, e não se usa os <sinais de menor e maior que> à volta da coisa toda. É muito mais rápido. Será assim que irá ver e escrever a maior parte dos seus predicados em N3. Uma vez estabelecido um prefixo pode ser usado no resto do documento.

Há um cada vez maior número de vocabulários RDF aos quais nos podemos referir - Ver RDF home page e coisas enlaçadas a partir dela – e pode construir os seus próprios vocabulários para as suas aplicações de forma muito simples.

Por agora iremos usar um espaços de nomeção bem conhecidos, de modo a pouparmos espaço, irei simplesmente presumir os seguintes prefixos

@prefix rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl:  <http://www.w3.org/2002/07/owl#> .

Estes são, respectivamente, os espaços de nomeação RDF, RDF schema e OWL. Dão-nos os termos centrais sobre os quais nos podemos atirar para a rede semântica. Irei também presumir que o prefixo vazio figura no lugar do próprio documento que se esteja a escrever que podemos exprimir em N3 como

@prefix : <#> .

Tal significa que a afirmação lá mais atrás poderia ser escrita como

:carlos :filho [ :idade 14 ] , [ :idade 13 ].

Que irá pois incluir muito menos caracteres a escrever. Agora compreende como escrever dados em N3 pode começar a construir os seus próprios vocabulários pois são eles próprios só dados.

Criar vocabulários

Coisas como dc:title acima são propriedades RDF. Quando se quer definir um novo vocabulários defini-se novas classes de coisas e novas propriedades. Quando se dizer que tipo de coisa algo é, diz-se a que Classe pertence.

A propriedade que nos diz de que tipo uma coisa é é rdf:type que pode ser abrevida em N3 para a (do inglês um ou uma ). Assim podemos definir Pessoa como Classe

:Pessoa a rdfs:Class.

No mesmo documento, podemos apresentar uma pessoa real

:Carlos a :Pessoa.

Classes só nos dizem sobre a coisa que está nelas. Um objecto pode pertencer a muitas classes. Não é necessário que haja qualquer relação hierárquica –pense em Pessoa, ObjectoAnimado, Animal, PessoaAlta, Amigo, etc. Se houver uma relação entre duas classes pode tratar de o exprimir – veja as propriedades (de classes) nos vocabulários RDF Schema e OWL .

:Mulher a rdfs:Class; rdfs:subClassOf :Pessoa .

Uma propriedade é algo que é usado para declarar uma relação entre duas coisas.

:irmã a rdf:Property.

Por vezes quando existe uma relação entre duas coisas, imediatamente sabe-se algo sobre elas, que pode ser expresso como uma classe. Quando o sugeito de qualquer propriedade tem que estar numa classe, então essa classe é o domínio da propriedade. Quando o objecto tem que estar numa classe, então a classe é designada o domínio de uma propriedade. Uma propriedade pode ter vários domínios e limites, mas normalmente uma especifica uma.

:irmã rdfs:domain :Pessoa; 
        rdfs:range :Mulher.

Note-se que os identificadores de classe começar por letras maísculas e as propriedades com minúsculas. Não é uma regra mas sim uma boa convenção a manter. Note-se ainda que devido ao domínio de rdfs:range e rdfs:domain ser ele mesmo uma rdf:Property, segue-se que :irmã é uma rdf:Property sem que seja explicitamente expressa essa qualidade.

Equivalência

Frequentemente, define-se um vocabulário onde um ou mais termos, quer se tenha apercebido ou não quando se começa, é de facto exactamente o mesmo que o definido noutro vocabulário. Isto é uma porção de informação realmente útil para qualquer pessoa ou máquina que trate da informação. A propriedade de equivalência entre dois termos é tão útil e fundamental que a N3 tem uma abreviatura especial para a mesma: "=".

:Mulher = foo:PessoadosexofemeninoAdulta .
:Title a rdf:Property; = dc:title .

Pista: Usar vocabulários de outras pessoas quando se possa – ajuda à intertroca de dados. Quando se define o nosso próprio vocabulário que inclui sinónimos, devemos registar a sua equivalência porque, se irá ajudar processadores actuais e futuros a processar os nossos dados e os dados dos outros de modos apropriados.

Escolher um espaço de nomeação e publicar o seu vocabolário

Documentação em linha de termos de vocabulário ajuda as pessoas a ler e escrever dados RDF. Os escritores necessitam de ver como um termo é suposto ser usado, os leitores necessitam ver o que é suposto significarem. As pessoas que desenvolvam software que use os termos necessitam de saber em detalhe exactamente o que é que cada URI significa.

Se documentar o seu vocabulário usando os vocabulários RDF Schema e OWL, então os seus documentos serão legíveis por máquinas de uma variadade de modos interessantes e úteis, como mencionado acima e explorado em mais detalhe em Vocabulary Documentation. Este género de documentação-RDF-em-RDF é por vezes designada por “esquema” ou “ontologia”.

A forma mais fácil de ajudar as pessoas a encontrar a sua documentação é fazer as URIs que cria de termos de vocabulário também funcionarem num navegador web. Isto funciona automaticamente se seguir as convenções de nomeação que usamos aqui, onde o documento de definição de vocabulário tem uma URI semelhante a http://exemplo.com/termos e se refer aos seus termos como <#Mulher>. Com a declaração de @prefix anterior, isto dá a URI http://exemplo.com/termos#Mulher que deverá funcionar em qualquer navegador que mostre o documento de definição.

Idealmente deverá publicar a sua documentação na web usando um servidor e porção do espaço URI que seja possuído por uma organização que possa manter os mesmos bem no futuro. Assim, dentro de muitos anos no futuro, os dados em RDF que usem os seus termos ainda serão documentados e potencialmente poderão ser compreendidos. QA convenção de colocar o ano corrente na URI pode ajudar na estabilidade; poderá haver alguém, que algum dia, seja tentado a reutiliza algo como http://exemplo.com/vocabulario-comida, mas provavelmente não mexerá em http://exemplo.com/2003/vocabulario-comida, quando desejarem actualizar a documentação. Em certas circunstâncias pode também aumentar a estabilidade usando um nome de domínio especializado que possa ser isolado de renomeação da organização ou de problemas relativos a marcas.

Claro que se só estiver a divertir-se poderá usar um ficheiro (digamos minhadb.n3) na mesma pasta do resto do seu trabalho. Qaundo o fizer pode simplesmente usar <minhadb.n3#> como identificador do espaço de nomeação, porqueem N3 (assim como em HTML), as URIs podem ser especificadas de modo relativo à localização actual.

Mais

Agora já sabe tudo o que necessita para começar a criar os seus próprios vocabulários, ou ontologias e tem alguns apontadores para onde pesquisar sobre meios mais ricos de os definir. Não necessita de ir mais longe, pois o que tem agora lhe permite criar novas aplicações, criar esquemas, ficheiros de dados e programas que intertroquem e manipulem dados para a rede semântica.

Neste ponto deverá estar a adquirir experiência e a escrever algo. Para lhe dar mais ideias há uma longa lista de exemplos variados e mais complexos. Estes vêm com explicações menos detalhadas.

Ou pode continuar num tutorial que lhe dê mais características da linguagem, explicando-lhe como processar os seus dados e como envolver outros dados na Web. Neste caso o próximo passo é sobre: Shortcuts and long cuts


Referências

Tim BL, sem o seu chapéu de director
$Id: Primer.html,v 1.61 2005/08/16 13:49:21 timbl Exp $

2 comentários:

Pedro Rogério disse...

Muito bom, matou a pau!!!

Carlos Afonso disse...

Mérito do Tim BL. Qualquer demérito é meu.

Este artigo faz parte de uma série que tentarei ir traduzindo à medida que for tendo tempo.