Возвращаемое значение функции xQuery не отображается - PullRequest
0 голосов
/ 12 мая 2018

Я пытаюсь завершить школьный домашний задание о поиске самой отдаленной страны (стран) в отношении количества пересечений границы с использованием графического интерфейса пользователя BaseX и базы данных mondial. Я написал рекурсивную функцию, используя BFS, чтобы завершить это. Запрос должен возвращать набор названий стран, наиболее удаленных от страны ввода.

Когда я вызвал функцию, указанную ниже, чтобы найти самую отдаленную страну для Никарагуа, должна быть возвращена группа названий стран, включая «Канада» и «Аргентина».

let $return-list := local:reachable-far($country[name="Nicaragua"])
return $return-list/country/name

Однако в качестве возвращаемого значения я получил только Канаду, но не другие страны, такие как Аргентина или Суринам.

<name>Canada</name>

Я попытался отладить запрос, вызвав

let $return-list := local:reachable-far($country[name="Nicaragua"])
return $return-list/country[name="Argentina"]/name

Возвращаемое значение

<name>Argentina</name>

что, я думаю, означает, что Аргентина (и другие страны) находится в возвращаемом значении, но почему-то не показывает. Что не так с моим кодом здесь? Полное описание функции вставлено ниже.

declare variable $mondial := doc("D:/mondial.xml")/mondial;
declare variable $country := $mondial/country;

declare function local:reachable-far($curr)
{
  if ($curr = ()) then ()

  else
  (
    local:reachable-bfsl($curr, $curr, $curr, $curr, 0)
  )
};

declare function local:reachable-bfsl($queue, $seen, $lastoflevel, $currlevel, $depth)
{
  (:return current level if stack is empty (should never happen):)
  if (empty($queue)) then (<row>{$currlevel} <depth>{$depth}</depth></row>)

  else
  (
    let $curr := $queue[1]
    let $neighbors-all := $curr/border/@country
    let $neighbors-code := $neighbors-all[not(.=$seen/@car_code)]
    let $neighbors := $country[@car_code = $neighbors-code]

    (:if current country is not the last of level, continue with current level:)
    return if ($curr/@car_code != $lastoflevel/@car_code)
    then
    (
      local:reachable-bfsl(($queue[position()>1], $neighbors),
                           ($seen, $neighbors),
                           $lastoflevel,
                           $currlevel union $curr,
                           $depth)
    )

    (:if current country is the last of level:)
    else
    (
      (:current contury has searchable neighbors or stack is not empty after popping:)
      if (not(empty($neighbors)) or not(empty($queue[position()>1])))
      then
      ( (:clear current level, continue next level, update last of level to last in stack, depth++:)
        local:reachable-bfsl(($queue[position()>1], $neighbors),
                             ($seen, $neighbors),
                             ($queue[position()>1], $neighbors)[last()],
                             (),
                             $depth + 1)
      )

      (:current country does not have searchable neighbors and stack is empty after popping:)
      else
      (
        <row>{trace($currlevel union $curr)} <depth>{$depth}</depth></row>
      )
    )
  )
};


let $return-list := local:reachable-far($country[name="Nicaragua"])
return $return-list/country/name

1 Ответ

0 голосов
/ 15 мая 2018

В BaseX 9.0.1 (которая является текущей версией и, вероятно, той, которую вы использовали), алгоритм упорядочения идентификатора узла имеет небольшую ошибку.BaseX 9.0 или последний снимок (http://files.basex.org/releases/latest/) должен дать ожидаемый результат. BaseX 9.0.2 будет доступен в конце мая 2018 года.

...