如何从N-Triples格式的RDF文件中提取主题,谓词,对象并保存在CSV文件中?
答案 0 :(得分:0)
一个简单的转换就是在你的N-Triples文件上进行全局搜索和替换,在正确的位置引入逗号,并删除每行末尾的句号。
但是,这有几个问题:RDF值可能包含逗号,Literal值可以附加数据类型(^^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。如上所述:选择是无止境的。