带有类名的XQuery本体视图

时间:2012-10-18 11:51:07

标签: xml xquery

所以我提供了一个大的XML文档。我必须编写一个查询,给定一个类名和本体名称,将计算一个本体视图,其中包含与该类相关的文档的本体部分。更准确地说,我需要选择类的子类,实例和与类相关的规则。我想要递归地做这件事。

知道如何轻松完成这项工作?

1 个答案:

答案 0 :(得分:1)

您可以通过递归函数下降文档中定义的类层次结构:

declare default element namespace "http://omdoc.org/ns";
declare namespace om = "http://www.openmath.org/OpenMath";

declare function local:class-hierarchy(
  $doc as document-node(),
  $classname as xs:string
) as node() {
  <class name='{$classname}'> {
    for $OMA in $doc//axiom/FMP/om:OMOBJ/om:OMA
    where $OMA/om:OMS[1]/@name = 'subclass'
      and $OMA/om:OMS[3]/@name = $classname
    return local:class-hierarchy($doc, $OMA/om:OMS[2]/@name)
  }</class>
};

该函数返回表示子类关系的嵌套元素。例如,Device的子类可以按如下方式计算:

let $doc := fn:doc("http://rasdaman.flanche.net/dbwa/Assignment5/example.omdoc"),
    $class := 'Device'
return local:class-hierarchy($doc, $class)

结果:

<class xmlns="http://omdoc.org/ns" name="Device">
  <class name="Camera">
    <class name="DSLR"/>
  </class>
</class>

您可以轻松地调整此函数以返回相应类的规则和实例。