python中使用RDFlib的容错RDF解析
我正在写一段代码,收集一些关于本体论的统计数据。作为输入,我有一个包含文件的文件夹,有些是RDF/XML,有些是turtle或nt。 我的问题是,当我试图用错误的格式解析一个文件时,下次即使我用正确的格式解析它也会失败。 这里的测试文件是海龟格式的。如果首先用海龟格式解析它,一切都很好。但是如果我首先用错误的格式1解析它。错误是可以理解的(file:///test:1:0: 格式不正确(无效令牌)),但第二个错误为(未知命名空间前缀:owl)。就像我第一次用正确的语法解析时说的,我没有得到名称空间错误 求求你,两天后,我绝望了python中使用RDFlib的容错RDF解析,python,parsing,namespaces,rdflib,Python,Parsing,Namespaces,Rdflib,我正在写一段代码,收集一些关于本体论的统计数据。作为输入,我有一个包含文件的文件夹,有些是RDF/XML,有些是turtle或nt。 我的问题是,当我试图用错误的格式解析一个文件时,下次即使我用正确的格式解析它也会失败。 这里的测试文件是海龟格式的。如果首先用海龟格式解析它,一切都很好。但是如果我首先用错误的格式1解析它。错误是可以理解的(file:///test:1:0: 格式不正确(无效令牌)),但第二个错误为(未知命名空间前缀:owl)。就像我第一次用正确的语法解析时说的,我没有得到名称空
query = 'SELECT DISTINCT ?s ?o WHERE { ?s ?p owl:Ontology . ?s rdfs:comment ?o}'
data = open("test", "r")
g = rdflib.Graph("IOMemory")
try:
result = g.parse(file=data,format="xml")
relations = g.query(query)
print(( " graph has %s statements." % len(g)))
except:
print "bad1"
e = sys.exc_info()[1]
print e
try:
result = g.parse(file=data,format="turtle")
relations = g.query(query)
print(( " graph has %s statements." % len(g)))
except :
print "bad2"
e = sys.exc_info()[1]
print e
问题是
g.parse
首先从数据的文件输入流中读取一些部分,然后才发现它不是xml。第二个调用(使用海龟格式)在上一次尝试停止的部分之后继续从输入流读取。第一个解析器读取的部分丢失给第二个解析器
如果您的测试文件很小,xml解析器可能已经全部读取了它,剩下的部分是“空的”。海龟解析器似乎没有抱怨,只是什么也没读。只有下一条语句中的查询未能在其中找到任何类似于owl的内容,因为图是空的。(我必须承认我不能复制这一部分,在我的情况下,海龟解析器确实会抱怨,但也许我有一个不同版本的rdflib
)
要修复它,请尝试重新打开该文件;重新组织代码,以便每次调用result=g.parse(file=data,format=“(some format)”)
时都有一个data=open(“test”,“r”)
,或者在中调用data.seek(0)
,例如:
for format in 'xml','turtle':
try:
print 'reading', format
result = g.parse(data, format=format)
print 'success'
break
except Exception:
print 'failed'
data.seek(0)
谢谢,这很有效!实际上,对我来说,添加数据就足够了。seek(0)
如果有人想重现我的错误,我就用它作为测试文件。我的RDFlib版本是4.2.0。