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

Error tolerant RDF parsing using RDFlib in python

我正在编写一个代码,用于收集一些关于本体的统计数据。作为输入,我有一个包含文件的文件夹,有些是 RDF/XML,有些是 turtle 或 nt。 我的问题是,当我尝试使用错误的格式解析文件时,下次即使我使用正确的格式解析它也会失败。 这里的测试文件是海龟格式。如果首先用 turtle 格式解析它,一切都很好。但是如果我首先用错误的格式解析它 1. 错误是可以理解的 (file:///test:1:0: not well-formed (invalid token)),但是错误第二个是(未知命名空间前缀: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先从data的文件输入流中读取了一部分,后来才发现不是xml。第二次调用(使用 turtle 格式)然后继续从上一次尝试停止的部分之后的输入流中读取。第一个解析器读取的部分丢失给第二个解析器。

如果您的测试文件很小,xml-解析器可能已经读取了所有文件,留下 "empty" 休息。海龟解析器似乎没有抱怨——它只是什么也没读到。只有下一条语句中的查询未能在其中找到任何类似 owl 的内容,因为图表是空的。 (我不得不承认我无法重现这部分,海龟解析器在我的情况下确实抱怨,但也许我有不同版本的 rdflib

要修复它,请尝试重新打开文件;要么重新组织代码,以便每次调用 result = g.parse(file=data, format="(some format)") 时都有一个 data = open("test", "r"),或者在 except: 子句中调用 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)