Существует несколько опций, но, возможно, самый простой способ - это использовать синтаксический анализатор 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();
}
В зависимости от объема данных / размера ваших файлов вам может потребоваться немного расширить эту базовую настройку (например, используя транзакции вместо того, чтобы просто разрешить автоматическую фиксацию соединения). Надеюсь, вы поняли основную идею.