【问题标题】:Extract subject, predicate, object from RDF N-Triples file从 RDF N-Triples 文件中提取主语、谓语、宾语
【发布时间】:2016-10-26 07:03:56
【问题描述】:

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

【问题讨论】:

  • 这个有点宽泛和模糊。你为什么需要这个?这应该用什么编程语言/工具发生?到目前为止,您尝试过什么,您在哪里卡住了?
  • 实际上,我想将任何格式的RDF文件中的主语、谓语、宾语提取到三元组表的三列中。例如,主语、谓语、宾语的列值将分别为 ID1、Type、Book。
  • 我明白了。请edit您的问题反映这一点:使您的问题尽可能具体和具体。也不要忘记包括您到目前为止尝试过的内容以及应该(最好)使用哪种语言。最后:查看How to Ask 以获取有关如何提出好问题的提示 - 现在和在未来会增加您获得好答案的机会。
  • 感谢您的建议。

标签: rdf export-to-csv


【解决方案1】:

简单的转换只需对您的 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 方法执行必要的魔法将IRIBNodeLiteral 转换为充分引用和转义的字符串值 - 你应该能够解决这个问题你自己给出了我上面提到的。这种方法的另一个好处是它不仅适用于 N-Triples,而且适用于 Rio 具有解析器的任何类型的 RDF 语法。

您也可以尝试使用 CSV 解析/写入库,例如 opencsv 或 jackson-dataformat-csv。如前所述:选择是无止境的。

【讨论】:

  • 谢谢吉恩。我会尽力让你知道。
  • 我在编写语句“Model rdf = Rio.parse(ntriples, RDFFormat.NTRIPLES);”时遇到错误。 Rio类型的parse(InputStream, String, RDFFormat, Resource...)方法不适用于参数(File, RDFFormat)
  • 啊,我的代码示例中的小错误。现在修好了。为了将来参考,您可以在docs.rdf4j.org 找到 RDF4J 文档(包括 API Javadoc 和示例)。
  • 现在我得到:Rio 类型的方法 parse(InputStream, String, RDFFormat, Resource...) 不适用于参数(文件、字符串、RDFFormat)。
  • 您需要将文件更改为 FileInputStream。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-04
  • 2021-09-25
  • 1970-01-01
  • 1970-01-01
  • 2010-11-22
  • 1970-01-01
相关资源
最近更新 更多