从RDFn-Triples文件中提取主语、谓语和宾语

从RDFn-Triples文件中提取主语、谓语和宾语,rdf,export-to-csv,Rdf,Export To Csv,如何从N-Triples格式的RDF文件中提取主语、谓语、宾语并保存在CSV文件中 简单的转换只需对N-Triples文件进行全局搜索和替换,在正确的位置引入逗号,并删除每行末尾的句号 但是,这有几个问题:RDF值可能包含逗号,而文字值可以附加数据类型(^^xsd:int)或语言标记(@en)。根据您希望使用CSV的目的,您需要以某种方式转义此值 可能最简单的方法是将整个内容放在引号中,并转义所有出现的逗号和引号,因此: "a literal, like, string"@en 变成: "\

如何从N-Triples格式的RDF文件中提取主语、谓语、宾语并保存在CSV文件中

简单的转换只需对N-Triples文件进行全局搜索和替换,在正确的位置引入逗号,并删除每行末尾的句号

但是,这有几个问题:RDF值可能包含逗号,而文字值可以附加数据类型(
^^xsd:int
)或语言标记(
@en
)。根据您希望使用CSV的目的,您需要以某种方式转义此值

可能最简单的方法是将整个内容放在引号中,并转义所有出现的逗号和引号,因此:

"a literal, like, string"@en 
变成:

"\"a literal\, like\, string\"@en"
考虑到所有这些,您可以在文本编辑器中使用一些正则表达式魔术(这是一个很好的选择),也可以编写一个简单的程序来转换文件。例如,使用Java和,您可以使用以下内容转换文件:

FileInputStream ntriples=newfileinputstream(“…”);
模型rdf=Rio.parse(ntriples,“,RDFFormat.ntriples);
try(FileWriter csvWriter=newfilewriter(…)){
for(报表st:rdf){
write(convert(st.getSubject());
csvWriter.write(“,”);
write(convert(st.getPredicate());
csvWriter.write(“,”);
write(convert(st.getObject());
csvWriter.write(“\n”);
}
}
。。。如果
convert
方法发挥了必要的魔力,将
IRI
BNode
Literal
转换为一个充分引用和转义的字符串值,那么您应该能够根据我上面提到的内容自行解决这个问题。这种方法的另一个好处是,它不仅适用于N-Triples,而且适用于Rio拥有解析器的任何类型的RDF语法


您还可以尝试使用CSV解析/写入库,如opencsv或jackson dataformat CSV。正如所说:选择是无穷无尽的

这有点宽泛和模糊。你为什么需要这个?这种情况应该发生在什么编程语言/工具中?到目前为止,您尝试了什么?您在哪里遇到了困难?实际上,我想从任何格式的RDF文件中将主语、谓语、宾语提取到一个三元组表的三列中。例如,主语、谓语和宾语的列值将分别为ID1、Type和Book。请您的问题反映这一点:使您的问题尽可能具体和具体。另外,不要忘了包括到目前为止您已经尝试过的内容以及应该(最好)使用的语言。最后:看看如何提出好问题的技巧——现在和将来使用这些技巧将提高你获得好答案的机会。谢谢你的建议。谢谢Jeen。我会尽力让您知道。我在编写语句“Model rdf=Rio.parse(ntriples,RDFFormat.ntriples);”时遇到了一个错误。Rio类型中的方法parse(InputStream、String、RDFFormat、Resource…)不适用于参数(File、RDFFormat)啊,这是我代码示例中的一个小错误。现在修好了。作为将来的参考,您可以在找到RDF4J文档(包括API Javadoc和示例)。现在我得到:类型Rio中的方法parse(InputStream、String、RDFFormat、Resource…)不适用于参数(File、String、RDFFormat)。您需要将该文件更改为FileInputStream。