在python中将Notation3文件序列化为RDFXML格式时出错

时间:2013-07-12 13:48:25

标签: python xml rdf rdflib n3

所以我有一个看起来像这样的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图并使用以下代码将其序列化为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 个答案:

答案 0 :(得分:3)

要添加@jsalonen所说的不是未绑定前缀留给解析器而不是specification声明以下内容:

  

默认情况下,空前缀“”绑定到“#” - 本地   文件的名称空间。解析器的行为就好像有一个

     

@prefix : <#>.

因此,未绑定前缀的确切解析将取决于解析器认为文件的本地命名空间,因此解析器之间的行为不同。

请注意,在Turtle等更多标准格式中,这不适用,未绑定的前缀始终会导致错误。

一般来说,不定义所有前缀或使用任何RDF格式的相对URI是一个坏主意,因为您将受到特定实现URI解析行为的支配,如上所述,序列化之间可能会有所不同。

答案 1 :(得分:1)

我得到了RDFLib 3和4的错误,因此,正如我最初怀疑的那样,它不仅仅是RDFLib 4中引入的回归错误。

仔细研究一下你的数据,我觉得有些事可疑。

以第一组语句为例:

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

就RDF而言,你在这里所说的是你想要定义被称为:lexicon的无前缀属性引用的主题,并为其分配一些更加无前缀的属性(例如:fifa和{{1} })。

鉴于您尚未定义RDF解析器应如何处理未绑定的前缀,每个解析器都会自行决定如何继续。例如,W3C RDF Validation使用生成的命名空间(例如:timore - &gt; #lexicon)分配未加前缀的属性。这里的问题是这是留给解析器决定的东西。在你的情况下,解析器决定抛出一个错误,恕我直言,这是不可接受的,不推荐行为。

我能想到的最简单的解决方法是在N3文件的开头明确定义未加前缀属性的前缀,如下所示:

http://www.w3.org/RDF/Validator/run/1373638767868#lexicon

您还可以使用RDFLib以编程方式将前缀添加到图表中。

编辑:如另一个答案中所述,N3规范明确定义了如何处理未定义的空前缀,因此实际上这可能被视为RDFLib中的错误。

后续行动(2013-07-28):此问题已报告给RDFLib维护人员,已经过调查,可能是由一个错误造成的。有关详细信息,请参阅问题跟踪器:https://github.com/RDFLib/rdflib/issues/312