跳转到内容

XQuery/图形化三元组

来自维基教科书,开放的书籍,开放的世界

RDF 验证服务 可用于绘制 RDF 图,但由于这将前缀名扩展为完整 URI,因此图表作为示例可能看起来不太易读。

此服务用于绘制简单的三元组图,其中每个三元组都在一个本地 XML 格式中定义,其中每个三元组都具有属性 subject、property 和 object。[需要将 RDF 转换为 N3 的 XQuery 函数]

主体和宾语被绘制为节点,三元组被绘制为带有属性作为标签的弧。如果主体或宾语包含 ':' 或以 'http://' 开头,则节点将显示为椭圆形。如果它以 '_' 开头,则它是一个空节点,并且显示一个未命名的圆圈;否则,假设节点是一个文字,并在方框中绘制。

[1]

标题文本

[编辑 | 编辑源代码]
  • url : 以上面说明的 xml 格式中的三元组的 url
  • dir : LR - 从左到右 (默认),TB - 从上到下 [Graphviz 中的 rankdir]
  • title : 图表的标题 - 默认无

来自 RDF primer 第 11 页

<?xml version="1.0" encoding="UTF-8"?>
<graph>
    <triple subject="exstaff:85740" property="exterms:address" object="exaddressid:87540"/>
    <triple subject="exaddressid:87540" property="exterms:street" object="1501 Grant Avenue"/>
    <triple subject="exaddressid:87540" property="exterms:city" object="Bedford"/>
    <triple subject="exaddressid:87540" property="exterms:state" object="Massachusetts"/>
    <triple subject="exaddressid:87540" property="exterms:postalcode" object="01730"/>
</graph>

dot 输出

digraph { rankdir='LR' 
"exstaff:85740" [label="exstaff:85740" shape=ellipse];
"exaddressid:87540" [label="exaddressid:87540" shape=ellipse];
"1501 Grant Avenue" [label="1501 Grant Avenue" shape=box];
"Bedford" [label="Bedford" shape=box];
"Massachusetts" [label="Massachusetts" shape=box];
"01730" [label="01730" shape=box];
"exstaff:85740" -> "exaddressid:87540" [label="exterms:address"];
"exaddressid:87540" -> "1501 Grant Avenue" [label="exterms:street"];
"exaddressid:87540" -> "Bedford" [label="exterms:city"];
"exaddressid:87540" -> "Massachusetts" [label="exterms:state"];
"exaddressid:87540" -> "01730" [label="exterms:postalcode"];
} 

GIF 图像

http://www.cems.uwe.ac.uk/~cjwallac/apps/services/dot2media-v2.php?url=http://kitwallace.co.uk/rdf/xquery/triple2dot.xq?url%3Dhttp://kitwallace.co.uk/rdf/data/triplesExample.xml

要么保存生成的 gif,要么使用 5clicks 或类似工具来捕获屏幕上的图像。打印大型 GIF 图像的一种方法是保存图像,然后将其插入到 Excel 电子表格中。Excel 会将图像打印在多个页面上。缩小尺寸并删除页面边框后,即使是大型图表也可以打印出来,然后粘贴在一起。

declare option exist:serialize "method=text media-type=text/text";
declare variable $nl := "&#10;";
declare variable $url := request:get-parameter("url",());
declare variable $dir := request:get-parameter("dir","LR");
declare variable $title := request:get-parameter("title","");

let $graph := doc($url)
return   ( 
  "digraph ",$title, " { rankdir='" , $dir,"' ", $nl,
   for $node in distinct-values(($graph//triple/@subject,$graph//triple/@object))
   let $nodetype := 
     if (contains($node,":") or starts-with ($node,"http://")) 
     then concat ('label="',$node,'" shape=ellipse') 
     else if (starts-with($node,"_"))
     then 'shape=circle'
     else concat ('label="',$node,'" shape=box') 
   return 
     concat ('"',$node,'" [',$nodetype,'];',$nl)
    ,
     for $triple in $graph//triple
     return 
      ( concat ('"', $triple/@subject, '" -> "' , $triple/@object ,'" [label="',$triple/@property, '"];'), $nl)
    ,
   "} ",$nl
)

此脚本可以通过使用中间 XML 结构和 XSLT 脚本转换为点来改进。

华夏公益教科书