2013-07-12 12 views
2

Так что я Notation3 файл, который выглядит следующим образом:Ошибки в сериализации Notation3 файла в формат RDFXML в питоне

@prefix wn: <http://www.w3.org/2006/03/wn/wn20/instances/> . 
@prefix lemon: <http://www.monnet-project.eu/#> . 
@prefix lexinfo: <http://www.lexinfo.net/ontology#> . 

:lexicon a lemon:Lexicon ; 
    lemon:language "it" ; 
    lemon:entry :fifa. 

:fifa a lemon:LexicalEntry ; 
    lemon:canonicalForm [ lemon:writtenRep "fifa"@it ] ; 
    lemon:sense [ lemon:reference wn:synset-fear-noun-1 ]; 
    lexinfo:partOfSpeech lexinfo:noun . 

И я пытаюсь ввести его в RDFLib Graph и сериализовать его как файл RDFxml с помощью этот код:

#!/usr/bin/python 
# -*- coding: utf-8 -*- 
import rdflib 
from rdflib import URIRef, Graph, Namespace 
from rdflib.plugins.parsers.notation3 import N3Parser 

g = Graph() 
result = g.parse(file=open("lemon_example_fear.txt", "r"), format="text/n3") 
print (g.serialize(format='xml')) 

, но в данный момент я получаю эту ошибку:

rdflib.plugins.parsers.notation3.BadSyntax: at line 5 of <>: 
Bad syntax (Prefix ":" not bound) at^in: 
"... lexinfo: <http://www.lexinfo.net/ontology/2.0/lexinfo#> . 

^:lexicon a lemon:Lexicon ; 
    lemon:language "it" ; 
    lem..." 

Является ли это проблемой с файлом, который я пытаюсь сериализовать, или с кодом, который я использую для этого?

+0

Какие версии Python и RDFLib вы используете? – jsalonen

+1

4.0.1 RDFlib и python 2.7.3 – Johnnerz

ответ

1

Я получаю ошибку как с RDFLib 3 и 4 так, как я изначально подозревал, что это не просто регресс ошибка введена в RDFLib 4.

Присмотревшись в ваших данных я чувствую, что есть что-то рыхлый продолжается.

Возьмите первый набор операторов, например:

:lexicon a lemon:Lexicon ; 
    lemon:language "it" ; 
    lemon:entry :fifa, 
    :timore. 

С точки зрения RDF, что вы говорите здесь является то, что вы хотите, чтобы определить объект ссылается без префикса собственности называется :lexicon и присвоить некоторые более префиксов свойства в это (например, :fifa и :timore).

Учитывая, что вы не определили, как парсер RDF должен обрабатывать несвязанные префиксы, каждый парсер сам принимает решение о том, как действовать. Например, W3C RDF Validation присваивает неподписанные свойства сгенерированным пространством имен (например, #lexicon ->http://www.w3.org/RDF/Validator/run/1373638767868#lexicon). Проблема здесь в том, что это то, что осталось решать парсеру. В вашем случае парсер решает отправить вам сообщение об ошибке, которое ИМХО очень приемлемо, это не рекомендуется.

Самый простой обходной путь я могу думать о том, чтобы явно определить префикс для префиксов свойств в начале вашего файла N3 следующим образом:

@prefix : <#> . 

Вы также можете добавить префикс программно в свой график с RDFLib.

Edit: как отмечалось в другом ответе, Н3 спецификации дает четкое определение о том, как не определено, пустые префиксы должны быть обработаны таким образом, это может быть на самом деле рассматривается как ошибка в RDFLib.

Последующие действия (2013-07-28): Эта проблема была сообщена сторонникам RDFLib, исследована и, вероятно, вызвана ошибкой. Смотрите выпуск трекер для деталей: https://github.com/RDFLib/rdflib/issues/312

+1

Спецификация N3 фактически определяет пустой префикс для привязки по умолчанию '<#>', поэтому разница сводится к тому, что парсер считает базовым URI файла (если вообще). См. Мой ответ для более подробной информации. – RobV

3

Чтобы добавить к тому, что @jsalonen сказал, что это не тот случай, несвязанный префикс остаются до анализатора, а что specification состояния следующего:

The empty prefix "" is by default , bound to "#" -- the local namespace of the file. The parser behaves as though there were a

@prefix : <#>.

Так точное разрешение несвязанного префикса будет зависеть от того, что парсер считает локальным пространством имен файла, следовательно, отличается поведение парсеров.

Обратите внимание, что в более стандартных форматах, таких как Turtle, это не применяется, несвязанный префикс всегда приведет к ошибке.

В общем, это плохая идея не определять все ваши префиксы или использовать относительные URI в любом формате RDF, так как вы будете во власти определенного поведения разрешения URI реализации, которое, как отмечено, может варьироваться в зависимости от сериализации.

+0

Вы определенно прибили его здесь. Таким образом, можно считать, что это ошибка в RDFLib (не соответствует спецификации здесь). – jsalonen

+1

В результате я попал в RDFLib, чтобы узнать подробности. – jsalonen