Объединение файлов RDF .ttl в одну файловую базу данных - фильтрация и хранение только необходимых данных / троек - PullRequest
0 голосов
/ 15 марта 2019

Мне нужно объединить 1000+ .ttl файлов в одну файловую базу данных. Как я могу объединить их с фильтрацией данных в исходных файлах и сохранить только данные, необходимые в целевом файле?

Спасибо

1 Ответ

1 голос
/ 15 марта 2019

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

Что-то вроде этого, вероятно, будет работать (с использованием RDF4J):

  RDFWriter writer = org.eclipse.rdf4j.rio.Rio.createWriter(RDFFormat.TURTLE, outFile);

  writer.startRDF();
  for (File file : // loop over your 100+ input files) {
      Model data = Rio.parse(new FileInputStream(file), "", RDFFormat.TURTLE);
      for (Statement st: data) {
         if (// you want to keep this statement) {
              writer.handleStatement(st);
         }
      }
  }
  writer.endRDF(); 

Либо просто загрузите все файлы в RDF-репозиторий и используйте SPARQL-запросы, чтобы вывести данные и сохранить их в выходном файле, или, если вы предпочитаете: использовать обновления SPARQL для удалить данные, которые вы не хочу, прежде чем экспортировать весь репозиторий в файл.

Что-то в этом роде (снова с использованием RDF4J):

 Repository rep = ... // your RDF repository, e.g. an in-memory store or native RDF database

 try (RepositoryConnection conn = rep.getConnection()) {

    // load all files into the database
    for (File file: // loop over input files) {
        conn.add(file, "", RDFFormat.TURTLE);
    }

    // do a sparql update to remove all instances of ex:Foo
    conn.prepareUpdate("DELETE WHERE { ?s a ex:Foo; ?p ?o }").execute();

    // export to file
    con.export(Rio.createWriter(RDFFormat.TURTLE, outFile));
 } finally {
    rep.shutDown(); 
 } 

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

...