跳转到内容

从 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 接口,以代替这种拼接。

华夏公益教科书