Java 将RDF.ttl文件合并到一个文件数据库中-过滤并只保留所需的数据/三元组
我需要将1000+个.ttl文件合并到一个文件数据库中。如何通过过滤源文件中的数据合并它们,并仅保留目标文件中所需的数据Java 将RDF.ttl文件合并到一个文件数据库中-过滤并只保留所需的数据/三元组,java,rdf,jena,ttl,rdf4j,Java,Rdf,Jena,Ttl,Rdf4j,我需要将1000+个.ttl文件合并到一个文件数据库中。如何通过过滤源文件中的数据合并它们,并仅保留目标文件中所需的数据 谢谢有很多选择,但最简单的方法可能是使用Turtle解析器读取所有文件,并让该解析器将其输出传递给处理程序,处理程序进行过滤,然后再将数据传递给Turtle编写器 类似的东西可能会起作用(使用RDF4J): 或者,只需将所有文件加载到RDF存储库中,然后使用SPARQL查询将数据取出并保存到输出文件中,或者如果愿意的话:在将整个存储库导出到文件之前,使用SPARQL更新删除不
谢谢有很多选择,但最简单的方法可能是使用Turtle解析器读取所有文件,并让该解析器将其输出传递给处理程序,处理程序进行过滤,然后再将数据传递给Turtle编写器 类似的东西可能会起作用(使用RDF4J): 或者,只需将所有文件加载到RDF存储库中,然后使用SPARQL查询将数据取出并保存到输出文件中,或者如果愿意的话:在将整个存储库导出到文件之前,使用SPARQL更新删除不需要的数据 大致如下(同样使用RDF4J):
根据数据量/文件大小,您可能需要稍微扩展此基本设置(例如,使用事务,而不仅仅是让连接自动提交)。但希望你能大致了解情况 我刚才才注意到这个问题加上了“jena”,抱歉。我可以合理地确定,使用Jena而不是RDF4J也可以实现上述方法。更具体地说,问题是:我需要合并此数据库中的所有文件.ttl,只保留类F22和F28。因此,在最后,我将有一个文件.ttl,其中只包含所提到的类-没有其他信息:我如何才能做到这一点?对我来说,最终的结果很重要——通过Jena或RDF4J对我来说并不重要。我更喜欢最简单的变体。@Aram我认为使用上面提到的方法之一可能是可行的。你应该编辑你的原始问题,以澄清你面临的具体问题以及你的困境。看一看,它提供了关于如何编写一个很有可能得到有用答案的问题的有用提示。@Aram问题是,“只保留F22和F28类”是什么意思。-RDF由三元组组成,因此,还不清楚您希望在合并的数据集中包含哪些三元组…我需要创建一个文件数据库,合并来自不同文件的数据,只保留我需要的数据/三元组。考虑到我提到的数据库,我需要以下数据/三元组合并到一个文件中:EFRBRO:F28\u表达式\u创建ecrm:P9\u由ecrm:E7\u活动组成ecrm:P14\u由ecrm:E21\u人员执行ecrm:P131\u由mus:U31\u确定功能EFRBRO:F11\u法人。我的问题是如何构造一个查询,该查询将所有.ttl文件合并到一个.ttl文件中,并且只保留所提到的数据/三元组。由于RDF数据集是一组三元组,因此无法回答“合并特定类”这一短语,因此您首先必须定义要在合并的数据集中保留哪些三元组。不要用“相关”来回答——这也不是一个精确的答案。您必须尽可能具体,否则无法创建执行筛选的过程。
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();
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();
}