歡迎您光臨本站 註冊首頁

藉助語義技術構建 Wikipedia 查詢表單

←手機掃碼閱讀     火星人 @ 2014-03-12 , reply:0
  
通過提供對大量 Linked Data 的開放訪問,公共的 SPARQL 端點為您的應用程序提供了很棒的數據,進而推動了語義 Web 的發展。正如很多其他受數據驅動的 Web 站點一樣,可以通過向這些端點發送一個查詢、然後再將結果包裝在 HTML 標籤內的方式創建一個 Web 頁面;SPARQL 端點的一個與眾不同之處在於這些新數據是公開可用的,可用在您的應用程序中。本文展示了如何通過簡單的 CGI 腳本從兩個不同的 SPARQL 端點獲得數據並構建應用程序以解答用戶的兩個問題:在兩個導演的電影中都出現過的演員有哪些以及哪些藝人發布過哪些專輯。
常用縮寫詞
  • CSS:級聯樣式表(Cascading stylesheet)
  • CGI:通用網關介面(Common Gateway Interface)
  • HTML:超文本標記語言(Hypertext Markup Language)
  • HTTP:超文本轉換協議(Hypertext Transfer Protocol)
  • JSON:JavaScript Object Notation
  • RDBMS:關係型資料庫管理系統(Relational Database Management System)
  • RDF:資源描述框架(Resource Description Framework)
  • REST:具象狀態轉換(Representational State Transfer)
  • SPARQL:SPARQL Protocol and RDF Query Language
  • URI:統一資源標識符(Uniform Resource Identifier)
  • URL:統一資源定位符(Uniform Resource Locator)
  • XML:可擴展標記語言(Extensible Markup Language)

SPARQL 端點通過查詢提供了對資料庫的訪問,而這些查詢使用的是 W3C 標準的 SPARQL 查詢語言。越來越多的這類數據出現在公共 internet 上,應用程序可以檢索和使用這類數據,方式與檢索和使用關係型資料庫數據一樣。了解了 SPARQL 之後,您就可以將這種語言的查詢融入到應用程序內,使其不再類似於您以前所編寫的那些應用程序,您(以及在您編寫了這些應用程序后獲得的用戶)將能夠訪問所有類型的新數據。

本文將討論兩個應用程序的示例,它們可以顯示用戶友好的表單、查詢資料庫的 SPARQL 端點並給出結果,而這一切都不要求表單用戶知道遞送該數據所用的技術和標準。本文所附的 zip 文件包含了所有示例文件,請參見 下載。第一個應用程序允許指定兩個電影導演,然後檢索出現在二者所執導電影中的所有演員的姓名;第二個應用程序檢索有關藝人專輯的信息。

對於諸多受數據驅動的 Web 站點,這兩個應用程序的基本架構均遵循如下模式:

  1. 用戶在 Web 表單內輸入一個或多個查詢條件並單擊 Submit。
  2. 表單將所輸入的值傳遞給一個 CGI 腳本。
  3. 這個 CGI 腳本將這些值插入查詢並將此查詢發送到資料庫伺服器。
  4. 此伺服器將查詢結果返回給 CGI 腳本,該腳本圍繞所返回的數據構建一個 HTML 頁面並將頁面發送至用戶的瀏覽器。

這一模式與 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 執導的電影名:


清單 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 內,變數以問號開頭。上述查詢使用的是三元組,並且變數插在特定位置來描述想要返回的電影標題需要滿足的三個條件:

  • RDF 使用 URI 作為標識符,但我們希望此資料庫檢索可讀懂的電影標題。在此查詢內,?film 變數代表的是電影的 URI 標識符。電影的 ?filmTitle 是一個 rdfs:label,而這正是查詢在 SELECT 語句所要尋找的。rdfs:label 謂語以 RDF Schema 標準定義,而查詢第二行中的名稱空間聲明所描述的恰好就是 rdfs 前綴所指代的內容。
  • 電影導演的標識符是 ?dir。
  • 由於 ?dir 代表的是導演的 URI 標識符,而我們想要的是導演的實際姓名,因此查詢要求獲得 m:director_name 值為 Sofia Coppola 的 ?dir。此查詢開始處的另一個名稱空間聲明表明 m 前綴所指代的是什麼。我之所以知道 director_name 是可以使用的正確的謂詞名稱,是因為在編寫這個查詢之前,我已經查找過 linkedmdb.org 數據使用過的名稱了,正如我在創建 XQuery 或 SQL 查詢之前,先查證 XML 或 RDBMS 模式使用的名稱一樣。若想對此進行深入了解,可以從任何一個 SPARQL 端點藉助一個簡單的 SPARQL 查詢,這個查詢的基本意思應該是 “為我顯示在所有的三元組中可用的所有謂詞,但不能重複”:
SELECT DISTINCT ?p WHERE {?s ?p ?o}

很多 SPARQL 端點,包括 linkedmdb.org 上的這個,都會提供基於表單的界面來嘗試使用 SPARQL 查詢。若訪問它們的 SNORQL 表單,粘貼進上述兩個查詢中的任何一個,並單擊 Go!,應該會看到由 Sofia Coppola 執導的電影的一個列表。(如果默認 Results: 設置無法工作,可以嘗試其他的設置,特別是 JSON 格式的,這也是在我們的應用程序中將要使用的格式。)

清單 2 所示的是另一個可在 linkedmdb.org 的 SNORQL 表單上嘗試使用的查詢。這個查詢會列出在 Sofia Coppola 執導的電影中出現的所有演員:


清單 2. 檢索演員的查詢
				  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. 應用程序用戶利用 圖 1 所示的表單輸入兩個導演的名字。



    圖 1. commonActors 應用程序的輸入表單


  2. 表單將這兩個導演的名字傳遞給 commonActors.cgi CGI 腳本。
  3. CGI 腳本將這兩個導演的名字插入 SPARQL 查詢並將此查詢發送至位於 http://data.linkedmdb.org/sparql 的 linkedmdb.org SPARQL 端點。
  4. SPARQL 端點返回 JSON 版本的結果,CGI 腳本圍繞所返回的數據構建一個 HTML 頁面並將頁面發送至用戶的瀏覽器。


[火星人 ] 藉助語義技術構建 Wikipedia 查詢表單已經有404次圍觀

http://coctec.com/docs/linux/show-post-68742.html