通過提供對大量 Linked Data 的開放訪問,公共的 SPARQL 端點為您的應用程序提供了很棒的數據,進而推動了語義 Web 的發展。正如很多其他受數據驅動的 Web 站點一樣,可以通過向這些端點發送一個查詢、然後再將結果包裝在 HTML 標籤內的方式創建一個 Web 頁面;SPARQL 端點的一個與眾不同之處在於這些新數據是公開可用的,可用在您的應用程序中。本文展示了如何通過簡單的 CGI 腳本從兩個不同的 SPARQL 端點獲得數據並構建應用程序以解答用戶的兩個問題:在兩個導演的電影中都出現過的演員有哪些以及哪些藝人發布過哪些專輯。
|
SPARQL 端點通過查詢提供了對資料庫的訪問,而這些查詢使用的是 W3C 標準的 SPARQL 查詢語言。越來越多的這類數據出現在公共 internet 上,應用程序可以檢索和使用這類數據,方式與檢索和使用關係型資料庫數據一樣。了解了 SPARQL 之後,您就可以將這種語言的查詢融入到應用程序內,使其不再類似於您以前所編寫的那些應用程序,您(以及在您編寫了這些應用程序后獲得的用戶)將能夠訪問所有類型的新數據。
本文將討論兩個應用程序的示例,它們可以顯示用戶友好的表單、查詢資料庫的 SPARQL 端點並給出結果,而這一切都不要求表單用戶知道遞送該數據所用的技術和標準。本文所附的 zip 文件包含了所有示例文件,請參見 下載。第一個應用程序允許指定兩個電影導演,然後檢索出現在二者所執導電影中的所有演員的姓名;第二個應用程序檢索有關藝人專輯的信息。
對於諸多受數據驅動的 Web 站點,這兩個應用程序的基本架構均遵循如下模式:
這一模式與 CGI 腳本一樣古老。惟一讓其出新意之處是這次使用的查詢語言是 SPARQL,而非為人熟知的 SQL。更讓人興奮的是,雖然 Internet 上供應用程序自由查詢的 SQL 資料庫為數不多,但是通過 SPARQL 介面(又稱 SPARQL 端點)可用的大型資料庫越來越多。實際上,這些 SPARQL 端點通常都是一些添加到現有關係型資料庫的額外介面。除了出現在公共 internet 上的 SPARQL 端點之外,其他的 SPARQL 端點均出現在企業防火牆背後以減輕對企業數據的跨部門查詢。
應用程序一:資料庫和查詢
第一個應用程序自動化針對特定資料庫的查詢遞送以及對所返回數據的格式化,我們不妨從其資料庫和查詢開始。Internet Movie Database (IMDb) 內包含大量有關已經製作完畢的所有英文影片的信息,它不接受您對信息的查詢。比如,如果我想知道有無演員既出現在由 Sofia Coppola 執導的電影,又出現在由她的父親 Francis Ford Coppola 導演的電影中時,我必須要訪問六個 IMDb Web 頁面來獲得由 Sofia 執導的電影,訪問 32 個頁面來獲得由她父親執導的電影,然後手動整理演員列表,然後進行交叉比對。
所幸的是,linkedmdb.org 的 Linked Movie Database 提供了一個包含電影信息的資料庫,可接受 SPARQL 查詢。比如,清單 1 中的查詢就是要讓它列出所有由 Sofia Coppola 執導的電影名:
PREFIX m: <http://data.linkedmdb.org/resource/movie/> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> SELECT ?filmTitle WHERE { ?film rdfs:label ?filmTitle. ?film m:director ?dir. ?dir m:director_name "Sofia Coppola". } |
SPARQL 被設計用來查詢以 RDF 數據模型表示的數據,這種數據模型用一個三元組來表示數據,每個三元組都具有一個主語、一個謂語和一個賓語。有時,為了方便,不妨將其看成是條目、屬性名、屬性和值。例如,比方說有這樣的三元組,其描述可以是: “ID 為 http://data.linkedmdb.org/resource/director/7764 的條目的 director_name 值為 ‘Sofia Coppola’。”
在 SPARQL 內,變數以問號開頭。上述查詢使用的是三元組,並且變數插在特定位置來描述想要返回的電影標題需要滿足的三個條件:
SELECT DISTINCT ?p WHERE {?s ?p ?o} |
很多 SPARQL 端點,包括 linkedmdb.org 上的這個,都會提供基於表單的界面來嘗試使用 SPARQL 查詢。若訪問它們的 SNORQL 表單,粘貼進上述兩個查詢中的任何一個,並單擊 Go!,應該會看到由 Sofia Coppola 執導的電影的一個列表。(如果默認 Results: 設置無法工作,可以嘗試其他的設置,特別是 JSON 格式的,這也是在我們的應用程序中將要使用的格式。)
清單 2 所示的是另一個可在 linkedmdb.org 的 SNORQL 表單上嘗試使用的查詢。這個查詢會列出在 Sofia Coppola 執導的電影中出現的所有演員:
PREFIX m: <http://data.linkedmdb.org/resource/movie/> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> SELECT ?actorName ?filmTitle WHERE { ?film rdfs:label ?filmTitle; m:director ?dir; m:actor ?actor. ?dir m:director_name "Sofia Coppola". ?actor m:actor_name ?actorName. } |
除了查詢她執導的電影的標題之外,此查詢還會查詢每部電影中的演員 — 或更甚者,查詢符合每部電影演員標識符的演員的姓名。在您的第一個查詢(以及大多數的 SPARQL 查詢)中,使用的是 URI 來標識您想要查找的數據,但是在輸出時列出的卻是與這些 URI 相關的可被人讀懂的標籤。這非常類似於 SQL 查詢使用產品 ID 值來交叉比對產品,而實際輸出時卻使用的是產品名稱。
此查詢還引入了一些 SPARQL 的簡略表述方式。它沒有拼寫出三個完整的三元組來表達希望得到與每部電影相關的標題、導演和演員數據,相反,它使用分號來表示謂語/賓語對 m:director ?dir 和 m:actor ?actor 與主語 ?film 的關係,正如謂語/賓語對 rdfs:label ?filmTitle 所做的一樣。
構建應用程序
第一個應用程序的目的是為了體現 linkedmdb.org 資料庫和 SPARQL 查詢語言的益處,而將實際的查詢和 URI 對應用程序的用戶隱藏起來。就上述系統的基礎架構而言,
應用程序用戶利用 圖 1 所示的表單輸入兩個導演的名字。
[火星人 ] 藉助語義技術構建 Wikipedia 查詢表單已經有404次圍觀