sparql rdf_使用SPARQL查询RDF数据
在“ 大规模数据集成 :使用RDF创建数据网 ”中,您了解了资源描述框架:万维网联盟(W3C)标准,定义了基于图形的模型,该模型允许从几乎无限的来源中获得完全可移植的灵活数据。 。 大规模连接数据的功能非常强大,但是在某些时候,您还会想问有关RDF数据的问题。 该任务需要一种查询语言,该语言可以理解RDF图结构和基于网络的标识符。
直到RDF模型形成很久以后,才可以使用标准化的方法来查询RDF数据。 使用了六种或更多种专有查询语言,每种都有其自身的特点和不兼容之处。 这种情况通过不允许通用查询在不同的RDF存储系统上工作而削弱了可移植数据的视野。 幸运的是,在2008年,W3C发布了递归命名的SPARQL协议和RDF查询语言 (SPARQL)。 通过使用SPARQL客户端,用户可以通过将数据提取到本地来在本地执行查询,也可以通过将查询推送到服务器来通过SPARQL协议远程执行查询。 您可以对自己的数据或其他人的数据使用相同的查询语法。
大规模数据集成系列的第二部分向您介绍SPARQL:SPARQL的基础层,后面的部分探讨“ 开放生命周期协作服务”计划如何使用语义Web技术。 请参阅下载以获取本文的代码示例。
基本的SPARQL查询
许多客户端库或应用程序都可以执行SPARQL查询。 在这里,我将重点介绍使用Apache Jena项目中的sparql
命令行工具。 要对本地文件运行查询,可以键入:
sparql --query query.rq --data basic.nt
query.rq文件包含要运行的查询。 .rq文件扩展名是一个约定,不是必需的。 数据文件的内容可以是标准格式之一的RDF。 如果您使用适合于序列化格式的标准后缀之一(例如,.ttl表示Turtle,.rdf表示RDF / XML,.ntf表示N-Triples),则sparql
工具将正确解析该格式。 如果您使用.nt命名Turtle文件或使用.ttl命名N-Triples文件,则该工具将抱怨。
SPARQL查询的最简单形式尝试匹配图形的各个部分,并选择一个或多个表示为图形模式的重要位置的变量。 此方法类似于SQL SELECT
查询和投影,不同之处在于它对图形而不是表进行操作:
SELECT variable-list
WHERE {
graph pattern
}
图模式表示图中的结构关系,并引用节点和链接它们的弧。 回想一下,在RDF中,节点转换为主题实体,并弧形为将其连接到图形中其他节点的属性。 如果要询问特定节点的问题,可以在模式的主题位置中指定那些节点。 如果要了解特定属性的值,可以在模式的谓词位置指定该属性。 不需要指定的任何元素都可以由变量表示,该变量将映射到该位置上存在的任何可能的值。 如果您未指定模式的任何部分,则实际上是在要求将图中的所有三元组展平到结果集中。 结果集的内容取决于您选择的变量。
假设您具有清单1中所示的Turtle文件(名为basic.ttl)。
清单1.示例Turtle文件
<https://w3id.org/people/bsletten>
a <http://xmlns.com/foaf/0.1/Person> ;
<http://xmlns.com/foaf/0.1/birthday> "05-26" ;
<http://xmlns.com/foaf/0.1/name> "Brian Sletten" .
<https://w3id.org/people/mcarducci>
a <http://example.com/ns/Magician> ;
<http://xmlns.com/foaf/0.1/homepage> <http://trulymagic.com> ;
<http://xmlns.com/foaf/0.1/name> "Michael Carducci" .
basic.ttl文件包含有关两个单独实体的一些事实。 这两个实体的图形当前未连接,因此basic.ttl中的完整数据集具有两个单独的根节点。 如果我想索取我拥有的所有信息,则可以避免指定图形模式的任何特定部分并为所有变量选择:
SELECT ?s ?p ?o
WHERE {
?s ?p ?o
}
对我的数据文件运行前面的查询将产生清单2所示的结果:
清单2.在basic.ttl中查询所有信息的结果
> sparql --query query.rq --data basic.ttl
--------------------------------------------------------------------------------------------------------------------------------
| s | p | o |
================================================================================================================================
| <https://w3id.org/people/mcarducci> | <http://xmlns.com/foaf/0.1/name> | "Michael Carducci" |
| <https://w3id.org/people/mcarducci> | <http://xmlns.com/foaf/0.1/homepage> | <http://trulymagic.com> |
| <https://w3id.org/people/mcarducci> | <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> | <http://example.com/ns/Magician> |
| <https://w3id.org/people/bsletten> | <http://xmlns.com/foaf/0.1/name> | "Brian Sletten" |
| <https://w3id.org/people/bsletten> | <http://xmlns.com/foaf/0.1/birthday> | "05-26" |
| <https://w3id.org/people/bsletten> | <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> | <http://xmlns.com/foaf/0.1/Person> |
--------------------------------------------------------------------------------------------------------------------------------
清单2中的SPARQL结果集的每个选定变量都有一列,每个匹配的三元组都有一行。 我选择了三个变量( ?s ?p ?o
),因此清单2有三列。 因为我没有为任何主题,谓词或对象指定值,所以在图中每个事实只得到一行。 数据集在两个图形中具有三个三元组,因此结果具有六行。
从本质上讲,此查询要求SPARQL处理器“告诉我有关一切的一切”,而不是针对大型数据集运行的友好查询。 了解LIMIT
子句,您将避免执行令人讨厌的查询(尤其是通过SPARQL协议在其他人的系统上)。
定性地,我学会了一个名叫迈克尔·卡杜奇的魔术师的名字和主页,以及一个名叫布莱恩·斯莱滕的人的名字和生日。 从上一篇文章中 ,您将了解这些关系的含义。 但是,如果您不识别结果集中的实体或关系,则可以-因为这些实体或关系是(理想情况下)可解析的URI-只需对URI发出GET
请求,以了解有关它们所指代或含义的更多信息。
“对不同的数据集执行相同的查询将使所有三元组变平,无论提到了哪些主题以及对它们说了什么。 ”
对不同的数据集运行相同的查询将使所有三元组变平,无论提到了哪些主题以及对它们有何评论。 这是重要的一点。 RDF为您提供可移植的数据。 SPARQL可以(但不一定)为您提供可移植的查询。 您无需先了解特定于域的关系或类型,即可提取数据并提出问题。
查找所有主题或所有关系
问什么比要求所有信息更有用的问题? 如何找出数据集中讨论哪些主题? 在这种情况下,您不必关心关系或值。 您只需要一个在所有图中充当主题的节点的完整列表。 图形模式不会改变-因为您仍想了解充当主题的任何事物-但您只选择主题变量即可将图形中的值投影到结果集中。 查询变为:
SELECT ?s
WHERE {
?s ?p ?o
}
运行查询会产生清单3中所示的(也许是意外的)结果。
清单3.仅选择主题变量的结果集
> sparql --query subjects.rq --data basic.ttl
---------------------------------------
| s |
=======================================
| <https://w3id.org/people/mcarducci> |
| <https://w3id.org/people/mcarducci> |
| <https://w3id.org/people/mcarducci> |
| <https://w3id.org/people/bsletten> |
| <https://w3id.org/people/bsletten> |
| <https://w3id.org/people/bsletten> |
---------------------------------------
数据仅包含两个主题,但是清单3中的结果包括每个匹配的图形模式的主题的一个副本。 因为每个主题已知三(不同)件事,所以每个主题在结果中都会得到三个参考。 为避免这种冗余,可以使用DISTINCT
关键字在每个结果集行中仅请求一个不同的值。 仅要求一个变量,就只能获得对图中每个唯一主题的引用。 查询变为:
SELECT DISTINCT ?s
WHERE {
?s ?p ?o
}
(预期)结果是:
> sparql --query distinct-subjects.rq --data basic.ttl
---------------------------------------
| s |
=======================================
| <https://w3id.org/people/mcarducci> |
| <https://w3id.org/people/bsletten> |
---------------------------------------
如果您对图表中表示的关系的本质(而不是主题)更感兴趣,则可以简单地选择一个不同的变量,在这种情况下,选择?p
变量。 因为?p
在将主题( ?s
)与对象( ?o
)连接起来的图中?o
,所以?p
表示图中的所有谓词关系。 在这里,我还主动将结果限制为不同的值:
SELECT DISTINCT ?p
WHERE
{
?s ?p ?o
}
查询结果显示了图形中使用的属性:
> sparql --query predicates.rq --data basic.ttl
-----------------------------------------------------
| p |
=====================================================
| <http://xmlns.com/foaf/0.1/name> |
| <http://xmlns.com/foaf/0.1/homepage> |
| <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> |
| <http://xmlns.com/foaf/0.1/birthday> |
-----------------------------------------------------
结果突出显示数据使用FOAF name
, homepage
和birthday
属性以及RDF type
属性也就不足为奇了。 您也可以选择不同的对象,以找到显示在图中所有三元组中的单个值。 我将让您尝试自行设计该查询并调查结果。
在图形模式中指定主题
现在,假设您已经对数据运行了主题查询,并且知道了所描述实体的身份。 如果要询问有关特定主题的信息,则可以在图形模式中指定该值,然后为与该主题关联的所有谓词对象对选择。 您在这里说的是:“告诉我有关特定资源的所有信息。” 要查找有关Michael Carducci资源的更多信息,该查询应类似于:
SELECT ?p ?o
WHERE
{
<https://w3id.org/people/mcarducci> ?p ?o
}
结果看起来像:
> sparql --query carducci.rq --data basic.ttl
----------------------------------------------------------------------------------------
| p | o |
========================================================================================
| <http://xmlns.com/foaf/0.1/name> | "Michael Carducci" |
| <http://xmlns.com/foaf/0.1/homepage> | <http://trulymagic.com> |
| <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> | <http://example.com/ns/Magician> |
----------------------------------------------------------------------------------------
询问有关特定资源的信息的想法是如此有用,以至于另一种称为DESCRIBE
SPARQL查询表单为您提供了另一种方法:
DESCRIBE <https://w3id.org/people/mcarducci>
请注意, DESCRIBE
不会像SELECT
查询那样生成结果集表。 相反, DESCRIBE
产生一个新图,如清单4所示。
清单4. DESCRIBE
产生的图
> sparql --query describe.rq --data basic.ttl
<https://w3id.org/people/mcarducci>
a <http://example.com/ns/Magician> ;
<http://xmlns.com/foaf/0.1/homepage>
<http://trulymagic.com> ;
<http://xmlns.com/foaf/0.1/name>
"Michael Carducci" .
查找主题标识符
现在,假设您的数据集包含有关许多人的信息,并且您在所有标识符列表中都没有识别Michael的主题标识符。 您可以更改查询以查找Michael的主题标识符。 为了方便起见,我还将利用这个机会介绍PREFIX
的使用,以简化图形模式的表达。 如果使用PREFIX
关键字指示foaf:
前缀指向http://xmlns.com/foaf/0.1/
命名空间,则可以引用更简单的foaf:name
或foaf:Person:
术语:
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?s
WHERE
{
?s foaf:name "Michael Carducci"
}
结果就是您所期望的。 现在您知道要使用哪个标识符,可以运行先前的查询来获取有关Michael的信息。 或者,您可以通过运行更复杂的查询将两个步骤结合起来:
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?p ?o
WHERE
{
?s foaf:name "Michael Carducci";
?p ?o .
}
在这里,您说的是:“告诉我所有有关迈克尔·卡杜奇的人的知识。” 如果有关迈克尔·卡杜奇(Michael Carducci)的人员有多种资源,您将获得有关所有人员的结果。 因为名称不是唯一的标识符,所以在这一点上,您不必知道资源是否指向同一个人。
前面的查询没有选择主题,但是也许不需要。 如果您只想知道数据说明某人名为Michael Carducci的情况,则资源标识符可能没有用。 如果您还想捕获标识符,只需将?s
变量添加到SELECT
子句中。 但是,即使您没有选择标识符,您仍然需要?s
来充当其在图形模式中的角色。 必须通过foaf:name
属性将一个主题连接到您要查找的foaf:name
,以便可以捕获与该主题关联的属性和对象值。
最后,您可能还希望可以将DESCRIBE
表单用于更多间接查询。 您可以。 在这里,我要求提供有关ex:Magician
任何资源的信息:
PREFIX ex: <http://example.com/ns/>
DESCRIBE ?s
WHERE {
?s a ex:Magician
}
我依靠引入在此最后一个例子另一个有用的技巧a
语法糖,以避免不必指定RDF type
将其整体性能。 另一个很酷的事情是,您可以利用对域的了解来针对数据提出有针对性的问题:找到我是一名Engineer
。 我找任何Person
使用这个名称。 找到我一个住在休斯顿的Magician
。
如果您不知道使用哪种域类型,则只需发出另一个查询即可获取它们。 您将如何询问所有类型的清单? (提示:基本查询是“向我显示所有类型为某种类型的所有类型。”您要指定谓词(或使用语法糖快捷方式),而不是主题或宾语。
查询多个数据集
如果由于某种愚蠢的原因而无法更改basic.ttl文件,我仍然可以通过将事实放入另一个文件中并将该文件添加到命令行中来扩展事实。 假设我想知道我认识迈克尔。 在一个单独的文件(knows.ttl)中,我可能会说:
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
<https://w3id.org/people/bsletten>
foaf:knows <https://w3id.org/people/mcarducci> .
我使用的是相同的标识符,因此,如果将这个文件中的数据与我一直在使用的数据进行混合,则我已经连接了图形。 原始文件未更改,但是添加到查询模型的额外三元组通过foaf:knows
关系将Brian的节点连接到Michael的节点。 我可以询问的查询变得更加有趣,如清单5所示。
清单5.查询链接图模式
PREFIX ex: <http://example.com/ns/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?magician ?name
WHERE {
?s foaf:name "Brian Sletten" ;
foaf:knows ?magician .
?magician a ex:Magician ;
foaf:name ?name .
}
在清单5中,我有两个单独的图形模式,它们由magician
变量链接。 我说的是:“告诉我一个叫Brian Sletten的人( ?s
),他知道某人是ex:Magician
类( ?magician
)的实例。另外,请抓住另一个人的名字。” 没有Knows.ttl文件中的三元组,此查询将不会返回任何结果。 但是,如果我将其包含在运行时模型中,则会发生魔术:
> sparql --query complex.rq --data basic.ttl --data knows.ttl
------------------------------------------------------------
| magician | name |
============================================================
| <https://w3id.org/people/mcarducci> | "Michael Carducci" |
------------------------------------------------------------
查询远程数据
您刚刚看到了从各种文件中收集数据的好处,这也可以与可通过Web寻址的资源一起使用。 不过,我要在这里给你扔一个曲线球。 还记得上一篇文章中我使用W3ID社区中的标识符来引用我自己吗? 如果您请求该资源,实际上会发生什么,如清单6所示?
清单6.请求W3ID资源的查询
> http get https://w3id.org/people/bsletten
HTTP/1.1 303 See Other
Access-Control-Allow-Origin: *
Content-Length: 314
Content-Type: text/html; charset=iso-8859-1
Date: Tue, 31 Mar 2015 22:33:15 GMT
Location: http://bosatsu.net/foaf/brian.rdf
Server: Apache/2.4.7 (Ubuntu)
...
我省略了清单6中HTML正文,因为它只是简单地说明了标头所说的。 303 See Other
响应包括一个Location
标头,该标头指向一个文件,该文件将告诉您有关我的更多信息。 我无法序列化,但该文档可以。 当我请求该文档时,如清单7所示,您会看到一些有趣的东西。
清单7.请求W3ID资源的查询
> http get http://bosatsu.net/foaf/brian.rdf
HTTP/1.1 200 OK
Accept-Ranges: bytes
Access-Control-Allow-Origin: *
Content-Length: 8507
Content-Type: application/rdf+xml
Date: Tue, 31 Mar 2015 22:40:04 GMT
ETag: "402ab-213b-508583ad90a40"
Last-Modified: Fri, 21 Nov 2014 06:05:21 GMT
Server: Apache/2.2.16 (Debian)
<?xml version="1.0" ?>
<rdf:RDF xmlns:cert="http://www.w3.org/ns/auth/cert#"
xmlns:contact="http://www.w3.org/2000/10/swap/pim/contact#"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:foaf="http://xmlns.com/foaf/0.1/"
xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
xmlns:loc="http://simile.mit.edu/2005/05/ontologies/location#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
xmlns:wot="http://xmlns.com/wot/0.1/">
<foaf:Person rdf:about="https://w3id.org/people/bsletten">
...
</foaf:Person>
...
</rdf:RDF>
在清单7中,在HTTP响应标头,RDF文档的开头以及所有名称空间前缀之后,我将称为https://w3id.org/people/bsletten
的资源标识为foaf:Person
类的实例。 (这是RDF / XML表示主要类型的rdf:type
关系的方式。)接下来是有关此人(我)的许多细节,包括我上学的地方,我认识的人,我感兴趣的内容, 等等。
不过,不要忘记这种思路的更大范围。 我为自己提供的稳定标识符303-重定向到描述我的文档(使用相同的标识符)。 理解Web重定向的SPARQL客户端(大多数都可以做到)将解决所有这些问题。 因此,在命令行上添加对我的引用也会添加(一旦执行了重定向)我公开宣传自己的所有内容。 现在,您可以连接三个不同的数据集并提出一个问题:“告诉我任何认识魔术师Michael Carducci的人的利益。” 兴趣来自这个新重定向的RDF文件。 这个新查询类似于清单8。
清单8.链接三个源的查询
PREFIX ex: <http://example.com/ns/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?interest WHERE {
?s foaf:interest ?interest ;
foaf:knows ?magician .
?magician a ex:Magician ;
foaf:name "Michael Carducci" .
}
清单9显示了结果。
清单9.清单8查询的结果
> sparql --query interests.rq --data basic.ttl --data knows.ttl --data https://w3id.org/people/bsletten
-----------------------------------------------
| interest |
===============================================
| <http://dbpedia.org/page/Fish_%28singer%29> |
| <http://dbpedia.org/resource/Sushi> |
| <http://dbpedia.org/resource/Phish> |
| <http://www.w3.org/2000/01/sw/> |
| <http://www.w3.org/Metadata/> |
| <http://www.w3.org/RDF/> |
-----------------------------------------------
“您可以询问的查询的复杂性直接与可用数据的复杂性有关。 ”
发生了很多事情。 basic.ttl中的三元组建立了关于Michael和我的一些简单事实。 Knows.ttl文件中的一个事实捕获了一个事实,即我知道Michael,并在basic.ttl文件中连接了两个(否则未连接)图。 最后,我在支持我的W3ID标识符的FOAF文件中发布的数据除其他花絮外还表达了我的一些兴趣。 清单8中的查询之所以起作用,是因为所有这三个源都提供了链接。 您可以询问的查询的复杂性直接与可用数据的复杂性有关。 请记住,您可以提取数据,然后询问数据的含义,所涉及的属性等等。
SPARQL协议
当SPARQL客户端解析并运行查询时,它首先通过HTTP获取数据并将其拉入引擎。 这很酷,因为数据始终是新鲜的并从源中提取。 如果源数据发生更改,则下次您运行查询时,将获得更新。 但是,对于大型数据集,这可能是每次查询运行时都无法获取的大量信息,尤其是在您只需要一小部分结果图的情况下。 为了帮助解决此问题, SPARQL协议允许您对支持少数约定的任何远程服务器运行查询。 在这里我只关注其中之一。
如果服务器支持运行SPARQL查询的GET
模式,它将接受作为参数传递的查询的URL编码形式。 这是我在面向资源的模式书中称为“ 命名查询模式”的示例。 客户端通过简单地请求即可创建反映其感兴趣信息的信息资源(与服务器发布命名资源相对)。 进行查询:
PREFIX ex: <http://example.com/ns/>
DESCRIBE ?s
WHERE {
?s a ex:Magician
}
前面的查询将转换为对http://example.com/sparql?query=PREFIX%20ex%3A%20%26lt%3Bhttp%3A%2F%2Fexample.com%2Fns%2F%26gt%3B%的请求0A%0ADESCRIBE%20%3Fs%0AWHERE%20%7B%0A%20%20%3Fs%20a%20ex%3AMagician%0A%7D,您可以向其发出GET
请求。 通常可以将结果集序列化为SPARQL结果集格式的XML,JSON或CSV表示形式。 但是,查询仍然是一种信息资源,可以共享,添加书签,甚至可以进行缓存(例如,如果服务器指示这样做可以通过缓存控件来完成)。
考虑一下这里实际发生的情况。 我不是将数据提取给我,而是将查询推送到数据所在的服务器。 对于大型数据集,此功能可以节省大量带宽。 但是,这种权衡并非没有顾虑。 允许任意客户端推送在服务器上执行的任意查询可能会带来太大的风险。 幸运的是,这些客户端驱动的资源仍然仅仅是信息资源,并且可以通过您要部署的任何身份验证和授权系统来保护。 (名为“ 链接数据片段”的一项举措正在努力定义标准,以允许客户端发出较轻量级的查询来获得与使用SPARQL协议几乎相同的结果。)
尽管如此,将协议支持与SPARQL SELECT
查询结合在一起还是很强大的。 通过在协议中使用CONSTRUCT
形式,可能会更具体地强调功能。 使用CONSTRUCT
,您可以从现有图形创建新图形。 这些新图可能是子图,关于特定资源的图(例如DESCRIBE
查询),或者是形状如您所愿的图。
我的最后一个示例显示了如何以最小的努力来发挥前所未有的力量。 如果您对资源标识符,属性,类等使用的术语与我使用的术语不同,那么我可以简单地通过索取数据并将其推送到SPARQL协议端点来使用您的术语创建数据的子图。 无需进行无休止的会议,而徒劳地尝试达成共识。 如果您使用ex:author
来表示作者身份,而我想使用更广泛使用的Dublin Core http://purl.org/dc/terms/creator
,那么我可以这样简单地说:
PREFIX ex: <http://example.com/ns/>
PREFIX dct: <http://purl.org/dc/terms/>
CONSTRUCT {
?x dct:creator ?y .
} WHERE {
?x ex:author ?y .
}
然后,我通过http://example.com/sparql?query=PREFIX%20ex%3A%20%3Chttp%3A%2F%2Fexample.com%2Fns%2F%3E%0APREFIX%20dct%3A将查询推送到您的服务器%20%3Chttp%3A%2F%2Fpurl.org%2Fdc%2Fterms%2F%3E%0A%0ACONSTRUCT%20%7B%0A%20%20%3Fx%20dct%3Acreator%20%3Fy%20.%0A% 7D%20WHERE%20%7B%0A%20%20%3Fx%20ex%3Aauthor%20%3Fy%20.%0A%7D。 请记住, CONSTRUCT
查询(如DESCRIBE
查询)生成RDF图,而不是结果集。 因此,然后可以直接在客户端上查询SPARQL协议资源,如清单10所示。
清单10.直接从客户端查询SPARQL协议资源
PREFIX dct: <http://purl.org/dc/terms/>
SELECT ?creator
FROM <http://example.com/sparql?query=PREFIX%20ex%3A%20%3Chttp%3A%2F%2Fexample.com%2Fns%2F%3E%0APREFIX%20dct%3A%20%3Chttp%3A%2F%2Fpurl.org%2Fdc%2Fterms%2F%3E%0A%0ACONSTRUCT%20%7B%0A%20%20%3Fx%20dct%3Acreator%20%3Fy%20.%0A%7D%20WHERE%20%7B%0A%20%20%3Fx%20ex%3Aauthor%20%3Fy%20.%0A%7D>
FROM some local file or data
WHERE {
?x dct:creator ?creator .
}
我正在通过网络动态获取和重塑您的数据,无需动态了解数据的最终产生或存储方式(可能在RDBMS中),并且无需将其连接到我的数据即可必须与您协调(可能无法访问SPARQL协议端点)。
在下一部分中,当我讨论链接数据时,您将看到一些使用SPARQL协议的有趣示例。
结论
到目前为止,在本系列中,您已经了解了一个灵活的标准数据模型,该模型使您能够始终学习新的事实,并以最小的努力轻松地与新数据源集成。 现在,您还已经了解了如何开始在数据源上运行查询,而无需考虑基础实现的详细信息-都是通过使用标准标识符,标准模型和标准查询语言来在网络上询问任意域的任意问题。 在下一部分中,我将通过探索链接数据和链接数据平台来构建这些思想。
翻译自: https://www.ibm.com/developerworks/web/library/wa-data-integration-at-scale_sparql/index.html