跳轉到內容

從 RDF 圖表化 XQuery

來自華夏公益教科書

如果所有三元組都被圖形化,RDF 圖形會非常複雜。通常需要的是對該圖形的投影,以顯示特定方面。在本例中,我們使用 SPARQL 查詢從三元組儲存中提取派生三元組,並使用 XSLT 將其轉換為 Graphviz 處理的點格式。

三元組儲存

[編輯 | 編輯原始碼]

源資料是關於大學系、其提供的模組以及相關人員的集合。三元組儲存在 Talis Data Incubator 提供的儲存中 http://dataincubator.org/

我們想要構建的此資料檢視是員工之間“審查”關係的圖形。當一個模組的模組負責人是 Y,而內部主持人是 X 時,員工 X 會審查另一個員工 Y。

構建這種關係的 SPARQL 查詢是 

PREFIX p: <http://www.cems.uwe.ac.uk/rdffold/vocab/>
PREFIX rdfs:  <http://www.w3.org/2000/01/rdf-schema#>

 select  ?from ?to ?label
 where  {
  ?run p:Internal_Moderator ?im.
  ?im rdfs:label ?from.
  ?run p:Module_Leader ?ml.
  ?ml rdfs:label ?to.
  ?run p:module ?mod.
  ?mod p:shortCode ?label.
 }

此查詢構建了一組新的三元組,每個三元組對應一個稽核關係。三元組的各個部分被命名為 from、to 和 label,以便可以將轉換為點進行泛化。結果以 SPARQL XML 結果格式返回。

轉換為點由通用的 XSLT 完成

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:s="http://www.w3.org/2005/sparql-results#" version="1.0">
    <xsl:output method="text"/>
    <xsl:variable name="nl">
        <xsl:text>
</xsl:text>
    </xsl:variable>
    <xsl:template match="/s:sparql/s:results">
        <xsl:text>digraph</xsl:text>
        <xsl:text>{ rankdir=LR;</xsl:text>
        <xsl:apply-templates select="*"/>
        <xsl:text>}</xsl:text>
        <xsl:value-of select="$nl"/>
    </xsl:template>
    <xsl:template match="s:result">
        <xsl:text>"</xsl:text>
        <xsl:value-of select="s:binding[@name='from']/s:literal"/>
        <xsl:text>" -&gt; "</xsl:text>
        <xsl:value-of select="s:binding[@name='to']/s:literal"/>
        <xsl:text>" [label="</xsl:text>
        <xsl:value-of select="s:binding[@name='label']/s:literal"/>
        <xsl:text>"];</xsl:text>
        <xsl:value-of select="$nl"/>
    </xsl:template>
</xsl:stylesheet>

提取這些三元組並返回點檔案的 XQuery 指令碼是 

declare variable $service := "http://api.talis.com/stores/cwallace-dev2/services/sparql";

declare variable $query := "
PREFIX p: <http://www.cems.uwe.ac.uk/rdffold/vocab/>
PREFIX rdfs:  <http://www.w3.org/2000/01/rdf-schema#>

 select  ?from ?to ?label
 where  {
  ?run p:Internal_Moderator ?im.
  ?im rdfs:label ?from.
  ?run p:Module_Leader ?ml.
  ?ml rdfs:label ?to.
  ?run p:module ?mod.
  ?mod p:shortCode ?label.
 }
";

let $sparql := concat($service,"?query=",encode-for-uri($query) )
let $result :=  doc($sparql)
let $serialize := util:declare-option("exist:serialize","method=text media-type=text/text")
let $xsl := doc("/db/apps/rdf/assets/sparqlResult2dot.xsl")
return 
   transform:transform($result,$xsl,())

轉換為圖形

[編輯 | 編輯原始碼]

為了轉換為圖形,我們使用了西英格蘭大學提供的服務。該服務接受點檔案的 URL,將檔案傳遞給本地安裝的 Graphviz,並將結果以 PNG、JPG 或 SVG 格式返回。

http://www.cems.uwe.ac.uk/~cjwallac/apps/services/dot2media-v2.php?output=png&url=http://kitwallace.co.uk/rdf/xquery/reviewers.xq

我們已經實現了一個小的轉換管道

  tripleStore ->(SPARQL) -> SPARQL Result -> (XSLT) -> dot -> (graphviz) -> SVG

XSLT 是通用的,因此任何包含 from、to 和 label 三元組的 SPARQL 查詢返回都可以被圖形化。

點檔案當前由 PHP 指令碼拉取,因為一般情況下它太大而無法作為引數傳遞。eXist 模組應該可以使用,以便與本地版本的 Graphviz 介面,以代替這種拼接。

華夏公益教科書