Analisando Arquivos RDF em Formato Turtle/N3 com Python

Ao utilizar a biblioteca RDFLib em Python para processar dados RDF no formato Turtle, desenvolvedores podem enfrentar desafios com a sintaxe do arquivo ou a configuração da análise. Considere um cenário onde um arquivo Turtle contendo informações botânicas é carregado, mas a operação falha devido a erros de formatação.

Dados de exemplo originais podem conter declarações como:

@PREFIX ex: <http://exemplo.com/planta> .
@PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .

ex:arvore123
    ex:descricao [
        ex:nome [
            ex:reino "Plantae" ;
            ex:divisao "Magnoliophyta" ;
            ex:classe "Magnoliopsida" ;
            ex:ordem "Rosales" ;
            ex:familia "Rosaceae" ;
            ex:genero "Prunus" ;
            ex:especie "P. avium" ;
            ex:idioma "latim" ;
            ex:registradoPor [
                ex:pessoa "Maria_Silva" ;
                ex:dataInicio "2020-03-15"^^<http://www.w3.org/2001/XMLSchema#date>
            ]
        ] ;
        ex:nome [
            ex:idioma "ingles" ;
            ex:valor "cherry tree"
        ] ;
        ex:flor [
            ex:genero "masculino"@pt ;
            ex:inflorescencia "racimo"@pt ;
            ex:cor "branco"@pt ;
            ex:cor "rosa"@pt ;
            ex:aroma "doce"@pt
        ] ;
        ex:fruta [
            ex:tipo "drupa"@pt ;
            ex:cor "vermelho"@pt
        ]
    ] .

Ao tentar analisar esse arquivo com o seguitne código Python:

import rdflib

grafo = rdflib.Graph()
# Tentativa com diferentes formatos
# grafo.parse('plantas.ttl', format='turtle')
# grafo.parse('plantas.ttl', format='n3')
grafo.parse('plantas.ttl', format='n3')
print(f"Número de triplas: {len(grafo)}")
for tripla in grafo:
    print(tripla)

Um erro semelhante ao abaixo pode ocorrer:

ValueError: Encontrado @PREFIX quando esperava http://www.w3.org/2000/10/swap/grammar/n3#document

A raiz do problema reside em dois pontos críticos na sintaxe Turtle:

  1. Os prefixos devem ser declarados em minúsculas, utilizando a palavra-chave @prefix em vez de @PREFIX.
  2. Declarações de listas ou recursos aninhados devem seguir a gramática correta, como utilizar colchetes adequadamente.

Após as correções, o arquivo Turtle revisado teria a seguinte estrutura:

@prefix ex: <http://exemplo.com/planta> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .

ex:arvore123
    ex:descricao [
        ex:nome [
            ex:reino "Plantae" ;
            ex:divisao "Magnoliophyta" ;
            ex:classe "Magnoliopsida" ;
            ex:ordem "Rosales" ;
            ex:familia "Rosaceae" ;
            ex:genero "Prunus" ;
            ex:especie "P. avium" ;
            ex:idioma "latim" ;
            ex:registradoPor [
                ex:pessoa "Maria_Silva" ;
                ex:dataInicio "2020-03-15"^^<http://www.w3.org/2001/XMLSchema#date>
            ]
        ] ;
        ex:nome [
            ex:idioma "ingles" ;
            ex:valor "cherry tree"
        ] ;
        ex:flor [
            ex:genero "masculino"@pt ;
            ex:inflorescencia "racimo"@pt ;
            ex:cor "branco"@pt ;
            ex:cor "rosa"@pt ;
            ex:aroma "doce"@pt
        ] ;
        ex:fruta [
            ex:tipo "drupa"@pt ;
            ex:cor "vermelho"@pt
        ]
    ] .

O código Python correspondente para análise bem-sucedida utiliza a classe Graph com o método parse especificando corretamente o formato:

import rdflib

def carregar_dados_rdf(caminho_arquivo):
    g = rdflib.Graph()
    try:
        g.parse(caminho_arquivo, format='turtle')
        print(f"Arquivo carregado com sucesso. Total de triplas: {len(g)}")
        return g
    except Exception as e:
        print(f"Erro ao analisar o arquivo: {e}")
        return None

grafo = carregar_dados_rdf('plantas.ttl')
if grafo:
    for sujeito, predicado, objeto in grafo:
        print(f"Sujeito: {sujeito}, Predicado: {predicado}, Objeto: {objeto}")

Essa abordagem garante que os dados RDF sejam corretamente interpretados, permitindo a manipulação posterior de informações semânticas em aplicações Python.

Tags: Python RDFLib turtle N3 RDF

Publicado em 6-26 04:29