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