【问题标题】:How to load a gzipped rdf file to rdf4j Repository?如何将压缩的 rdf 文件加载到 rdf4j 存储库?
【发布时间】:2017-05-19 16:58:50
【问题描述】:

我想将压缩后的 rdf 文件加载到 org.eclipse.rdf4j.repository.Repository 中。在上传期间,必须将状态消息记录到控制台。我的 rdf 文件的大小是 ~1GB 的未压缩或 ~50MB 的压缩数据。

【问题讨论】:

    标签: java rdf gzip rdf4j


    【解决方案1】:

    实际上,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 中,该 AbstractRDFHandler 会进行计数和报告(在传递给包装器插入器之前)。

    【讨论】:

      【解决方案2】:

      变体 1

      以下示例会将带有 gzip 压缩数据的 InputStream 加载到内存中的 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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多