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

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

15 голосов
/ 06 октября 2010

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

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

Ответы [ 5 ]

18 голосов
/ 07 октября 2010

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

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

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

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

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

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

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

Приведенный ниже код является простым примером использования привязок redland 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 , она проста и удобна в использовании.

8 голосов
/ 15 октября 2010

Я предпочитаю попробовать 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
2 голосов
/ 06 октября 2010

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

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

1 голос
/ 06 октября 2010

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

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

import rdfxml
data = open('data.rdf', 'r').read()
rdfxml.parseRDF(data)
1 голос
/ 06 октября 2010

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

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

...