简单的转换只需对您的 N-Triples 文件进行全局搜索和替换,在正确的位置引入逗号,并删除每行末尾的句号。
但是,这样做有几个问题:RDF 值可能包含逗号,而文字值可以附加数据类型 (^^xsd:int) 或语言标记 (@en)。根据您要使用 CSV 的目的,您需要以某种方式转义该值。
可能最简单的方法是将整个内容放在引号中并转义所有出现的逗号和引号,因此:
"a literal, like, string"@en
变成:
"\"a literal\, like\, string\"@en"
鉴于这一切,您可以在文本编辑器中使用一些正则表达式魔法(vim 是一个不错的选择),或者您可以编写一个简单的程序来转换您的文件。例如,使用 Java 和 RDF4J,您可以使用以下方式转换文件:
FileInputStream ntriples = new FileInputStream("...");
Model rdf = Rio.parse(ntriples, "", RDFFormat.NTRIPLES);
try (FileWriter csvWriter = new FileWriter(...)) {
for (Statement st: rdf) {
csvWriter.write(convert(st.getSubject()));
csvWriter.write(", ");
csvWriter.write(convert(st.getPredicate()));
csvWriter.write(", ");
csvWriter.write(convert(st.getObject()));
csvWriter.write("\n");
}
}
...convert 方法执行必要的魔法将IRI、BNode 或Literal 转换为充分引用和转义的字符串值 - 你应该能够解决这个问题你自己给出了我上面提到的。这种方法的另一个好处是它不仅适用于 N-Triples,而且适用于 Rio 具有解析器的任何类型的 RDF 语法。
您也可以尝试使用 CSV 解析/写入库,例如 opencsv 或 jackson-dataformat-csv。如前所述:选择是无止境的。