2013-09-20 1 views
2

Как я могу проанализировать файл RDF на 88 ГБ с помощью PHP?Parse 88 GB rdf с PHP

Этот RDF заполнен сущностями и фактами о каждом объекте.

Я пытаюсь выполнить итерацию через каждую сущность и проверить определенные факты для каждого объекта. Затем напишите эти факты в документе XML, который я создал ранее в скрипте.

Так как я перемещаю rdf, для каждой сущности я создаю элемент <card></card> и даю ему ребенка с именем <facts>. Я просматриваю все факты на сущности, и я беру те, которые мне нужны, и пишу их внутри и как дочерние элементы <fact></fact> внутри <facts></facts>.

Как я могу разобрать rdf, извлечь данные и записать их в XML?

+0

Мне было очень повезло с помощью [парсинга, управляемого событиями на основе expat] (http: // php.net/manual/en/ ref.xml.php) при обработке больших файлов. Там должно быть тривиально установить обработчики событий для вывода в целевые XML-данные. В зависимости от графика rdf может возникнуть смысл вдаваться в базу данных при чтении документа, а затем выбирать факты при записи. – Orangepill

+0

@Orangepill Я бы предпочел не использовать базу данных. Я знаю, ты сказал, что это тривиально, но мне кажется, что мне 5 лет, когда дело доходит до этого. Можете ли вы отправить ответ, объясняющий, как и затем я могу выбрать этот ответ. –

+0

Опубликовать фрагмент из вашего файла rdf. – Orangepill

ответ

1

Во-первых, используйте парсер RDF. Googling для парсера PHP RDF показал множество результатов; Я не использую PHP лично, но я уверен, что один из них выполнит разбор RDF. Но убедитесь, что это потоковый парсер, вы не собираетесь хранить 88G RDF в памяти на своей рабочей станции.

Во-вторых, вы сказали, что вам нужно «перебирать каждую сущность», что может быть сложно, если они не отсортированы по предмету в исходном файле, или синтаксический анализатор не сообщает об этом в том же порядке.

Предполагая, что это не проблема, вы можете просто сохранить тройки для каждого объекта в локальной структуре данных, а когда вы получите тройной предмет, отличный от тех, которые вы поставили в очередь локально, логику вам нужно и выписать XML. Можете убедиться, что вы не можете ставить в очередь столько операторов локально, что вы будете OOM.

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

Или вы можете поместить данные в базу данных RDF и написать против него запросы SPARQL, преобразуя результаты запроса в любой XML или что-то еще, что вам нужно.

+0

Как узнать, что такое парсер RDF Stream? Я нашел easyRDF, но это поток RDF-анализатор потока? Есть ли у вас примеры в PHP? –

+0

его называют * потоковым * парсером ... вам нужно что-то вроде SAX; все, что уведомит вас по три раза за раз. 88G будет в стадионе 100M троек, вы никогда не приблизитесь к тому, чтобы положить все это в память, если это не большая машина. и нет, как я уже сказал, я не работаю в PHP, поэтому у меня нет примеров. но google, кажется, включает некоторые возможные примеры. – Michael

+0

А, спасибо, что исправили меня. Да это правда. Ах хорошо. Прошу прощения за непонимание. Спасибо. –

1

Я думаю, лучшим вариантом будет:

  1. использовать какой-то внешний инструмент (?, Вероятно, что-то вроде rapper), чтобы преобразовать исходный файл из Turtle в n-triples формате
  2. итерация файла одна строка в то время, через fopen + fgets, так как n-тройки определяют строгий 1-оператор на однострочное ограничение, которое идеально подходит в этом случае