Ошибка при сериализации файла Notation3 в формат RDFXML в python
Итак, у меня есть файл Notation3, который выглядит так:
@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..."
Это проблема с файлом, который я пытаюсь сериализовать, или кодом, который я использую для этого?
2 ответа
Я получаю ошибку как с 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.
Редактировать: как отмечено в другом ответе, спецификация N3 дает четкое определение того, как неопределенные, пустые префиксы должны обрабатываться, так что это может фактически рассматриваться как ошибка в RDFLib.
Продолжение(2013-07-28): Эта проблема была сообщена сопровождающим RDFLib, исследована и, вероятно, вызвана ошибкой. Подробности смотрите в трекере проблем: https://github.com/RDFLib/rdflib/issues/312
Чтобы добавить к тому, что сказал @jsalonen, дело не в том, что несвязанный префикс оставлен на усмотрение парсера, а в спецификации указано следующее:
Пустой префикс "" по умолчанию привязан к "#" - локальному пространству имен файла. Парсер ведет себя так, как будто
@prefix : <#>.
Таким образом, точное разрешение несвязанного префикса будет зависеть от того, что анализатор считает локальным пространством имен файла, и, следовательно, от разного поведения между анализаторами.
Обратите внимание, что в более стандартных форматах, таких как Turtle, это не применяется, несвязанный префикс всегда приводит к ошибке.
В целом, плохая идея - не определять все свои префиксы или использовать относительные URI в любом формате RDF, поскольку вы будете зависеть от поведения конкретных реализаций разрешения URI, которое, как отмечалось, может варьироваться в зависимости от сериализации.