從 RDF 圖表化 XQuery
外觀
< 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>" -> "</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 格式返回。
我們已經實現了一個小的轉換管道
tripleStore ->(SPARQL) -> SPARQL Result -> (XSLT) -> dot -> (graphviz) -> SVG
XSLT 是通用的,因此任何包含 from、to 和 label 三元組的 SPARQL 查詢返回都可以被圖形化。
點檔案當前由 PHP 指令碼拉取,因為一般情況下它太大而無法作為引數傳遞。eXist 模組應該可以使用,以便與本地版本的 Graphviz 介面,以代替這種拼接。