Разбор большого RDF в Python

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

Спасибо заранее.

Ответы

Ответ 1

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

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

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

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

Файл ntriples будет содержать три раза, например:

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

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

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

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 в здесь

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

Ответ 2

Во-вторых, предлагаю попробовать 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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

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

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