XQuery - 检查一组是否包含另一组(获得零结果)

时间:2018-05-04 15:39:52

标签: sql set xquery intersection

所以我使用的是这个XML数据库:https://www.dbis.informatik.uni-goettingen.de/Mondial/mondial.xml这是我的问题描述:

  

"哪些国家/地区是所有组织的成员   从“国际”这个词开始并且总部设在欧洲?"

Xquery代码:

let $doc := doc("mondial.xml")/mondial
let $countries := (
  for $c in $doc/country
  let $memShipsSet := $c/tokenize(data(@memberships), '\s')
  let $orgSet := $inter-orgs-eu/data(@id)
  where empty(distinct-values($orgSet[not(.=$memShipsSet)]))
  return <country code="{$c/data(@car_code)}">{$c/data(name)}</country>
)
return $countries

$inter-orgs-eu是所有组织[元素]的序列/列表,其名称中包含&#39; International&#39;并且总部位于欧洲)

distinct-values($orgSet[not(.=$memShipsSet)])函数返回$orgSet中未显示在$memShipsSet中的值(参考:http://www.xqueryfunctions.com/xq/functx_value-except.html

然而,当我运行此代码时,它只返回零结果,我无法弄清楚我做错了什么。这是一个逻辑错误还是其他东西(我是Xquery的新手,所以它很可能是我错过的明显事物)?

感谢任何帮助。

谢谢!

编辑: 完整代码:

let $doc := doc("mondial.xml")/mondial

let $inter-orgs := (
  for $o in $doc/organization
  let $name := xs:string($o/data(name))
  where contains($name,xs:string("International"))
  return $o
)

let $inter-orgs-eu := (
  for $o in $inter-orgs
  let $hq := $o/data(@headq)
  let $city := $doc/country/id($hq)
  let $cCode := $city/data(@country)
  let $country := $doc/country[data(@car_code)=$cCode]
  where $country/encompassed/data(@continent) = 'europe'
  return $o
)

let $countries := (
  for $c in $doc/country
  let $memShipsSet := $c/tokenize(data(@memberships), '\s')
  let $orgSet := $inter-orgs-eu/data(@id)
  where empty(distinct-values($orgSet[not(.=$memShipsSet)]))
  return <country code="{$c/data(@car_code)}">{$c/data(name)}</country>
)
return $countries

1 个答案:

答案 0 :(得分:0)

事实证明,确实有0个国家是所有这些组织的成员。所以我的代码实际上工作得很好。感谢@MartinHonnen制作了一个包含所有国家和组织的表格($ inter-orgs-eu),他们是xqueryfiddle.liberty-development.net/jyyiVhg的成员。

我的代码中有一个小问题虽然我现在已经修复了。 $ inter-orgs返回所有包含“国际”一词的组织,但根据问题描述,它应该只返回以“国际”一词开头的组织。我使用starts-with中的where子句中的$inter-orgs函数修改了它,而不是使用contains函数。尽管如此(当我返回$countries时)它并没有对我的最终结果产生任何影响。

最终代码:

let $doc := doc("mondial.xml")/mondial

let $inter-orgs := (
  for $o in $doc/organization
  let $name := xs:string($o/data(name))
  where starts-with($name,xs:string("International"))
  return $o
)

let $inter-orgs-eu := (
  for $o in $inter-orgs
  let $hq := $o/data(@headq)
  let $city := $doc/country/id($hq)
  let $cCode := $city/data(@country)
  let $country := $doc/country[data(@car_code)=$cCode]
  where $country/encompassed/data(@continent) = 'europe'
  return $o
)

let $countries := (
  for $c in $doc/country
  let $memShipsSet := $c/tokenize(data(@memberships), '\s')
  let $orgSet := $inter-orgs-eu/data(@id)
  let $orgsNotInMemSet := distinct-values($orgSet[not(.=$memShipsSet)])
  where empty($orgsNotInMemSet)
  return <country code="{$c/data(@car_code)}">{$c/data(name)}</country>
)

return <root>
 {$countries}
</root>