【译】Understanding Linked Data Formats

本文探索了RDF的四种常见格式:N-Triples、Turtle、JSON-LD和RDF/XML。介绍了链接数据以三元组存储形成有向知识图,阐述了各格式特点,还分析了其优缺点及适用场景,如旧系统用RDF/XML,需人类可读或考虑带宽用Turtle等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在本文中,我们将通过检查其四种最常见的格式来探索RDF的外观:N-Triples,Turtle,JSON-LD和RDF / XML。

编辑(04/05/2019):我将本文扩展为包含JSON-LD并添加了下面的内容部分。 我原本没有包含JSON-LD,因为我从未真正使用它,但同意需要添加它才能完整。

内容

介绍
格式看起来像什么?
哪种格式适合我?
结论
TL; DR
附录

介绍

很简单,链接数据存储为由主题,谓词和对象组成的三元组。 这些三元组将实体连接到其他实体或文字(稍后将详细介绍)以创建有向知识图:

http://www27.cs.kobe-u.ac.jp/achieve/data/pdf/1285.pdf

在这个例子中我们可以看到东京位于日本国家,面积为2188平方公里。 实体(东京和日本)和谓词各自具有URI以便以机器可读格式标识它们。 然而,矩形中的区域不是所谓的文字(常数值),我们将在后面详细讨论。

格式看起来像什么?

RDF通常以四种格式之一存储:N-Triples(.nt),Turtle(.ttl),JSON-LD(.json)或RDF / XML(.rdf)。 您使用的主要是优先级,因为所有这些格式都受到主RDF库和三重存储的支持。 然而,确实存在优点和缺点,我将在本文后面重点介绍。

的N-Triples

将RDF存储和读取为N-Triples非常简单,因为.nt文件的每一行都是一个三元组(<subject> <predicate> <object>),它们共同形成一个有向知识图:

与本文开头的小示例类似,圆圈表示实体,矩形表示文字,箭头表示谓词。 这个知识图与11个连接以N-Triples格式表示如下:

注意:灰色数字仅用于说明目的: NOT N-Triples

注意:每个示例的代码块都可以在附录中找到

这里有11个三元组,包含从DBpedia中提取的Bob Marley和Jamaica的信息 - 维基百科的链接数据表示。 为了便于说明,我将彩色实体设置为红色,谓词为紫色,文字为绿色和文字标签以及数据类型为橙色。

我们可以从第一个三元组看到Bob Marley是Person类型,我们使用foaf(朋友的朋友)本体作为这种类型的URI。 使用像foaf这样的标准本体可以轻松地与我在上一篇文章中讨论过的其他链接数据集成。 第二个和第三个三元组有标准谓词,但有字符串作为主题,称为文字。 在DBpedia中,URI是人类可读的,但情况并非总是如此,因此人类可读标签附加到实体。 这两个文字在@符号后附加了语言标签。 在这两个例子中,“Bob Marley”在英语和法语中是相同的,而你可以看到,如果你看第八个三联,牙买加的意大利语就不同了。 这些字符串文字通常被称为“ 普通文字 ”而不是“类型文字”,我将在下面解释。

本例中的第五个三联将Bob Marley的实体与其出生地牙买加的实体联系起来。 从后面的三元组中可以看出,对象可以是主体(甚至谓词可以是主体或对象)来创建所需的知识图。 您会注意到第九个和第十个三元组中的类型文字是数字并且具有附加类型(因此名称为文字),在本例中为float。 这通常用于确保数字有效,例如年龄通常是整数。 最后,在第十一届三联中,我们可以看到foaf本体再次用于将牙买加实体与其主页URL(URI的子集)连接起来。

读取(作为人类)Turtle格式的RDF要容易得多,因为您可以在.ttl文件的开头定义前缀,缩短每个三元组。 乌龟的另一个特点是具有相同主题的多个三元组被分组为块(例如,Bob Marley的URI不会被重复列出),例如:

这代表与上面的N-Triples完全相同的知识图。 在顶部,定义了前缀,以便URI的长重复部分可以用它们的简短形式写出。 例如线

  @prefix foaf:< http://xmlns.com/foaf/0.1/ >。 

让字符串foaf代表http://xmlns.com/foaf/0.1/ 。 这允许主题<http://xmlns.com/foaf/0.1/Person>缩短为foaf:Person

一个独特的缩写是谓词<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ,它很常见,只用字母a 。 因此,N-Triple

  < http://dbpedia.org/resource/Bob_Marley > < http://www.w3.org/1999/02/22-rdf-syntax-ns#type > < http://xmlns.com/foaf/0.1 /人 >。 

可以缩短龟到

  dbr:Bob_Marley a foaf:人 

这更清楚了。

您可以看到有关Bob Marley和Jamaica的数据被分成不同的块。 这种分组以及定义的前缀使得Turtle格式比N-Triples更容易理解。 如果您注意到,主题的相关信息用分号分隔,并以完整句点和换行符结束,以表示新主题。

JSON-LD

接下来我们有JSON-LD这是一种较旧的格式,因为它将链接数据适合现有格式--JSON。 自创建以来,创建了更具人性化的Turtle,但我将在本文后面更详细地比较它们。

我再次用颜色协调这个代表相同知识图的例子:

为清楚起见,我将JSON对象称为“块”,以避免JSON对象与链接数据对象(主题,谓词,对象)之间的混淆。

每个实体(红色)都在顶层声明。 这就是为什么Bob Marley和Jamaica块中的实体再次在.json文件的末尾声明。

在顶级声明中,实体使用@type连接到它们的类型, @type表示<http://www.w3.org/1999/02/22-rdf-syntax-ns#type>就像在Turtle中做的那样。 实体还连接到这些顶级块中的文字和其他实体。 由于JSON是分层的,因此文字也包含在其语言标记或类型旁边的块中。

RDF / XML

最古老的RDF格式是RDF / XML,它不再常用,但由于这一事实仍然是标准的。 同样,这里是RDF / XML,代表与上面的N-Triples,Turtle和JSON-LD完全相同的知识图。

与Turtle一样,可以在RDF / XML文件的顶部定义前缀,以避免不必要的URI重复。 然而,正如我们所看到的,RDF / XML仍然不像Turtle那样具有人类可读性,但在选择应存储RDF的格式之前,需要考虑一些因素。

哪种格式适合我?

看起来似乎总是将链接数据存储在更漂亮(最人性化的)Turtle格式中,但正如我上面提到的,使用上述每种格式都有优点和缺点。

RDF / XML:

如前所述,RDF / XML是第一个创建的RDF格式,因此被认为是标准格式。 这意味着默认情况下,大多数RDF库和三元组以此格式输出RDF。

如果您想使用旧版RDF系统或想要使用XML库来操作数据(因为RDF / XML是有效的XML),那么RDF / XML应该是您使用的格式。

但是,这种格式是为了尝试以旧格式存储新数据结构而创建的。 因此,由于其他较新的RDF格式的优点,RDF / XML不受欢迎。 如果您使用的是新的triplestore,则无法加载RDF / XML。

JSON-LD:

与RDF / XML类似,JSON-LD试图将新数据结构存储到现有格式中。

因此,优点是类似的,因为JSON-LD是有效的JSON,这意味着您可以使用许多标准JSON库来操作它。

然而,这种格式再次受欢迎,因此较新的三重商店甚至不支持加载它。

龟:

Turtle在许多方面类似于RDF / XML,但是非常简单,更好看。 如果您的RDF在任何时候都是由人类阅读的,那么最好将您的RDF以Turtle格式存储,因为所有的“混乱”都被删除了。 缺乏“混乱”也使得Turtle成为首选的格式,如果带宽是一个问题。

所有现代RDF库和三重存储都可以使用Turtle RDF,因为在Turtle文件的开头和结尾没有开放和关闭行(与RDF / XML不同),数据可以按块流式传输。 今天的系统通常需要实时数据流或通过API请求数据,因此必须考虑流式链接数据的能力。

的N-Triples:

N-Triples很简单,每一行由一个主题,谓词和一个由空格分隔并以句点结尾的对象组成。 这使得N-Triples非常容易解析并且像Turtle一样,所有现代RDF库和三重存储都可以与N-Triples一起使用。

N-Triples可能看起来很昂贵,但这种极端的冗长,使它们很容易解析,有助于现代压缩技术。 因此,存储为N-Triples的RDF可以实现高效的压缩比。

如上所述,Turtle可以在块中流式传输。 然而,N-Triples可以逐行流式传输,这使得它更加强大。 如果N-Triples文件的一行丢失,则丢失一个三元组...然而,在Turtle文件中,整个块丢失,可能是数千个三元组。

同样,如果您重新排列N-Triple文件中的行,则您的文件仍然有效,并且三元组表示的知识图表不受影响。 但是,如果对Turtle文件执行此操作,则RDF将变为无效。 如果您希望有效地处理多个传入流或API响应,则会出现此问题。 如果您的系统正在处理N-Triples,您可以在收到第一行后立即处理您的数据。

结论:

我们已经探索了三种主要的RDF格式,并概述了如何决定使用哪种格式。 在我的下一篇文章中,我将介绍如何将数据从csv转换为RDF

TL; DR:

三元组由三部分组成:主语,谓语和宾语。
这些结合起来创建了一个有向知识图。
实体由URI表示。

对象可以保存关于其主题的信息(常量值),这些被称为文字。
纯文字是可以选择附加标签的字符串(例如语言标签)
类型文字附加了数据类型(例如具有附加整数数据类型的数字)

如果您使用旧系统,则以RDF / XML格式存储RDF。
如果您希望您的RDF具有人类可读性或担心带宽,请将您的RDF存储为Turtle格式。
否则将您的RDF存储为N-Triples(这是我们经常流式传输时在Wallscope中转到RDF格式)。

附录:

每个例子都可以在这里找到:

的N-Triples

  <http://dbpedia.org/resource/Bob_Marley> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://xmlns.com/foaf/0.1 /人>。 
  <http://dbpedia.org/resource/Bob_Marley> <http://www.w3.org/2000/01/rdf-schema#label>“Bob Marley”@en。 
  <http://dbpedia.org/resource/Bob_Marley> <http://www.w3.org/2000/01/rdf-schema#label>“Bob Marley”@fr。 
  <http://dbpedia.org/resource/Bob_Marley> <http://www.w3.org/2000/01/rdf-schema#seeAlso> <http://dbpedia.org/resource/Rastafari>。 
  <http://dbpedia.org/resource/Bob_Marley> <http://dbpedia.org/ontology/birthPlace> <http://dbpedia.org/resource/Jamaica>。 
  <http://dbpedia.org/resource/Jamaica> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://schema.org/Country>。 
  <http://dbpedia.org/resource/Jamaica> <http://www.w3.org/2000/01/rdf-schema#label>“牙买加”。 
  <http://dbpedia.org/resource/Jamaica> <http://www.w3.org/2000/01/rdf-schema#label>“Giamaica”@it。 
  <http://dbpedia.org/resource/Jamaica> <http://www.w3.org/2003/01/geo/wgs84_pos#lat>“17.9833”^^ <http://www.w3.org/ 2001 / XMLSchema #float>。 
  <http://dbpedia.org/resource/Jamaica> <http://www.w3.org/2003/01/geo/wgs84_pos#long>“ -  76.8”^^ <http://www.w3.org / 2001 / XMLSchema #float>。 
  <http://dbpedia.org/resource/Jamaica> <http://xmlns.com/foaf/0.1/homepage> <http://jis.gov.jm/>。 

  @prefix dbr:<http://dbpedia.org/resource/>。 
  @prefix dbo:<http://dbpedia.org/ontology/>。 
  @prefix rdfs:<http://www.w3.org/2000/01/rdf-schema#>。 
  @prefix foaf:<http://xmlns.com/foaf/0.1/>。 
  @prefix geo:<http://www.w3.org/2003/01/geo/wgs84_pos#>。 
  @prefix xsd:<http://www.w3.org/2001/XMLSchema#>。 
  @prefix schema:<http://schema.org/>。 
  DBR:Bob_Marley 
 一个人:人; 
  rdfs:标签“Bob Marley”@en; 
  rdfs:label“Bob Marley”@fr; 
  rdfs:seeAlso dbr:Rastafari; 
  dbo:birthPlace dbr:牙买加。 
  DBR:牙买加 
 架构:国家; 
  rdfs:标签“牙买加”@en; 
  rdfs:标签“Giamaica”@it; 
  geo:lat“17.9833”^^ xsd:float; 
  geo:long“-76.8”^^ xsd:float; 
  foaf:主页<http://jis.gov.jm/>。 

JSON-LD

  [ 
  { 
  “ @id ”:“ http://dbpedia.org/resource/Bob_Marley ”, 
  “ @type ”:[ 
  “ http://xmlns.com/foaf/0.1/Person ” 
  ] 
  “ http://www.w3.org/2000/01/rdf-schema#label ”:[ 
  { 
  “ @value ”:“Bob Marley”, 
  “ @language ”:“en” 
  }, 
  { 
  “ @value ”:“Bob Marley”, 
  “ @language ”:“fr” 
  } 
  ] 
  “ http://www.w3.org/2000/01/rdf-schema#seeAlso ”:[ 
  { 
  “ @id ”:“ http://dbpedia.org/resource/Rastafari ” 
  } 
  ] 
  “ http://dbpedia.org/ontology/birthPlace ”:[ 
  { 
  “ @id ”:“ http://dbpedia.org/resource/Jamaica ” 
  } 
  ] 
  }, 
  { 
  “ @id ”:“ http://dbpedia.org/resource/Jamaica ”, 
  “ @type ”:[ 
  “ http://schema.org/Country ” 
  ] 
  “ http://www.w3.org/2000/01/rdf-schema#label ”:[ 
  { 
  “ @value ”:“牙买加”, 
  “ @language ”:“en” 
  }, 
  { 
  “ @value ”:“Giamaica”, 
  “ @language ”:“它” 
  } 
  ] 
  “ http://www.w3.org/2003/01/geo/wgs84_pos#lat ”:[ 
  { 
  “@value”:“17.9833”, 
  “ @type ”:“ http://www.w3.org/2001/XMLSchema#float ” 
  } 
  ] 
  “ http://www.w3.org/2003/01/geo/wgs84_pos#long ”:[ 
  { 
  “@value”:“ -  76.8”, 
  “ @type ”:“ http://www.w3.org/2001/XMLSchema#float ” 
  } 
  ] 
  “ http://xmlns.com/foaf/0.1/homepage ”:[ 
  { 
  “ @id ”:“ http://jis.gov.jm/ ” 
  } 
  ] 
  }, 
  { 
  “ @id ”:“ http://dbpedia.org/resource/Rastafari ” 
  }, 
  { 
  “ @id ”:“ http://jis.gov.jm/ ” 
  }, 
  { 
  “ @id ”:“ http://schema.org/Country ” 
  }, 
  { 
  “ @id ”:“ http://xmlns.com/foaf/0.1/Person ” 
  } 
  ] 

RDF / XML

  <?xml version =“1.0”encoding =“utf-8”?> 
  <rdf:RDF xmlns:rdf =“http://www.w3.org/1999/02/22-rdf-syntax-ns#” 
 的xmlns:FOAF = “http://xmlns.com/foaf/0.1/” 
 的xmlns:RDFS = “http://www.w3.org/2000/01/rdf-schema#” 
 的xmlns:NS0 = “http://dbpedia.org/ontology/” 
 的xmlns:架构= “http://schema.org/” 
 的xmlns:地理= “http://www.w3.org/2003/01/geo/wgs84_pos#”> 

  <foaf:Person rdf:about =“http://dbpedia.org/resource/Bob_Marley”> 
  <rdfs:label xml:lang =“en”> Bob Marley </ rdfs:label> 
  <rdfs:label xml:lang =“fr”> Bob Marley </ rdfs:label> 
  <rdfs:seeAlso rdf:resource =“http://dbpedia.org/resource/Rastafari”/> 
  <NS0:出生地> 
  <schema:Country rdf:about =“http://dbpedia.org/resource/Jamaica”> 
  <rdfs:label xml:lang =“en”>牙买加</ rdfs:label> 
  <rdfs:label xml:lang =“it”> Giamaica </ rdfs:label> 
  <geo:lat rdf:datatype =“http://www.w3.org/2001/XMLSchema#float”> 17.9833 </ geo:lat> 
  <geo:long rdf:datatype =“http://www.w3.org/2001/XMLSchema#float”> -76.8 </ geo:long> 
  <foaf:homepage rdf:resource =“http://jis.gov.jm/”/> 
  </模式:国家> 
  </ NS0:出生地> 

  </ FOAF:人> 

  </ RDF:RDF> 

 

https://medium.com/wallscope/understanding-linked-data-formats-rdf-xml-vs-turtle-vs-n-triples-eb931dbe9827

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值