比较RDF和SQL数据
许多人问什么可以用SPARQL来完成这个不能用SQL完成的事情,实际上他们关心RDF中可以做什么,不能用关系数据库完成。这两种语言都使用户能够创建,组合和使用结构化数据。SQL通过访问关系数据库中的表来执行此操作,并且SPARQL通过访问关联数据的Web来完成此操作。(当然,SPARQL也可以用于访问关系数据,但它被设计为合并不同的数据源。)
关系数据由收集到表中的数据行(在正式关系文献中也称为“关系”)组成。表中的行符合称为模式的集合数据类型和约束。称为DDL(数据定义语言)的SQL子集声明了该模式:
ID INT,
fname CHAR(10),
addr INT,
FOREIGN KEY(addr)REFERENCES Address(ID)
);
CREATE TABLE地址(
ID INT,
城市CHAR(10),
状态CHAR(2)
)
这限制了Person
某些数据库中表中的行有三列 - “ID”,“fname”和“addr”,分别是整数,10个字符和另一个整数。它类似地定义一个Address
表,并且要求表中“addr”列中的非NULL值对应于Person
表中“ID”列的Address
值。这允许数据库捕获在数据库中表示的现实世界实体(事物)之间的关系。例如,下面的值表明,鲍勃住在马萨诸塞州的剑桥,我们不知道苏的生活在哪里:
ID | fname | 地址 |
---|---|---|
7 | 鲍勃 | 18 |
8 | 起诉 | 空值 |
ID | 市 | 州 |
---|---|---|
18 | 剑桥 | 嘛 |
发明了数字7,8和18,以识别它们之间的行并捕捉它们之间的联系。关于这些关系的SQL查询通常不会提及具体的数字,但将重述关系的约束,即Person.addr=Address.ID
。这种相同的表达式可以捕获不是内在关系的约束,例如,一个人的地址号与他们的鞋子大小相同。
RDF捕获实体属性和实体之间的关系,因为表单entity1
的propertyA
语句具有关系entity2
。使用一种叫做乌龟的语言,我们可以说在马萨诸塞州的剑桥有一个叫做“Bob”的地址,
<AddressB> a <地址>。
<PersonA> <Person#fname>“Bob”。
<地址B> <地址#city>“剑桥”。
<PersonA> <Person#addr> <AddressB>。
<AddressB> <Address#state>“MA”。
还有另一个人,“苏”,但我们不会对她的地址说什么,因为我们不知道:
<PersonF> <Person#fname>“Sue”。
我们将RDF语句中的三个术语称为主语,谓词和对象。上述声明中使用的术语是尖括号(<> s)中的相对URL,引号(“s”)中的文字和关键字“a”,只是用于标识“有类型”的URL的快捷方式关系。在RDF中没有与SQL的NULL对应的概念,因为没有与SQL的结构约束相对应的RDF要求,关系数据库中的每一行必须符合相同的模式。一个断言的对象,例如上面的<AddressB>可能是其他断言的主题或对象。以这种方式,一组RDF语句连接起来以创建“图形”(在数学意义上)。您会经常听到“RDF图”一词。
“PerconC”> <Person#fname>“Bob”。
<AddressK> <地址#所有者> <PersonC>。
上面的例子说明了RDF和关系数据之间的一些结构相似性和差异。核心的哲学差异在于RDF是一种后Web语言; 也就是说,它允许使用我们想要描述的实体的Web标识符,以及我们用于描述它们的属性和关系。如果我相信出版商不要骗我,我可以简单地合并不同方面的信息。这种信任的一个例子可以说是“我相信,只要这些方声称某人有一个< http://xmlns.com/foaf/0.1/givenName>,该值确实是该人的给定名称?”
SPARQL和SQL简介
专家们现在关于RDF和关系数据,我们现在可以检查他们的查询语言。获取MA中每个人的地址的SQL查询可能如下所示:
FROM Person,Address
WHERE Person.addr = Address.ID
AND Address.state =“MA”
从概念上讲,我们从一组表中选择属性列表,以满足某些约束条件。这些约束捕获方案中隐含的关系Person.addr = Addresses.ID和选择条件,例如Address.state =“MA”。
相同数据的SPARQL查询可能看起来像
WHERE {
?who <Person#fname>?name;
<Person#addr>?adr
?adr <地址#city>?city;
<地址#州>“MA”
}
无论更好还是更糟,SPARQL重用SQL用户熟悉的关键词:SELECT,FROM,WHERE,UNION,GROUP BY,HAVING和大多数聚合函数名称。
看看上面的例子,我们看到SQL查询的一般形式:
FROM <table list>
WHERE <test expression>
测试表达式捕获与特定查询相关的行(行为“MA”状态的行)和数据库的结构(Person.addr引用Address.ID)。文献和文献倾向于避免使用歧义词“选择”,而是restriction
用于选择行和projection
从这些行中选择特定的列。查询的结果是行列表,每列都有选择的属性列表。在课程顶部的示例数据库上执行示例查询会产生一个对应于“MA”中的一个人的解决方案:
fname | 市 |
---|---|
鲍勃 | 剑桥 |
上面的SPARQL查询具有相似的结构:
WHERE {<graph pattern>}
变量列表中的变量由图形模式绑定。(记住,“图”只是意味着三个是一组潜在的互连的语句。)图形模式看起来像数据语句,但主题,谓词或对象可能被替换为变量(以“?”开头的术语) 。上面的模式找到与数据匹配的所有值,如name,?city,?who和?addr,仅显示?name和?city:
?fname | ?市 |
---|---|
“鲍勃” | “剑桥” |
查询曾与变量的一个解决方案fname
,并city
绑定到文字“鲍勃”和“剑桥”。SPARQL解决方案集中的术语与SPARQL查询或Turtle语句中的术语相同。请注意,SPARQL解决方案集中的列标题是出现在WHERE { <graph pattern> }
SQL结果中的列标题是SQL模式中属性(列)的名称的变量。
NULL,OPTIONALS和LEFT OUTER JOIN
SQL使用令牌NULL
来表示数据不可用或不适用。即使所选属性为NULL,SELECT也匹配表行。但是,如果没有相应值的行,则连接约束通常会消除行。LEFT OUTER JOIN操作符执行常规(“内部”)连接,但如果不满足连接约束,则不消除解决方案。以下查询将选择每个人的fname,如果可用,将选择他们的城市:
FROM Person
LEFT OUTER JOIN地址ON Person.addr = Address.ID
WHERE Address.state =“MA”
fname | 市 |
---|---|
鲍勃 | 剑桥 |
起诉 | NULL |
SPARQL使用关键字OPTIONAL
而不是LEFT OUTER JOIN
,但效果类似:
WHERE {
?who <Person#fname>?name。
OPTIONAL {
?谁<Person#addr>?adr。
?adr <地址#city>?city;
<地址#州>“MA”
}
}
虽然连接语义在两种语言之间是类似的,但在丢失数据的处理方面存在明显的区别。缺少的数据根本不在RDF中表示。另外(并因此),如果有缺少的属性,例如Sue的addr,SPARQL图形模式将不会绑定。选择每个人的姓名和地址记录的标识符的SPARQL查询必须使addr属性可选,以匹配Sue的记录:
WHERE {
?who <Person#fname>?name。
OPTIONAL {?who <Person#addr>?adr}
}
一个真正类似的SQL查询必须防止绑定到NULL,即:
FROM Person
LEFT OUTER JOIN地址ON Person.addr = Address.ID
WHERE Address.state =“MA”AND Person.addr IS NOT NULL
解决方案集合中的其他运算符
SPARQL和SQL具有非常相似的UNION和MINUS运算符,它们分别从解决方案集中添加和删除解决方案。
因为SQL表的数据类型假定在所有行中都是一致的,所以必须注意对齐SELECT的数据类型。一些SQL数据库强制执行此规则,让用户有一些有用的错误消息来找到错位。其他人也可以返回异构列,例如后面的行的值就像2012-05-28在一列浮点数。
网上查询
SQL数据库是数据的重新分配,一组表由数据行填充。SQL查询在给定的数据库上运行。SPARQL服务是否有预定的RDF数据库是不同的。上面的示例查询假设一组三元组可用于查询,哪个可以从服务查询已填充的数据库。如果RDF数据库默认为空,或者不包含查询所需的数据,则需要指定加载该数据的位置。SPARQL重新使用SQL关键字“FROM”来标识需要加载以完成查询的Web资源:
勘探
结合导航与探索在SPARQL中非常简单。如果我想知道我的组织知道关于illudium phosdex的反应,我可以写一个查询,发现这些反应并探讨他们的属性:
WHERE {
?compound ex:name“illudium phosdex”;
反应如:涉及化合物;
?反应?五氧化二磷
}
在SQL中,这将像:
FROM反应,化合物
WHERE reactions.compoundID = compounds.ID
AND compounds.name =“illudium phosdex”
通用链接数据浏览器目前正在利用SPARQL来探索数据,并且可能导致一系列专门的界面,使知识用户能够理解和利用信息资产。
联邦
SPARQL的主要特征可能会打动SQL用户,这是能够在不同的存储库之间联合查询。RDF理论为数据集成图提供了基础,而RDF工具则将该功能放在用户手中,允许他们轻松检索多个数据文档。集成大型数据库也是微不足道的,而不是在本地检索数据并进行合并,而是写入SPARQL查询,将查询的部分委托给远程查询服务,例如本周的未发货订单:
WHERE {
SERVICE <sales> {
?order ex:soldBy?handler;
例如:?由于的dueDate
FILTER(由于>“2012-02-22”由于&& <“2012-02-29”?
} {MINUS
服务<完成> {为了例如:??运运}
}
}
SQL没有用于查询联合的标准系统。各种产品提供或多或少利用SQL语法管理对预先分配的数据库集的访问的工具。MySQL FROM指令可以加入运行在同一MySQL服务器上的不同虚拟数据库的数据,Oracle数据库流和SQL Server集成服务使用该语法连接到通过某些手动配置映射到本地模式名称的数据库。
模式重用
大胆的说法是,SPARQL可以用于轻松整合数据,这要求数据当然在相交域中。为了使集成真正微不足道,它有助于以类似的方式表达数据。如果我们想将一个数据库的某些化学物质的生理影响信息与另一个数据库的药物成分连接在一起,那么化学物质在两个数据库中的表现方式相同,这当然更容易。这似乎是一个很高的订单,但SPARQL和RDF在网络上的基础使得它很容易探索,拥抱和扩展现有的模式。如果合作精神可能不足以激励人们使用相同的模式,我们仍然有懒惰来帮助我们打熵。
概要
介绍了关系型和RDF数据模型,并强调了它们之间的结构差异。这些差异在他们的查询语言的能力上变得显而易见。我们讨论了遍及语义Web的重用和集成的文化,并提到SPARQL可用于访问关系数据以及RDF。关于RDF和R2RML 的关系数据的直接映射:RDB到RDF映射语言的两个最近的规范定义了这个过程。下一课将对比包含完全相同信息的两个数据库的SPARQL和SQL查询。