将 RDF .ttl 文件合并到一个文件数据库中 - 过滤并仅保留 data/triples 需要的文件
Merge RDF .ttl files into one file database - filtering and keeping only the data/triples needed
我需要将 1000 多个 .ttl 文件合并到一个文件数据库中。如何通过过滤源文件中的数据来合并它们并仅保留目标文件中需要的数据?
谢谢
有很多选择,但最简单的方法可能是使用 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();
}
根据数据量/文件大小,您可能需要稍微扩展此基本设置(例如通过使用事务而不是仅仅让连接自动提交)。但希望您能了解总体思路。
我需要将 1000 多个 .ttl 文件合并到一个文件数据库中。如何通过过滤源文件中的数据来合并它们并仅保留目标文件中需要的数据?
谢谢
有很多选择,但最简单的方法可能是使用 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();
}
根据数据量/文件大小,您可能需要稍微扩展此基本设置(例如通过使用事务而不是仅仅让连接自动提交)。但希望您能了解总体思路。