Необходимо найти и удалить дубликаты или более вхождения тех же узлов (точную копию узла) в течение цикла - PullRequest
0 голосов
/ 04 сентября 2018
Input:

    <relations>
      <relation>
        <isIdenticalInternationalStandardOf id="AssetID" metadataStatus="Publishable">1234</isIdenticalInternationalStandardOf>
        <isIdenticalInternationalStandardOf id="PrimaryDesignator">abc</isIdenticalInternationalStandardOf>
      </relation>
      <relation>
         <isIdenticalRegionalStandardOf id="AssetID" metadataStatus="Publishable">1234</isIdenticalRegionalStandardOf>
         <isIdenticalRegionalStandardOf id="PrimaryDesignator">abc</isIdenticalRegionalStandardOf>
      </relation>
      <relation>
        <supersededBy id="AssetID" metadataStatus="Publishable">5647</supersededBy>
        <supersededBy id="PrimaryDesignator">pqr</supersededBy>
      </relation>
      <relation>
        <replacedBy id="AssetID" metadataStatus="Publishable">1234</replacedBy>
        <replacedBy id="PrimaryDesignator">abc</replacedBy>
      </relation>
      <relation>
        <supersededBy id="AssetID" metadataStatus="Publishable">1234</supersededBy>
        <supersededBy id="PrimaryDesignator">xyz</supersededBy>
      </relation>
      <relation>
        <isIdenticalInternationalStandardOf id="AssetID" metadataStatus="Publishable">1234</isIdenticalInternationalStandardOf>
        <isIdenticalInternationalStandardOf id="PrimaryDesignator">abc</isIdenticalInternationalStandardOf>
      </relation>
       <relation>
        <isIdenticalInternationalStandardOf id="AssetID" metadataStatus="Publishable">1234</isIdenticalInternationalStandardOf>
        <isIdenticalInternationalStandardOf id="PrimaryDesignator">abc</isIdenticalInternationalStandardOf>
      </relation>
    </relations>

Я смог найти дубликат из ввода, вот код:

let $data := $each-search-copy/relations
let $map := map:map()
let $uniqueList :=
      for $outer at $i in $data/relation
          for $inner at $j in $data/relation
               where $i ne $j
                  return 
                     if(fn:deep-equal($outer, $inner)) then
                     if(fn:exists(map:get($map, xs:string($j)))) then () else map:put($map, xs:string($i), xs:string($j)) 
                     else ()

let $duplicate :=
      for $each at $i in $data/relation
          return 
            if(fn:exists(map:get($map, xs:string($i)))) 
              then (
                     fn:string-join((xdmp:quote($each), "&#10;"), "|")
                    ) else () 

поиск дублирующего узла завершен. Теперь я хочу написать запрос на обновление транзакции, который будет хранить только уникальный список узлов. если имеется многократное вхождение, оно должно быть удалено.

с помощью конструкции MAP я могу удалить, если есть дубликат, но не многократные вхождения.

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Вы можете удалить узлы, вызвав функцию xdmp:node-delete() для каждого из узлов, которые вы хотите удалить.

Вы можете идентифицировать эти дубликаты немного проще и лаконичнее в одном цикле for, а также условие where, которое проверяет, является ли элемент relationship deep-equal() для любого из его братьев relationship, исключая текущий relationship элемент обрабатывается в цикле for, гарантируя, что значения generate-id() (гарантированно одинаковые для одного и того же узла) не равны:

let $all-relations := $each-search-copy/relations/relation
return
  for $relation in $all-relations
  where $all-relations[fn:deep-equal(., $relation) and generate-id(.) ne generate-id($relation)]
  return xdmp:node-delete($relation)
0 голосов
/ 04 сентября 2018

Вместо удаления дубликатов, вы можете просто перестроить дедуплицированный список и выполнить одну замену. например перебирайте список и выводите все отношения, которые раньше не видели.

let $uniqueList :=
  for $outer at $i in $data/relation
  where every $inner in ($data/relation)[1 to $i - 1]
    satisfies fn:not(fn:deep-equal($inner, $outer))
  return $outer

return xdmp:node-replace($data, <relations>{ $uniqueList }</relations>)
...