我正在编写代码,收集有关本体的一些统计信息。作为输入我有一个文件夹,一些是RDF / XML,一些是乌龟或NT。 我的问题是,当我尝试使用错误的格式解析文件时,下次即使我用正确的格式解析它也会失败。 这里的测试文件是乌龟格式。如果先用乌龟格式解析它一切都很好。但如果我首先用错误的格式解析它1.错误是可以理解的(文件:///测试:1:0:格式不正确(无效令牌)),但第二个错误是( 未知名称空间前缀:owl )。就像我说的那样,当我第一次用正确的解析时,我没有得到命名空间错误。
请帮助,2天后,我变得绝望了。
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
答案 0 :(得分:0)
问题是g.parse
首先从data
的文件输入流中读取某些部分,然后才发现它不是xml。第二次调用(使用乌龟格式)然后在前一次尝试停止的部分之后继续从输入流中读取。第一个解析器读取的部分将丢失到第一个解析器。
如果您的测试文件很小,那么xml-parser可能已经读完了所有内容,只剩下一个“空”。看起来乌龟解析器并没有抱怨 - 它只是一无所获。只有下一个语句中的查询未能在其中找到任何类似owl的内容,因为图形为空。 (我不得不承认我不能复制这部分,乌龟解析器在我的情况下抱怨,但也许我有rdflib
的不同版本
要修复它,请尝试重新打开该文件;重新组织代码,以便每次拨打data = open("test", "r")
时都有result = g.parse(file=data, format="(some format)")
,或者在data.seek(0)
子句中调用except:
,例如:
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)