2015-03-01 4 views
0

Я пишу код, который собирает некоторые статистические данные о онтологиях. в качестве ввода у меня есть папка с файлами, некоторые из них - RDF/XML, некоторые - черепаха или nt. Моя проблема в том, что когда я пытаюсь проанализировать файл с использованием неправильного формата, в следующий раз, даже если я проанализирую его с правильным форматом, он терпит неудачу. Здесь тестовый файл - это черепаховый формат. Если сначала разобрать его с черепаховым форматом, все в порядке. но если я сначала разобрал его с неправильным форматом 1. ошибка понятна (файл: /// test: 1: 0: неверно сформирован (недействительный токен)), но ошибка для второго равна (Неизвестный префикс пространства имен: owl). Как я уже сказал, когда я сначала разбираюсь с правильным, я не получаю ошибку пространства имен.Ошибочный анализ RDF с использованием RDFlib в python

Просьба помочь, после 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

Проблема заключается в том, что g.parse читает какую-то часть из входного файла потока data первого, только чтобы выяснить потом, что это не XML. Второй вызов (с форматом черепахи) затем продолжает читать из входного потока после части, где была остановлена ​​предыдущая попытка. Часть, прочитанная первым синтаксическим анализатором, теряется на второй.

Если ваш тестовый файл невелик, синтаксический анализатор xml мог бы прочитать его все, оставив «пустой» отдых. Кажется, парсер-парсер не жаловался - он просто ничего не читал. Только запрос в следующем утверждении не смог найти ничего похожего на него, поскольку граф пуст. (Я должен признать, что я не могу воспроизвести эту часть, парсератор-парсер жалуется на мое дело, но, возможно, у меня другая версия 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) 
+0

Спасибо, это работает отлично! На самом деле для меня было достаточно добавить 'data.seek (0)' Если кто-то хочет воспроизвести мою ошибку, я использовал это как тестовый файл [link] (http://www.w3.org/2000/01/rdf -schema). И моя версия RDFlib - 4.2.0. – Andrejs