所以我有一个看起来像这样的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..."
这是我尝试序列化的文件或我用来执行此操作的代码的问题吗?
答案 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