Xquery 在marklogic 8中对多个映射进行排序
这更像是一个XQuery而不是MarkLogic。我有三个map:map,每个map都有“id”和score的键值对。我想根据每个地图的分数对所有不同的ID进行排序。 例如: 在上面的示例中,每个映射都是id:score for key value(不知道如何在这里表示:) 我想要根据分数从三张地图中排序的id列表Xquery 在marklogic 8中对多个映射进行排序,xquery,marklogic,marklogic-8,Xquery,Marklogic,Marklogic 8,这更像是一个XQuery而不是MarkLogic。我有三个map:map,每个map都有“id”和score的键值对。我想根据每个地图的分数对所有不同的ID进行排序。 例如: 在上面的示例中,每个映射都是id:score for key value(不知道如何在这里表示:) 我想要根据分数从三张地图中排序的id列表 是否有一种好的方法或更好的方法来进行排序,或者我必须合并映射的键并迭代键序列并对它们进行排序?这似乎是折叠的一个很好的用例。它是Xquery 3.0规范的一部分 可以遍历一系列项,并
是否有一种好的方法或更好的方法来进行排序,或者我必须合并映射的键并迭代键序列并对它们进行排序?这似乎是折叠的一个很好的用例。它是Xquery 3.0规范的一部分 可以遍历一系列项,并在每个项遍历时获取其结果。在本例中,$combinedMaps是最后一次调用的结果,$mapToMerge是当前正在执行的序列中的项 这里有一个你想做的例子
declare function local:sortMaps(
$newMap as map:map,
$mapA as map:map,
$mapB as map:map
) as map:map {
let $build :=
for $key in map:keys($mapA)
let $otherMapValue :=
(map:get($mapB, $key), 0)[1]
let $value := map:get($mapA, $key)
return
if ($value gt $otherMapValue) then (
map:put($newMap, $key, $value)
) else (
map:put($newMap, $key, $otherMapValue)
)
return $newMap
};
let $map1 :=
map:new((
map:entry("1",2048),
map:entry("5",2000)
))
let $map2 :=
map:new((
map:entry("2",5000),
map:entry("1",1000),
map:entry("4",3000)
))
let $map3 :=
map:new((
map:entry("6",100),
map:entry("7",5000),
map:entry("2",2000)
))
let $maps := ($map1, $map2, $map3)
return
fn:fold-left(
function($combinedMaps, $mapToMerge) {
let $newMap := map:map()
let $newMap := local:sortMaps($newMap, $combinedMaps, $mapToMerge)
let $newMap := local:sortMaps($newMap, $mapToMerge, $combinedMaps)
return $newMap
},
$maps[1],
$maps
)
你在寻找地图上的一个综合分数吗?如果是,当同一关键点多次出现时(如关键点1、2),您会使用多少分数?如果关键点在地图上冲突。。我想选择最高分。。。在上面的示例中,map1中的1将用于排序。请发布预期输出,给出这些示例地图数据。我也做了类似的操作,我联合所有地图,并对地图执行排序。。但这是同样的想法
declare function local:sortMaps(
$newMap as map:map,
$mapA as map:map,
$mapB as map:map
) as map:map {
let $build :=
for $key in map:keys($mapA)
let $otherMapValue :=
(map:get($mapB, $key), 0)[1]
let $value := map:get($mapA, $key)
return
if ($value gt $otherMapValue) then (
map:put($newMap, $key, $value)
) else (
map:put($newMap, $key, $otherMapValue)
)
return $newMap
};
let $map1 :=
map:new((
map:entry("1",2048),
map:entry("5",2000)
))
let $map2 :=
map:new((
map:entry("2",5000),
map:entry("1",1000),
map:entry("4",3000)
))
let $map3 :=
map:new((
map:entry("6",100),
map:entry("7",5000),
map:entry("2",2000)
))
let $maps := ($map1, $map2, $map3)
return
fn:fold-left(
function($combinedMaps, $mapToMerge) {
let $newMap := map:map()
let $newMap := local:sortMaps($newMap, $combinedMaps, $mapToMerge)
let $newMap := local:sortMaps($newMap, $mapToMerge, $combinedMaps)
return $newMap
},
$maps[1],
$maps
)