将这段基于 SQL
的代码与清单 2
中所示的基于 SPARQL 的代码相比较。采用这两个
read
操作的原因在于它们最易于理解、实现和说明。这对于 SQL
和 SPARQL 来说都是一
样的。
PREFIX
foaf:<http://xmlns.com/foaf/0.1/>
PREFIX
rdf:
<http://www.w3.org/1999/02/22-rdf-syntax-ns#>SELECT ?uri ?name ?dob ?
locationFROM<http://www.example.org/graph>WHERE{
?urirdf:type
foaf:Person ;foaf:name "John Smith" ;foaf:birthday?dob ;foaf:location ?
location .} ;
在比较两张清单时,您的第一个想法很可能是 SPARQL
版本明显比 SQL 版本长很多。这
是事实,但是请不要误以为 SQL 必然更简单而且更干净。根据所运行引擎的不同 ,
SPARQL 可以全部通过称为链接数据结果(linked data effect)的内容进行分发。此外,
它允许拥有动态模式,因为它拥有互相链接的面向对象的透视图,与严格的 SQL 关系透
视图形成对照。如果您想要把关系数据库表分隔为许多数据孤岛,则实际上使用的 SQL
代码行将比 SPARQL
—
多很多
更不必说 SQL
中会出现大量令人讨厌的 JOIN 描述符。
SPARQL
的前两行是 PREFIX
声明。根据语义 Web
—
理论,一切内容
无论是对象还是
—
数 据 图 来 源 ( 也 是 一 个 对 象 )
都 有 统 一 资 源 标 识 符 ( Uniform Resource
Identifier,URI)。PREFIX
行只是将临时标签应用到一些 URI —
中
在本例中为 Friend
of a Friend
和 RDF
模式。其中的好处是您以后可以在查询中使用 PREFIX 声明而不必使
用完整的 URI。
SPARQL
代码的下一行描述了查询请求。这条语句在本质上与 SQL 语句相同,不同之处
是对 URI 的附加请求。注意问号的使用(?)是为了表示术语是变量。
FROM
语句描述了获取数据的位置。这在 SQL
和 SPARQL 中是相同的,只是在
SPARQL
中,数据源名称是 URI,而非表示计算机或网络中某个物理位置的字符串。
两者的 WHERE
语句完全不同,因为使用 SPARQL,必须指定用于获取数据的模式。同
样,如果尝试过使用关系方法执行此操作,则需要花费的代价比普通 SQL 多得多:需要
使用 PHP、Java™ 编程语言或者一些其他服务器端语言才能执行数据源之间的检查 。
SPARQL
代码行完成的操作比较明了,这包括确保正在检索的数据只属于 Person 类型 。
SPARQL
将获取名称和位置,同时执行一些模式匹配以查找正确的 John Smith。
创建
SPARQL
中的 CRUD
操作通常比 read 操作更神秘。但是,可以完成这些操作。首先,
create 操作将把新记录或对象插入到表或图表中。
INSERT INTO UserTable (realname, dob, location) VALUES ("John Smith",
"1985-01-01", "Bristol, UK");
现在,比较清单 3
中基于 SQL
的代码与清单 4
中基于 SPARQL
的代码中的 create 操
作。
PREFIX
foaf:<http://xmlns.com/foaf/0.1/>
PREFIX
rdf:
<http://www.w3.org/1999/02/22-rdf-syntax-ns#>INSERT
INTO
GRAPH
<http://www.example.com/graph>
(?realname,
?dob,
?location)
{<http://www.example.org/graph/johnsmith#me> rdf:Type foaf:Person ;
foaf:name "John Smith" ; foaf:birthday <1985-01-01T00:00:00> ; foaf:location
"Bristol, UK" }
同样,注意 PREFIX
行与用 SPARQL
在 read 操作中执行的操作完全相同。INSERT