将巨大的链接数据转储(RDF/XML、JSON-LD、TTL)转换为 TSV/CSV

问题描述 投票:0回答:4

链接数据集合通常以 RDF/XML、JSON-LD 或 TTL 格式给出。相对较大的数据转储似乎相当难以处理。将 RDF/XML 文件转换为链接数据三元组的 TSV 的好方法是什么?

我已经尝试过 OpenRefine,它应该可以处理这个问题,但是 10GB 的文件(例如来自德国国家图书馆的个人权限信息)在具有良好处理能力的笔记本电脑上处理起来太困难了。

寻找软件推荐或一些例如用于转换它的 Python/R 代码。谢谢!

csv rdf json-ld converters linked-data
4个回答
4
投票

尝试这些:

Lobid GND API

http://lobid.org/gnd/api

支持 OpenRefine(参见blogpost)和各种其他查询。数据以 JSON-LD 形式托管在 Elasticsearch 集群中(请参阅上下文)。该服务提供丰富的 HTTP-API。

使用三重存储

将数据加载到您选择的三重存储中,例如rdf4j。许多三元组存储提供某种 CSV 序列化。与 SPARQL 结合使用,这可能值得一试。

加德满都

http://librecat.org/Catmandu/

基于 Perl 的强大数据工具包,附带一组有用的即用型转换管道。

元制造

https://github.com/metafacture/metafcture-core/wiki

用于用 Java 设计转换管道的 Java 工具包。


1
投票

您可以使用本体编辑器Protege:在那里,您可以根据需要对数据进行SPARQL并将其保存为TSV文件。然而,提前配置软件以使数据量易于管理可能很重要。


0
投票

Canonical N-Triples 可能已经是您所追求的,因为它本质上是 RDF 的基于空格分隔的行格式(不过您不能天真地在空间上分割,因为您需要处理文字,请参见下文) 。在您引用的数据集中,许多文件都以 N-三元组形式提供。如果没有,请使用像 rapper 这样的解析工具来转换为 N-Triples,例如。

rapper -i turtle -o ntriples rdf-file-in-turtle-format.ttl > rdf-file-in-ntriples-format.nt

通常,n 三元组导出器不会利用规范中允许的有关空白的所有内容并使用规范的 n 三元组。因此,给定规范 n 三元组文件中的一行,例如:

<http://example.org/s> <http://example.org/p> "a literal" .

您可以通过用逗号替换一行的第一个和第二个空格字符并删除最后一个空格字符之后(包括最后一个空格字符)的所有内容来获取 CSV。由于文字是唯一允许使用空格的 RDF 术语,并且文字仅允许出现在对象位置,因此这应该适用于规范的 n 三元组。

您可以通过用制表符替换所述空格字符来获取 TSV。如果您也对最后一个空格字符执行此操作并且不删除点,则您将拥有一个既是有效的 n 三元组又是 TSV 文件的文件。如果您将这些位置作为分割位置,您可以使用规范的 n 三元组文件,而无需转换为 CSV/TSV。

请注意,您可能必须处理 RDF 术语中的逗号/制表符(例如通过转义),但该问题存在于 RDF 作为 CSV/TSV 的任何解决方案中。


0
投票

我遇到了同样的问题,并且上述工具都无法解决此问题。我的解决方案是使用 rdflib 打开 DRF 文件并将其保存为 ntriples 文件。

from rdflib.graph import Graph
rdf_graph = Graph()
rdf_graph.parse(<graph_path>, format=<file_format>)
rdf_graph.serialize(destination=<new_file_name>, format="ntriples")

接下来,您可以将其转换为 TSV 文件。

import csv
import shlex

new_file = open(<tsv_file_path>, "w", encoding='utf8', newline='')
tsv_writer = csv.writer(new_file, delimiter='\t', lineterminator='\n')
old_file = open(<ntriples_file_path>, "r")
for line in old_file:
   line=line[:-2] # remove '.' and '\n' at the end of each line
   line_separated = shlex.split(line)
   tsv_writer.writerow(line_separated)
new_file.close()
© www.soinside.com 2019 - 2024. All rights reserved.