簡體   English   中英

XQuery:將XML轉換為RDF

[英]XQuery: convert XML to RDF

我正在嘗試使用XQuery將XML轉換為RDF(RDF / XML語法)。 我想我遇到了我無法克服的事情...

test.xqy:

declare namespace rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#";
declare namespace owl="http://www.w3.org/2002/07/owl#";
declare namespace xsd="http://www.w3.org/2001/XMLSchema#";
declare namespace rdfs="http://www.w3.org/2000/01/rdf-schema#";

import module namespace functx="http://www.functx.com";

declare variable $srcDoc:="test.xml";
declare variable $defaultXMLNS:="http://www.test.com#";
declare variable $defaultXMLBase:=$defaultXMLNS;


declare function local:getQName($local as xs:string?)
as xs:QName?
{
  QName($defaultXMLNS, $local)
};

declare function local:namedIndividualConstructor($pnode as node()*)
as node()*
{
  element owl:NamedIndividual
  {
    (:to avoid repeated names, unique uuid is generated for each individuals:)
    attribute rdf:about {concat("#", random:uuid(), "_", $pnode/name())},
    element rdf:type {attribute rdf:resource {concat("#", $pnode/name())}},

    for $x in $pnode/*
    return element {local:getQName(concat($pnode/name(), "_", $x/name()))}
    {
      attribute rdf:resource {}
    }

  }
};

element rdf:RDF
{
  namespace {""} {$defaultXMLNS},
  attribute xml:base {$defaultXMLBase},
  element owl:Ontology
  {
    attribute rdf:about {$defaultXMLNS}
  },
  for $x in doc($srcDoc)//*
  return if($x[not(child::*)])
  then ()
  (:only generate namedIndividual for nodes having leaf nodes:)
  else local:namedIndividualConstructor($x)
}

的test.xml:

<?xml version="1.0" encoding="UTF-8"?>
<breakfast_menu>
<food>
  <name>French Toast aaa</name>
  <price>$5.95</price>
  <description>Our famous Belgian Waffles with plenty of real maple syrup</description>
  <calories>650</calories>
</food>
<food>
  <name>French Toast</name>
  <price>$4.50</price>
  <description>Thick slices made from our homemade sourdough bread</description>
  <calories>600</calories>
</food>
<food>
  <name>Homestyle Breakfast</name>
  <price>$6.95</price>
  <description>Two eggs, bacon or sausage, toast, and our ever-popular hash browns</description>
  <calories>950</calories>
</food>
</breakfast_menu>

命令行:

basex -o testxqyoutput.rdf test.xqy

testxqyoutput.rdf:

<rdf:RDF xmlns="http://www.test.com#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xml:base="http://www.test.com#">
  <owl:Ontology xmlns:owl="http://www.w3.org/2002/07/owl#" rdf:about="http://www.test.com#"/>
  <owl:NamedIndividual xmlns:owl="http://www.w3.org/2002/07/owl#" rdf:about="#82ab6f48-2faf-4782-840f-59e6e96403ef_breakfast_menu">
    <rdf:type rdf:resource="#breakfast_menu"/>
    <breakfast_menu_food rdf:resource=""/>
    <breakfast_menu_food rdf:resource=""/>
    <breakfast_menu_food rdf:resource=""/>
  </owl:NamedIndividual>
  <owl:NamedIndividual xmlns:owl="http://www.w3.org/2002/07/owl#" rdf:about="#04f02acc-da19-47a7-a69a-98cc958efbbd_food">
    <rdf:type rdf:resource="#food"/>
    <food_name rdf:resource=""/>
    <food_price rdf:resource=""/>
    <food_description rdf:resource=""/>
    <food_calories rdf:resource=""/>
  </owl:NamedIndividual>
  <owl:NamedIndividual xmlns:owl="http://www.w3.org/2002/07/owl#" rdf:about="#bfec0a13-ac56-4ac8-a9bb-0575b16e601a_food">
    <rdf:type rdf:resource="#food"/>
    <food_name rdf:resource=""/>
    <food_price rdf:resource=""/>
    <food_description rdf:resource=""/>
    <food_calories rdf:resource=""/>
  </owl:NamedIndividual>
  <owl:NamedIndividual xmlns:owl="http://www.w3.org/2002/07/owl#" rdf:about="#7f6411cb-3619-4b61-8b78-3b1e8ec99898_food">
    <rdf:type rdf:resource="#food"/>
    <food_name rdf:resource=""/>
    <food_price rdf:resource=""/>
    <food_description rdf:resource=""/>
    <food_calories rdf:resource=""/>
  </owl:NamedIndividual>
</rdf:RDF>

我使用uuid來避免子元素重復,因此對於不同的<food> ,有不同的名稱。 輸出testxqyoutput.rdf可能看起來不像有效的rdf文件,我丟棄了一些與源代碼無關的細節。 真正的問題是:我不知道如何為rdf:resource分配相應的名稱。

第一個生成的NamedIndividual應該如下所示:

<owl:NamedIndividual xmlns:owl="http://www.w3.org/2002/07/owl#" rdf:about="#82ab6f48-2faf-4782-840f-59e6e96403ef_breakfast_menu">
    <rdf:type rdf:resource="#breakfast_menu"/>
    <breakfast_menu_food rdf:resource="#04f02acc-da19-47a7-a69a-98cc958efbbd_food"/>
    <breakfast_menu_food rdf:resource="#bfec0a13-ac56-4ac8-a9bb-0575b16e601a_food"/>
    <breakfast_menu_food rdf:resource="#7f6411cb-3619-4b61-8b78-3b1e8ec99898_food"/>
</owl:NamedIndividual>
<owl:NamedIndividual xmlns:owl="http://www.w3.org/2002/07/owl#" rdf:about="#04f02acc-da19-47a7-a69a-98cc958efbbd_food">
        <rdf:type rdf:resource="#food"/>
        <food_name rdf:resource=""/>
        <food_price rdf:resource=""/>
        <food_description rdf:resource=""/>
        <food_calories rdf:resource=""/>
      </owl:NamedIndividual>
      <owl:NamedIndividual xmlns:owl="http://www.w3.org/2002/07/owl#" rdf:about="#bfec0a13-ac56-4ac8-a9bb-0575b16e601a_food">
        <rdf:type rdf:resource="#food"/>
        <food_name rdf:resource=""/>
        <food_price rdf:resource=""/>
        <food_description rdf:resource=""/>
        <food_calories rdf:resource=""/>
      </owl:NamedIndividual>
      <owl:NamedIndividual xmlns:owl="http://www.w3.org/2002/07/owl#" rdf:about="#7f6411cb-3619-4b61-8b78-3b1e8ec99898_food">
        <rdf:type rdf:resource="#food"/>
        <food_name rdf:resource=""/>
        <food_price rdf:resource=""/>
        <food_description rdf:resource=""/>
        <food_calories rdf:resource=""/>
      </owl:NamedIndividual>

如何修改代碼以實現此有效輸出? 我認為真正的問題是:XQuery是函數式編程語言。 並且所有NamedIndividuals都是由一個函數生成的。 無法在功能之間共享狀態。 而且XQuery中沒有概念global variable ...

我希望這樣的事情可以工作。 此外,我是否對您代碼中的attribute rdf:resource {}沒有任何作用,因為它為空?

declare function local:namedIndividualConstructor($pnode as node()*)
as node()*
{
  (:to avoid repeated names, unique uuid is generated for each individuals:)
  let $id := concat("#", random:uuid(), "_", $pnode/name())
  element owl:NamedIndividual
  {
    attribute rdf:about {$id},
    element rdf:type {attribute rdf:resource {concat("#", $pnode/name())}},

    for $x in $pnode/*
    return element {local:getQName(concat($pnode/name(), "_", $x/name()))}
    {
      attribute rdf:resource {$id}
    }

  }
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM