0

我正在编写一个代码,它收集一些关于本体的统计数据。作为输入,我有一个文件夹,其中包含一些文件是 RDF/XML,有些是海龟或 nt。我的问题是,当我尝试使用错误的格式解析文件时,下一次即使我使用正确的格式解析它也会失败。这里的测试文件是海龟格式。如果首先用海龟格式解析它,一切都很好。但是如果我首先用错误的格式解析它 1. 错误是可以理解的(file:///test:1:0: not well-formed (invalid token)),但第二个错误是(Unknown namespace prefix : 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
4

1 回答 1

0

问题是首先g.parse从文件输入流中读取了一些部分,data然后才发现它不是xml。然后第二次调用(使用海龟格式)在前一次尝试停止的部分之后继续从输入流中读取。第一个解析器读取的部分丢失给第二个解析器。

如果您的测试文件很小,则 xml 解析器可能已全部读取,留下“空”的剩余部分。似乎海龟解析器没有抱怨——它只是什么也没读。只有下一条语句中的查询未能在其中找到任何类似于 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)
于 2015-03-01T21:09:57.633 回答