2010-10-06 2 views
13

Я хотел бы проанализировать очень большой (около 200 МБ) RDF-файл в python. Должен ли я использовать саксофон или какую-либо другую библиотеку? Я был бы признателен за очень простой код, который я могу использовать, скажем, для получения тега.Разбор большого RDF в Python

Заранее спасибо.

+0

Видео о том, как использовать SAX из Стэнфорда доступна здесь http://timmcnamara.co.nz/post/386007776/learning-about-xml-in-python-this-was-a-great –

+0

@ user201140 Что вы имеете в виду с 'retrieve the tag'? Обычно при разборе RDF вы должны искать тройки в нем. Мог ли я объяснить немного больше вашего случая использования RDF? –

ответ

16

Если вы ищете высокую скорость работы, то я бы рекомендовал использовать Raptor с Redland Python Bindings. Производительность Raptor, написанная на C, намного лучше, чем RDFLib. И вы можете использовать привязки python в случае, если вы не хотите иметь дело с C.

Еще один совет для улучшения производительности, забудьте о разборе RDF/XML, идите с другим вкусом RDF, например, Turtle или NTriples. Специально разбирающиеся ntriples намного быстрее, чем разбор RDF/XML. Это связано с тем, что синтаксис ntriples проще.

Вы можете превратить ваш RDF/XML в ntriples с использованием рэпера, инструмента, который поставляется с хищником:

rapper -i rdfxml -o ntriples YOUR_FILE.rdf > YOUR_FILE.ntriples 

Файл ntriples будет содержать тройки, как:

<s1> <p> <o> . 
<s2> <p2> "literal" . 

и парсеры, как правило, очень эффективная обработка этой структуры. Более того, разумная память более эффективна, чем RDF/XML, поскольку, как вы видите, эта структура данных меньше.

Код ниже приведен простой пример использования питона привязок Redland:

import RDF 
parser=RDF.Parser(name="ntriples") #as name for parser you can use ntriples, turtle, rdfxml, ... 
model=RDF.Model() 
stream=parser.parse_into_model(model,"file://file_path","http://your_base_uri.org") 
for triple in model: 
    print triple.subject, triple.predicate, triple.object 

Базовый URI является префиксом URI в случае, если использовать относительные URI, в документе RDF. Вы можете проверить документацию о API-интерфейсах Python Redland bindings в here

Если вам не все равно о производительности, то используйте RDFLib, он прост и прост в использовании.

+0

Я просто добавил пример кода, чтобы завершить свой ответ. –

+0

Сколько стоит «путь лучше»? – Buttons840

+2

столько, что не стоит его измерять. –

1

Не уверен, что наилучшим решением является sax, но IBM, похоже, считает, что это работает для высокопроизводительного анализа XML с помощью Python: http://www.ibm.com/developerworks/xml/library/x-hiperfparse/. Их пример RDF затмевает ваш размер (200 МБ против 1,9 ГБ), поэтому их решение должно работать на вас.

Примеры этой статьи начинаются довольно просто и быстро поднимаются.

2

По моему опыту, SAX отлично подходит для работы, но это боль, чтобы писать. Если у меня возникают проблемы, я стараюсь избегать их программирования.

«Очень большой» зависит от ОЗУ машины. Предполагая, что ваш компьютер имеет память более 1 ГБ, lxml, pyxml или какая-либо другая библиотека e будет отлично подходит для файлов 200 МБ.

1

Для обработки RDF в Python рассмотрите возможность использования библиотеки RDF, такой как RDFLib. Если вам также нужен трипестор, доступны и более тяжелые решения, но здесь может не понадобиться (PySesame, neo4jrdf с neo4jpy).

Прежде чем писать свой собственный SAX-анализатор для RDF, проверить rdfxml.py:

import rdfxml 
data = open('data.rdf', 'r').read() 
rdfxml.parseRDF(data) 
+0

Как импортировать rdfxml? он говорит, что переименовать ссылку –

8

Во-вторых, предлагаю попробовать rdflib.Это приятное и быстрое прототипирование, а бэкэнд-магазин BerkeleyDB очень хорошо масштабируется в миллионы троек, если вы не хотите загружать весь график в память.

import rdflib 

graph = rdflib.Graph("Sleepycat") 
graph.open("store", create=True) 
graph.parse("big.rdf") 

# print out all the triples in the graph 
for subject, predicate, object in graph: 
    print subject, predicate, object 
Смежные вопросы