Как загрузить сжатый файл rdf в репозиторий rdf4j?

Я хочу загрузить RDF-файл, сжатый gzip, в файл org.eclipse.rdf4j.repository.Repository. Во время загрузки сообщения о состоянии должны быть зарегистрированы на консоли. Размер моего файла rdf составляет ~ 1 ГБ несжатых данных или ~ 50 МБ сжатых данных.


person jschnasse    schedule 20.03.2017    source источник


Ответы (2)


На самом деле репозиторий RDF4J уже автоматически правильно обрабатывает сжатый (zip/gzip) файл. Итак, вы можете просто сделать это:

   RepositoryConnection conn = ... ; // your store connection
   conn.add(new File("file.zip"), null, RDFFormat.NTRIPLES):

Если вы хотите включить отчетность, другой (несколько более простой) подход заключается в использовании класса org.eclipse.rdf4j.repository.util.RDFLoader в сочетании с RDFInserter:

RepositoryConnection conn = ... ; // your store connection
RDFInsert inserter = new RDFInserter(conn);
RDFLoader loader = new RDFLoader(conn.getParserConfig(), conn.getValueFactory());

loader.load(new File("file.zip"), RDFFormat.NTRIPLES, inserter));

RDFLoader позаботится о правильном распаковывании файла (zip или gzip).

Чтобы получить промежуточную отчетность, вы можете обернуть свой RDFInserter в свой собственный AbstractRDFHandler, который выполняет подсчет и отчетность (перед переходом к вставщику-оболочке).

person Jeen Broekstra    schedule 31.03.2017

Вариант 1

Следующий пример загрузит InputStream с данными, сжатыми gzip, в репозиторий rdf в памяти. Заархивированный формат напрямую поддерживается rdf4j. Каждая 100000-я инструкция будет выводиться на стандартный вывод с использованием RepositoryConnectionListenerAdapter.

import java.io.InputStream;

import org.eclipse.rdf4j.model.IRI;
import org.eclipse.rdf4j.model.Resource;
import org.eclipse.rdf4j.model.Value;
import org.eclipse.rdf4j.repository.Repository;
import org.eclipse.rdf4j.repository.RepositoryConnection;
import org.eclipse.rdf4j.repository.event.base.NotifyingRepositoryConnectionWrapper;
import org.eclipse.rdf4j.repository.event.base.RepositoryConnectionListenerAdapter;
import org.eclipse.rdf4j.repository.sail.SailRepository;
import org.eclipse.rdf4j.rio.RDFFormat;
import org.eclipse.rdf4j.sail.memory.MemoryStore;

public class MyTripleStore {

    Repository repo;

    /**
     * Creates an inmemory triple store
     * 
     */
    public MyTripleStore() {
        repo = new SailRepository(new MemoryStore());
        repo.initialize();
    }

    /**
     * @param in gzip compressed data on an inputstream
     * @param format the format of the streamed data
     */
    public void loadZippedFile(InputStream in, RDFFormat format) {
        System.out.println("Load zip file of format " + format);
        try (NotifyingRepositoryConnectionWrapper con =
                new NotifyingRepositoryConnectionWrapper(repo, repo.getConnection());) {
            RepositoryConnectionListenerAdapter myListener =
                    new RepositoryConnectionListenerAdapter() {
                        private long count = 0;
                        @Override
                        public void add(RepositoryConnection arg0, Resource arg1, IRI arg2, 
                                         Value arg3, Resource... arg4) {
                            count++;
                            if (count % 100000 == 0)
                                    System.out.println("Add statement number " + count + "\n" 
                                    + arg1+ " " + arg2 + " " + arg3);
                        }
                    };
            con.addRepositoryConnectionListener(myListener);
            con.add(in, "", format);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

Вариант 2

Этот вариант реализует AbstractRDFHandler для предоставления отчетов.

import java.io.InputStream;

import org.eclipse.rdf4j.model.Statement;
import org.eclipse.rdf4j.repository.Repository;
import org.eclipse.rdf4j.repository.RepositoryConnection;
import org.eclipse.rdf4j.repository.sail.SailRepository;
import org.eclipse.rdf4j.repository.util.RDFInserter;
import org.eclipse.rdf4j.repository.util.RDFLoader;
import org.eclipse.rdf4j.rio.RDFFormat;
import org.eclipse.rdf4j.rio.helpers.AbstractRDFHandler;
import org.eclipse.rdf4j.sail.memory.MemoryStore;

public class MyTripleStore {
    Repository repo;

    /**
      * Creates an inmemory triple store
      * 
      */
    public MyTripleStore() {
        repo = new SailRepository(new MemoryStore());
        repo.initialize();
   }

    /**
     * @param in gzip compressed data on an inputstream
     * @param format the format of the streamed data
     */
    public void loadZippedFile1(InputStream in, RDFFormat format) {
        try (RepositoryConnection con = repo.getConnection()) {
            MyRdfInserter inserter = new MyRdfInserter(con);
            RDFLoader loader =
                    new RDFLoader(con.getParserConfig(), con.getValueFactory());
            loader.load(in, "", RDFFormat.NTRIPLES, inserter);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    class MyRdfInserter extends AbstractRDFHandler {
        RDFInserter rdfInserter;
        int count = 0;

        public MyRdfInserter(RepositoryConnection con) {
            rdfInserter = new RDFInserter(con);
        }

        @Override
        public void handleStatement(Statement st) {
            count++;
            if (count % 100000 == 0)
                System.out.println("Add statement number " + count + "\n"
                        + st.getSubject().stringValue() + " "
                        + st.getPredicate().stringValue() + " "
                        + st.getObject().stringValue());
            rdfInserter.handleStatement(st);
        }
    }
}

Вот как вызвать код

MyTripleStore ts = new MyTripleStore();
ts.loadZippedFile(new FileInputStream("your-ntriples-zipped.gz"),
            RDFFormat.NTRIPLES);
person jschnasse    schedule 20.03.2017