2017-03-20 14 views

答えて

2

バリアント1

次のサンプルは、メモリ内のRDFリポジトリにgzip圧縮されたデータとInputStreamをロードします。 zip形式はrdf4jによって直接サポートされています。 すべての100000番目のステートメントはRepositoryConnectionListenerAdapterを使用してstdoutに出力されます。

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); 
     } 
    } 
} 

はすでに、正しくファイルを実際にRDF4Jリポジトリが自動的に圧縮(ZIP/GZIP)を処理するコード

MyTripleStore ts = new MyTripleStore(); 
ts.loadZippedFile(new FileInputStream("your-ntriples-zipped.gz"), 
      RDFFormat.NTRIPLES); 
2

を呼び出す方法、です。だから、あなたは、単にこれを行うことができます:あなたが報告を含めたい場合は

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

を、(やや単純)異なるアプローチがRDFInserterとの組み合わせでorg.eclipse.rdf4j.repository.util.RDFLoaderクラスを使用することです:

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)ファイルを適切に解凍してください。

中間報告を取得するには、ラップインサータに渡す前に、カウントとレポートを行う独自のカスタムAbstractRDFHandlerでRDFInserterをラップすることができます。