在python中使用RDFlib进行容错RDF解析

时间:2015-03-01 16:47:50

标签: python parsing namespaces rdflib

我正在编写代码,收集有关本体的一些统计信息。作为输入我有一个文件夹,一些是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

1 个答案:

答案 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)