XQuery - 检查一组是否包含另一组(得到零结果)
XQuery - Checking if one set contains another set (getting zero results)
所以我正在使用这个 XML 数据库:https://www.dbis.informatik.uni-goettingen.de/Mondial/mondial.xml 这是我的问题描述:
"Which countries are members of ALL the organizations whose names
start with the word 'International' and are headquartered in Europe?"
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
是名称中含有 'International' 一词且总部位于欧洲的所有组织 [元素] 的 sequence/list 个)
distinct-values($orgSet[not(.=$memShipsSet)])
函数 returns $orgSet
中未出现在 $memShipsSet
中的值(参考:http://www.xqueryfunctions.com/xq/functx_value-except.html)
然而,当我 运行 这段代码时,它只是 returns 零结果,我无法弄清楚我做错了什么。这是逻辑错误还是其他原因(我是 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
原来确实有 0 个国家是所有这些组织的成员。所以我的代码实际上工作得很好。感谢@MartinHonnen 生成了所有国家和组织($inter-orgs-eu)的 table,他们是 over at xqueryfiddle.liberty-development.net/jyyiVhg 的成员。
我的代码中存在一个小问题,但我现在已经修复了。 $inter-orgs returned 所有包含单词 "International" 的组织,但根据问题描述,它应该只有 return 个以单词 "International" 开头的组织。我通过在 $inter-orgs
的 where
子句中使用 starts-with
函数而不是使用 contains
函数来修复它。不过,这对我的最终结果没有任何影响(当我 return $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>
所以我正在使用这个 XML 数据库:https://www.dbis.informatik.uni-goettingen.de/Mondial/mondial.xml 这是我的问题描述:
"Which countries are members of ALL the organizations whose names start with the word 'International' and are headquartered in Europe?"
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
是名称中含有 'International' 一词且总部位于欧洲的所有组织 [元素] 的 sequence/list 个)
distinct-values($orgSet[not(.=$memShipsSet)])
函数 returns $orgSet
中未出现在 $memShipsSet
中的值(参考:http://www.xqueryfunctions.com/xq/functx_value-except.html)
然而,当我 运行 这段代码时,它只是 returns 零结果,我无法弄清楚我做错了什么。这是逻辑错误还是其他原因(我是 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
原来确实有 0 个国家是所有这些组织的成员。所以我的代码实际上工作得很好。感谢@MartinHonnen 生成了所有国家和组织($inter-orgs-eu)的 table,他们是 over at xqueryfiddle.liberty-development.net/jyyiVhg 的成员。
我的代码中存在一个小问题,但我现在已经修复了。 $inter-orgs returned 所有包含单词 "International" 的组织,但根据问题描述,它应该只有 return 个以单词 "International" 开头的组织。我通过在 $inter-orgs
的 where
子句中使用 starts-with
函数而不是使用 contains
函数来修复它。不过,这对我的最终结果没有任何影响(当我 return $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>