background image

 

将这段基于 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