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