首頁‎ > ‎電子期刊‎ > ‎Semantic MediaWiki‎ > ‎

再談Semantic MediaWiki(下)


Semantic Template多值輸入問題

Semantic MediaWiki的使用可藉由Semantic Template來簡化,然而在使用Semantic Template時會遇到一個問題,就是當我們在呼叫Semantic Template時如何將一個屬性輸入多值,舉例而言下面頁面名稱為 Template:會議 的Semantic Template在應與會人員、列席人員、未出席人員這三個屬性可以有多個屬性值,但是藉由樣版的呼叫卻無法傳入多值,有一種作法是有應與會人員一、應與會人員二....的多個變數或是這三個屬性不放置於Semantic Template而直接於引用樣版的頁面中鍵入。但上述兩種作法都顯得不夠聰明。

 
* 會議時間:[[開始時間:={{{開始時間}}}]] ~ [[結束時間:={{{結束時間}}}]]
* 應與會人員:[[應與會人員:={{{應與會人員}}}}}]]
* 列席人員:[[列席人員:={{{列席人員}}}]]
* 未出席人員:[[未出席人員:={{{未出席人員}}}]]
* 會議主持:[[會議主持:={{{會議主持}}}]]
* 會議記錄:[[會議記錄:={{{會議記錄}}}]]

[[Category:會議]]

筆者的作法是寫了個MediaWiki的Parser Function來解決這個問題,在傳入參數的部份可以用 , 號隔開傳入多個人名,並且人名後可以加上 * 號為顯示名稱,程式會解析輸入的字串,再轉換成Semantic MediaWiki語法以解決多值輸入的問題;其用法及程式碼如下:

 
{{#multiattribute:屬性名稱|屬性值*顯示屬性值,屬性值*顯示屬性值}}

{{#multirelation:關係名稱|關係名稱*顯示關係值,關係名稱*顯示關係值}}

讀者若要使用下述的程式碼請依下面的步驟:

  1. 將程式碼儲存為SMWMultiValue.php檔案。
  2. 將SMWMultiValue.php檔案放置於MediaWiki的extensions目錄。
 
<?php
 
# Define a setup function
$wgExtensionFunctions[] = 'wfSMWMultiValueParserFunction_Setup';
 
# Add a hook to initialise the magic word
$wgHooks['LanguageGetMagic'][] = 'wfSMWMultiValueParserFunction_Magic';
 
function wfSMWMultiValueParserFunction_Setup() {
global $wgParser;
 
# Set a function hook associating the "multivalue" magic word with our function
$wgParser->setFunctionHook( 'multiattribute', 'wfMultiAttributeValueParserFunction_Render' );
$wgParser->setFunctionHook( 'multirelation', 'wfMultiRelationValueParserFunction_Render' );
}
 
function wfSMWMultiValueParserFunction_Magic( &$magicWords, $langCode ) {
# Add the magic word
# The first array element is case sensitive, in this case it is not case sensitive
# All remaining elements are synonyms for our parser function
$magicWords['multiattribute'] = array( 0, 'multiattribute' );
$magicWords['multirelation'] = array(1,'multirelation');
# unless we return true, other parser functions extensions won't get loaded.
return true;
}
 
function wfMultiAttributeValueParserFunction_Render( &$parser, $param1 = '', $param2 = '' ) {
 
$output="";
$tok = strtok($param2, ",");
 
while ($tok!=false)
{
 
$line = explode("*", $tok);
 
if (count($line) >= 2) {
$output.="[[$param1:=$line[0]|$line[1]]],";
}else
$output.="[[$param1:=$line[0]]],";
 
$tok = strtok(",");
 
}
 
return substr($output,0,strlen($output)-1);
}
 
 
function wfMultiRelationValueParserFunction_Render( &$parser, $param1 = '', $param2 = '' ) {
 
$output="";
$tok = strtok($param2, ",");
 
 
while ($tok!=false)
{
 
$line = explode("*", $tok);
 
if (count($line) >= 2) {
$output.="[[$param1::$line[0]|$line[1]]],";
}else
$output.="[[$param1::$line[0]]],";
 
$tok = strtok(",");
 
}
 
return substr($output,0,strlen($output)-1);
}
 
?>

有了上述的程式碼後我們可以改寫呼叫Semantic Template的方式及Semantic Template及如下:

 
{{會議
|開始時間=2007-10-1 10:30
|結束時間=2007-10-1 12:00
|應與會人員=王小明,王大明,王爸爸,王媽媽
|列席人員=
|未出席人員=
|會議主持=
|會議記錄=
}}


 
* 會議時間:[[開始時間:={{{開始時間}}}]] ~ [[結束時間:={{{結束時間}}}]]
* 應與會人員:{{#multiattribute:應與會人員|{{{應與會人員}}}}}
* 列席人員:{{#multiattribute:列席人員|{{{列席人員}}}}}
* 未出席人員:{{#multiattribute:未出席人員|{{{未出席人員}}}}}
* 會議主持:[[會議主持:={{{會議主持}}}]]
* 會議記錄:[[會議記錄:={{{會議記錄}}}]]

[[Category:會議]]

Semantic Template預設值問題

我們在呼叫Semantic Template時有些欄位值使用者可能不會填,遇到這種情況,我們希望在Semantic Template中能判斷傳進來的參數是否為空值,若是空值的話希望給一個預設值。

要在樣版中判斷某個變數的值,這樣的功能需要安裝另外一個外掛ParserFunctions,其中有許多的程式語言語法可以使用;安裝好後即可判斷變數,以下的範例為判斷傳入的參數是否為空值,若為空值的話將其設為未開始

 
* 狀態:[[狀態:={{ #if: {{{狀態|}}} | {{{狀態}}} | 未開始 }}]]


Subquery

在Semantic Query裡有種較複雜的查詢稱之為Subquery,舉例而言在Wiki頁面中描述王爸爸與王小明是父子關係,而王爺爺與王爸爸也是父子關係;那麼我們要如何下Semantic Query的語法查詢出王小明的爺爺是誰呢?

我們詳細來看王爸爸與王爺爺的頁面:

 
  王爸爸的頁面
[[父子關係::王小明]]
 
  王爺爺的頁面
[[父子關係::王爸爸]]


假設我們要單純的用Semantic Qeury查詢出王小明的父親,我們可以這樣下:

  
 
<ask>[[父子關係::王小明]]</ask>

若我們要查詢出王小明的爺爺,藉由上述的關係,可以將選出的頁面再進行查詢,下面查詢的意思是將與王小明關係為父子關係的頁面查詢出來,所以會查詢出來是王爸爸的頁面,接下來會再查詢與王爸爸關係為父子關係的頁面查詢出來,也就是王爺爺的頁面,所以整句查詢的意思就是查詢出王小明的父親的父親,也就是王小明的爺爺

 
  <ask>父子關係::<q>[[父子關係::王小明]]</q></ask>

Subquery的觀念會比較難理解,希望藉由上述的例子能讓讀者瞭解,在英文Semantic MediaWiki的說明中稱之為Chains of relations and attributes,有興趣的讀者可以再深入閱讀。

至此我們發覺雖然Semantic Query還比不上資料庫查詢語法SQL來的強大,但是藉由簡易的定義屬性(Attribute)及關係(Relation),能讓使用者易於上手,比起 喊了許多年的Semantic Web,Semantic MediaWiki給了使用者一個實務解決問題的答案。

Semantic MediaWiki系列文章結語

筆者關於Semantic MediaWiki的文章共寫了五篇,從觀念性的探討、技術性的問題解決到實例分享都有;希望介紹給讀者這一個好用的工具,筆者目前是Semantic MediaWiki的深度使用者,平常整理資料都會加上Ontology,以方便自己整理及尋找。

在您看完了這一系列的文章,有幾個問題筆者想請教您,歡迎您來信告訴我您的想法:

  1. 您是否清楚為何要發展Semantic MeidaWiki這個專案,這個專案未來會對Wikipedia以及網路趨勢的發展您是如何看待的?
  2. 您覺得Semantic MediaWiki的語法是否夠清楚簡單,能夠讓您快速上手使用?
  3. Semantic Query語法您是否能夠理解並且使用?
  4. Semantic MediaWiki還缺乏哪些功能是您需要的,或是哪些新功能是您期待能加入的?
  5. 您覺得Semantic MediaWiki配合MediaWiki軟體是否適合用來做個人或組織的知識管理系統,或者您心中有更好的選擇?

底下是筆者整理Semantic MediaWiki系列文章的重點給您參考:

  1. Semantic Web的觀念由來以久,但是一直以來缺乏實用的架構或是工具來幫助使用者感受到Semantic Web的用處;Semantic Web的理想是把全世界的網頁都加上Ontology,以讓知識的使用及查詢更為方便。
  2. 為何Wikipeida要導入Semantic Web的觀念,在Wikipeida上的許多資料除了內外部連結以及分類外需要更多資料間的語意關連性;舉例而言在Wikipeida上有許多名人的頁面,能否查詢出1960之後出生的資訊安全專案。
  3. Semantic MediaWiki只新增了兩種語法用來描述屬性及關係,藉由Semantic Template以至於Semantic Forms可進一步簡化Semantic MediaWiki的使用,不僅單單適合於做資料的整理,也適合開發出小型的、半結構化式的資訊系統。
  4. 在頁面加入Ontology的描述後,Semantic Query是之後最重要的應用,藉由Semantic MediaWiki在原本非結構化的資訊中加入結構化資訊;一方面符合文字描述的鬆散結構,另一方面加入了Ontology也可藉由Semantic Query將資料有效的匯整。

Comments