Vamos Ligar e Partilhar? – Introdução ao RDFS (Parte I)
Agora que já estamos familiarizados com o modelo (de dados) RDF - Resource Description Framework e a sua forma de representação de informação podemos focar-nos em conhecer um vocabulário que nos permite descrever dados representados em RDF. Assim, hoje vamos conhecer o RDF Schema.
O que é o RDF Schema (RDFS)?
O RDF Schema é um vocabulário para modelação de dados representados em RDF. Assim, o RDFS pode ser visto como uma linguagem de esquema (schema language) e, portanto, é comparável com outras linguagens de esquema tais como:
(i) o XSD – XML Schema Definition para informação representada em documentos XML;
(ii) a linguagem de definição (ou descrição) de dados (DDL – Data Definition/Description Language) usada por um sistema de gestão de base de dados (SGBD) para especificar e organizar os seus dados; ou até
(iii) a estrutura de classes de um sistema de programação baseado no paradigma orientado a objetos (OO).
Em geral, estas linguagens de esquema (incluindo o RDFS) têm em comum o facto de permitirem a especificação de um esquema (schema) cujo objetivo é dizer algo sobre (i.e. descrever) os dados representados. Neste sentido, um esquema é informação sobre os dados. Nos sistemas de modelação de dados mais tradicionais existe uma clara separação entre os dados e o esquema subjacente aos dados, sendo os mesmos expressos de forma distinta. Contudo, a exemplo do que acontece com o RDFS, nas versões mais modernas desses sistemas os dados e o esquema subjacente já são expressos da mesma forma.
No caso do RDFS, tanto o vocabulário que pode ser usado para especificação de um esquema, bem como todas as informações relativas a um esquema RDFS e os próprios dados descritos por esse esquema são expressos através de triplos RDF. Desta forma, em RDF(S) as relações entre (i) os recursos “de dados”, (ii) os recursos de “esquema”, (iii) os recursos da “linguagem” RDFS, bem como (iv) com quaisquer outros recursos são feitas através de triplos.
Paradigma de Modelação
O RDFS adota um paradigma de modelação similar às linguagens de programação OO (e.g. Java, C#), assente no conceito de “classe” e de “propriedade” ou “relação”. Contudo, nas linguagens de programação OO as propriedades apenas existem no contexto de uma classe (e.g. a classe “Livro” define a propriedade “autor” como um atributo do tipo “Pessoa”) enquanto que em RDFS tanto as classes como as propriedades existem por si só (i.e. são independentes entre si), sendo as propriedades (e.g. “autor”) relacionadas com as classes (e.g. “Pessoa” e “Livro”) através da especificação de um domínio (e.g. “Livro”) e de um contradomínio (e.g. “Pessoa”). Vulgarmente, denomina-se a abordagem RDFS como sendo centrada nas propriedades (property-centric) enquanto a abordagem OO denomina-se centrada nas classes (class-centric ou concept-centric).
Para nos referirmos aos mecanismos (i.e. recursos RDF) disponibilizados pelo RDF(S) para descrever grupos de recursos relacionados (i.e. classes) e as relações (i.e. propriedades) entre esses recursos, usam-se geralmente dois prefixos:
- rdfs: referente ao IRI http://www.w3.org/2000/01/rdf-schema#;
- rdf: referente ao IRI http://www.w3.org/1999/02/22-rdf-syntax-ns#.
Vocabulário
Para introduzir os principais recursos do RDF(S) e demonstrar o seu uso na especificação de um esquema, considere os dados constantes no grafo RDF graficamente representado na Figura 1 (embora com uma disposição gráfica diferente, a informação constante neste grafo é a mesma que foi usada no artigo anterior).
Fazendo uma interpretação léxico-sintática do IRI de cada recurso, facilmente se percebe que os nossos dados referem-se a pessoas, objetos, cores e formas geométricas. Assim, um possível esquema para estes dados pode contemplar a existência das seguintes classes e respetivos recursos (em itálico):
- Pessoa (ex:Pessoa): para identificar o conjunto de recursos que são representativos de uma pessoa (e.g. ex:Pessoa1);
- Objeto (ex:Objeto): para identificar o conjunto de recursos que são representativos de um objeto (e.g. ex:Objeto1 e ex:Objeto2);
- Cor (ex:Cor): para identificar o conjunto de recursos que são representativos de uma cor (e.g. ex:Azul);
- Forma (ex:Forma): para identificar o conjunto de recursos que são representativos de uma forma geométrica (e.g. ex:Paralelepipédica).
Consequentemente, ao nosso exemplo devemos adicionar os seguintes triplos:
ex:Pessoa rdf:type rdfs:Class ex:Objeto rdf:type rdfs:Class ex:Cor rdf:type rdfs:Class ex:Forma rdf:type rdfs:Class
O recurso pré-definido rdf:type é uma propriedade que permite afirmar que um determinado recurso é uma instância (i.e. membro) de uma determinada classe, enquanto que o recurso pré-definido rdfs:Class representa o conjunto de recursos que são classes. Assim, cada um destes triplos está a afirmar que o recurso usado no triplo como sujeito é uma instância de rdfs:Class e, consequentemente, faz desse recurso uma classe.
Posto isto, também já temos conhecimento para expressar quais são as instâncias das classes por nós criadas. Assim, ao nosso exemplo devemos adicionar cinco novos triplos:
ex:Pessoa1 rdf:type ex:Pessoa ex:Objeto1 rdf:type ex:Objeto ex:Objeto2 rdf:type ex:Objeto ex:Azul rdf:type ex:Cor ex:Paralelepipédica rdf:type ex:Forma
A Figura 2 representa graficamente o grafo RDF resultante do esquema definido até ao momento para o nosso exemplo. Esta figura encontra-se organizada em três níveis:
- o nível RDF(S) onde estão representados os recursos do RDF(S) que foram introduzidos e usados até ao momento (irão aumentar ao longo do artigo, sendo representadas com setas verdes algumas das relações existentes entre eles);
- o nível de Esquema onde estão representados os recursos definidos com o intuito de descreverem os dados;
- o nível de Dados onde consta os dados RDF usados no exemplo.
Usam-se setas azuis para salientar os triplos entretanto adicionados.
Para finalizarmos a especificação de um possível esquema para os dados do exemplo falta-nos criar propriedades, i.e. predicados. Para tal, precisamos de usar mais um recurso pré-definido: o rdf:Property. Este recurso representa a classe de todas as propriedades (e nesse sentido também é uma instância de rdfs:Class). Assim, ao nosso exemplo devemos adicionar seis novos triplos:
ex:nome rdf:type rdf:Property ex:idade rdf:type rdf:Property ex:possui rdf:type rdf:Property ex:descritivo rdf:type rdf:Property ex:temCor rdf:type rdf:Property ex:temForma rdf:type rdf:Property
A Figura 3 representa graficamente o grafo RDF resultante do esquema definido até ao momento.
Adicionalmente, se o desejarmos, podemos especificar para cada propriedade (i) o seu domínio, ou seja, a que classe(s) pertence(m) as instâncias às quais se aplica a propriedade; e (ii) o seu contradomínio, ou seja, a que classe(s) deve(m) pertencer as instâncias ou literais usados como valores da propriedade. Para tal, recorre-se às propriedades pré-definidas rdfs:domain e rdfs:range respectivamente. Assim, para os nossos dados podemos definir, por exemplo, que as propriedades ex:nome e ex:possui se aplicam a instâncias da classe ex:Pessoa. Por outro, os valores possíveis para a propriedade ex:temCor são instâncias da classe ex:Cor, enquanto que para a propriedade ex:possui são instâncias da classe ex:Objeto. Neste caso devemos, então, adicionar os seguintes triplos:
ex:nome rdfs:domain ex:Pessoa ex:possui rdfs:domain ex:Pessoa ex:possui rdfs:range ex:Objeto ex:temCor rdfs:range ex:Cor
A Figura 4 representa graficamente o grafo RDF resultante do esquema definido até ao momento.
Descrições textuais podem ser adicionadas a qualquer recurso, seja ele parte do esquema ou dos próprios dados. Para tal, faz-se uso das propriedades rdfs:label e rdfs:comment. Ambas têm como domínio rdfs:Resource (i.e. um qualquer recurso) e como contradomínio rdfs:Literal (i.e. um qualquer literal). Enquanto o propósito de rdfs:label é especificar uma etiqueta (curta) para o recurso em causa, o propósito de rdfs:comment é providenciar uma descrição mais extensa (e completa). Por exemplo, à classe ex:Pessoa podemos adicionar uma etiqueta em português e outra em inglês da seguinte forma:
ex:Pessoa rdfs:label “Pessoa”@pt ex:Pessoa rdfs:label “Person”@en
Descrições mais extensas e completas para o recurso ex:Pessoa podem ser adicionadas de forma similar (substituindo rdfs:label por rdfs:comment e especificando o literal pretendido).
Para concluirmos a introdução aos principais recursos do RDF(S) é essencial apresentarmos mais duas propriedades: rdfs:subClassOf e rdfs:subPropertyOf. A primeira permite expressar que uma classe (e.g. ex:Pessoa) é subclasse de outra classe (e.g. ex:SerVivo) através de um triplo na forma
c1 rdfs:subClassOf c2
onde c1 e c2 representam duas classes, sendo c1 subclasse de c2. O uso desta propriedade permite-nos especificar uma hierarquia de classes.
A segunda permite expressar que uma propriedade (e.g. ex:nome) é subpropriedade de outra propriedade (e.g. rdfs:label) através de um triplo na forma
p1 rdfs:subPropertyOf p2
onde p1 e p2 representam duas propriedades, sendo p1 subpropriedade de p2. O uso desta propriedade permite-nos especificar uma hierarquia de propriedades.
A Figura 5 representa graficamente o grafo RDF resultante do exemplo usado e agora terminado.
Conclusões
Conclui-se esta primeira parte salientando que para além dos recursos RDF(S) usados, existem muitos outros que apesar da sua relevância não foram mencionados. Quando se revelar oportuno mencionar-se-ão os mesmos dando indicação de que fazem parte do RDF(S). Por outro lado, a semântica associada aos recursos do RDF(S) e, por conseguinte, a qualquer esquema RDF(S) ainda não foi abordada. Contudo, este tópico é fundamental para se ter um conhecimento mais profundo e completo sobre o mesmo e, dessa forma, usá-lo adequadamente. Como tal, este será o foco do próximo artigo (parte II do RDFS).
Por hoje é tudo! Esperamos que tenha gostado e deixe a sua opinião.
Este artigo tem mais de um ano
Penso que se poderia dizer que os Dados são a ABox e o Esquema a TBox para quem quiser pesquisar mais sobre o tema. Que tal um outro post sobre OWL e Protege?
Viva,
Como deve ter reparado pelo título este foi dividido em partes sendo que muitos outros conteúdos serão abordados na próxima parte, tal como indicado na conclusão “Conclui-se esta primeira parte salientando que para além dos recursos RDF(S) usados, existem muitos outros que apesar da sua relevância não foram mencionados. Quando se revelar oportuno mencionar-se-ão os mesmos dando indicação de que fazem parte do RDF(S). […] Contudo, este tópico é fundamental para se ter um conhecimento mais profundo e completo sobre o mesmo e, dessa forma, usá-lo adequadamente. Como tal, este será o foco do próximo artigo (parte II do RDFS).”
Quanto à questão do OWL e Proteger, serão abordados em tópicos futuros da temática de Web semântica.
Cumprimentos,
Manuel Rocha
Excelente tutorial! Eu andava às aranhas para entender isto! Muito obrigada!