Разбор большого 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)