Как я начал работать с дампом Freebase используя запросы SPARQL

Здесь я расскажу, как я начал использовать дамп Freebase при помощи Apache Jena под Xubuntu.

Freebase data dump

Сначала качаем дамп отсюда https://developers.google.com/freebase/data весит примерно 22 GB в запакованном виде.

Т.к. я планирую использовать не весь дамп, а лишь данные расположенные в «/location» и «/measurement_unit», мне нужно как-то достать подмножество.

В поисках как это сделать я набрёл на http://stackoverflow.com/a/20448454/285571

Чтобы достать данные я выполнил следующую команду:

zgrep '\s<http://rdf\.freebase\.com/ns/location.' freebase-rdf-2014-08-10-00-00.gz | gzip > freebase_location.gz

После чего получил на выходе freebase_location.gz с необходимым набором внутри, однако в этом наборе отсутствовали имена местоположений.

Для того чтобы достать набор с именами(будут включены имена не только местоположений), необходимо выполнить следующую команду:

zgrep '\s<http://rdf\.freebase\.com/ns/type\.object' freebase-rdf-2014-08-10-00-00.gz | gzip > freebase_type_object.gz

Данные из «/measurement_unit» достаются следующей командой:

zgrep '\s<http://rdf\.freebase\.com/ns/measurement_unit.' freebase-rdf-2014-08-10-00-00.gz | gzip > freebase_measurement_unit.gz

Вот немного статистики о процессе экстракта записей на моём компьютере:

Extracting complete.
Extraction time: 11229009 ms
Type object records count: 389577890
Location records count: 23117776
Measurement unit records count: 24997666

Apache Jena

Apache Jena позволяет организовать работу с дампом конвертируя его в специальную модель. После чего, используя загруженную модель, можно применять SPARQL запросы.

Я использовал Apache Jena собранную из исходников. Качаем исходники из svn репозитория https://svn.apache.org/repos/asf/jena/
Затем собираем при помощи maven:

mvn clean install -DskipTests

Затем идём в папку {sources root}/apache-jena/target и забираем собранный архив apache-jena-2.12.0-SNAPSHOT.zip. После чего, разархивируем содержимое архива в отдельную папку.

После этого добавляем переменную JENA_HOME в /etc/environment.
Данная переменная будет хранить в себе путь к папке с Apache Jena, у меня она выглядит так:

JENA_HOME=/home/hronom/Apps/apache-jena

Создание модели для Apache Jena из дампа Freebase

После того как мы скачали дамп и подготовили фрэймворк Apache Jena можно приступить к созданию модели.

В поставке Apache Jena идут две консольные утилиты tdbloader и tdbloader2. Разница между ними в том, что первая(tdbloader) позволяет создавать и обновлять модель, но делает это медленно, вторая(tdbloader2) позволяет только создавать модель но делает это быстро под Linux и Mac OS X.

Итак чтобы начать создание, необходимо перейти в корневую папку Apache Jena и выполнить в консоле следующую команду:

bin/tdbloader2 --loc {папка где будет создана модель} {файл дампа(воспринимается даже архив с файлом)} ... {файл дампа}

Моя команда выглядела так:

bin/tdbloader2 --loc /home/hronom/Download/Freebase_dumps/freebase_model /home/hronom/Download/Freebase_dumps/freebase_type_object.gz /home/hronom/Download/Freebase_dumps/freebase_location.gz /home/hronom/Download/Freebase_dumps/freebase_measurement_unit.gz

Результаты создания модели:

Total: 437,693,332 tuples : 108,069.82 seconds : 4,050.10 tuples/sec

Пример использования SPARQL и модели Apache Jena

Загрузка созданной модели:

Dataset dataset;
dataset = TDBFactory.createDataset( "/home/hronom/Download/Freebase_dumps/freebase_model" );

Model tdb;
tdb = dataset.getDefaultModel();

FileManager fileManager;
fileManager = FileManager.get();
fileManager.setModelCaching( true );

Выполнение SPARQL запроса:

StringBuilder sb;
sb = new StringBuilder();

sb.append( "PREFIX key: <http://rdf.freebase.com/key/>" );
sb.append( "PREFIX ns: <http://rdf.freebase.com/ns/>" );
sb.append( "PREFIX owl: <http://www.w3.org/2002/07/owl#>" );
sb.append( "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>" );
sb.append( "PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>" );

sb.append( "SELECT * WHERE { ns:m.07t21 ?predicate ?object . }" );

Query query;
query = QueryFactory.create( sb.toString() );

QueryExecution qexec;
qexec = QueryExecutionFactory.create( query, tdb );

try
{
  ResultSet results;
  results = qexec.execSelect();

  ResultSetFormatter.out( System.out, results, query );
}
finally
{
  qexec.close();
}

Результаты данного запроса будут выведены в консоль. Данный запрос выводит все записи касающиеся Украины.

Ссылки

Туториал по SPARQL http://jena.apache.org/tutorials/sparql.html
Ещё один туториал по SPARQL https://code.google.com/p/tdwg-rdf/wiki/Beginners6SPARQL#6.3._Loading_metadata_into_a_private_triple_store_for_querying

Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s