1

だから私はこれらの2つのXMLファイルを持っています:

data.xml

<datas>
  <data id="1"><place>Mu</place></data>
  <data id="2"><place>Atlantis</place></data>
  ...
  <data id="28492"><place>Mu</place></data>
</datas>

ingrs.xml

<ingrs>
  <ingr id="1">...</ingr>
  <ingr id="2">...</ingr>
  ...
  <ingr id="83882">...</ingr>
</ingrs>

最初に行うことは、必要なデータの ID のみを保持することです。しかし、ファイルの 83882 個の ingr をスキャンする代わりに、同じ id (一意) を持つ ingr をすばやく見つける for ステートメントを実行したいと考えています。

let $ids := //data[./place = 'Mu']/@id return
  for $i in //ingr
  where() (: what to do here ? Something like $i/@id = $ids :)
  return $i
4

1 に答える 1

1

最初に行うことは、必要なデータの ID のみを保持することです。idしかし、ファイルの 83882 個の ingr をスキャンする代わりに、同じ (一意の) ingr をすばやく見つける for ステートメントを実行したいと考えてい ます。

これを行うための「より迅速な」方法が標準の XQuery で可能であるとは思いません。以下のクエリは、依然として O(N*M) という最悪の時間の複雑さを持っていますN。2 つの XML ドキュメント。Mdataingr

XSLT では、他のノードの関数である任意のノードにキー (インデックス) を定義でき、このインデックスを使用すると、O(1) に近い高速検索を生成できます。

使用:

let $doc1 :=
    <datas>
      <data id="1"><place>Mu</place></data>
      <data id="2"><place>Atlantis</place></data>
      ...
      <data id="28492"><place>Mu</place></data>
    </datas>

    , $doc2 :=
        <ingrs>
          <ingr id="1">...</ingr>
          <ingr id="2">...</ingr>
          ...
          <ingr id="83882">...</ingr>
        </ingrs>,
        $data := $doc1//data[place='Mu'],
        $ids := $data/@id
  return
    ($data, $doc2//ingr[@id = $ids])
于 2012-12-23T20:53:56.250 に答える