建立、讀取、更新和刪除(Create/Read/Update/Delete,CRUD)操作是最基本的資料庫操作,但是它們也是最重要的操作。 CRUD 操作通常是使用關聯式資料庫系統中的結構化查詢語言(Structured Query Language,SQL)完成的。隨著Web 變得更具有面向資料特性,因此需要從基於SQL 的CRUD 操作轉移到基於語意Web 的CRUD 操作。了解如何使用PHP透過基於語意的Web 執行CRUD 操作。 常用縮寫
API — 應用程式介面(Application Programming Interface)
CRUD — 建立/讀取/更新/刪除(Create/Read/Update/Delete)
HTTP —超文本傳輸協定(Hypertext Transfer Protocol)
MVC — 模式—檢視—控制器(Model-View-Controller)
OOP — 物件導向的程式設計(Object-Oriented Programming)
RDF — 資源描述框架(Resource Description Framework)
SPARQL — 簡單協定與RDF 查詢語言(Simple Protocol and RDF Query Language)
SQL — 結構化查詢語言(Structured Query Language)
UI — 使用者介面(User interface)
W3C — 萬維網聯盟(World Wide Web Consortium)
在開發Web 應用程式時,為邏輯層和UI 層建立放置伺服器端程式碼的資料庫結構是一種標準實踐。要連接到資料庫,伺服器端程式碼需要執行一些基本的建立、更新、刪除和— 最重要的— 讀取記錄等操作。由於Web 應用程式的後台資料庫通常都是關聯式資料庫,因此這些CRUD 操作都是使用眾所周知的SQL 語言執行的。但是,隨著Web 開發越來越多地採用物件導向的程式設計(OOP),模型也隨之改變。
資源描述框架(Resource Description Framework,RDF)是描述物件同時保留資料意義的理想方法。簡單協定和RDF 查詢語言(Simple Protocol and RDF Query Language,SPARQL — 發音為「sparkle」)是通常用於針對該資料進行查詢的語言,因為它在語句構成上匹配RDF 本身的結構。 RDF 和SPARQL 都是所謂語意Web 堆疊(semantic Web stack)中的技術。
要徹底應用語意Web 概念,您可以使用SPARQL 將傳統的Web 開發技術應用到RDF 資料中。本文將展示如何使用簡化的模式—視圖—控制器(Model-View-Controller,MVC)設計模型、PHP 伺服器端腳本語言和SPARQL 連接到RDF — 與使用關聯式資料庫系統中的SQL 相反。
SQL 和SPARQL CRUD 操作
先決條件本文假定您基本上了解SQL、PHP 和Web 應用程式開發。了解語意Web 也十分有利。若要對基於語意Web 的資料執行create、update 和delete 指令,需要具有支援SPARQL/Update 規範的語意Web 資料庫。
在使用SQL 和SPARQL 進行開發時,需要查看CRUD 操作之間的異同。清單1 顯示了read 操作的SQL 程式碼。
SELECT realname, dob, locationFROM UserTable WHERE realname = "John Smith";
將這段基於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" }