es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Buscar pares únicos de elementos y convertir el resultado ordenado a JSON.

Tengo la siguiente entrada de ejemplo: (Son documentos individuales)

    <performance>
        <year>2016</year>
        <industry>Financials</industry>
        <benchmark>Healthcare</benchmark>
</performance>
<performance>
    <year>2017</year>
    <industry>Technology</industry>
    <benchmark>Financials</benchmark>
</performance>
<performance>
    <year>2018</year>
    <industry>Technology</industry>
    <benchmark>Financials</benchmark>
</performance>
<performance>
    <year>2019</year>
    <industry>Financials</industry>
    <benchmark>Materials</benchmark>
</performance>
<performance>
    <year>2020</year>
    <industry>Technology</industry>
    <benchmark>Materials</benchmark>
</performance>
<performance>
    <year>2021</year> 
    <industry>Technology</industry>
    <benchmark>Healthcare</benchmark>
</performance>

Necesito encontrar las combinaciones de la industria y el benchmark, ordenar el documento de resultado por año y, finalmente, transformar las combinaciones en JSON. Me gustaría usar el índice de Marklogic para acelerar la búsqueda y transformación. La salida esperada es:

{
    "Financials": [
        "Materials", 
        "Healthcare"
    ], 
    "Technology": [
        "Healthcare", 
        "Materials", 
        "Financials"
    ]
}

Mi código XQuery es:

let $keys := ('Financials', 'Technology')
let $map := map:map()
let $_ :=    
  for $key in $keys 
  let $query :=  cts:path-range-query("/performance/industry", "=", $key)
  let $v :=  cts:values(cts:path-reference('/performance/benchmark'), (), (), $query)
  return map:put($map, $key, $v)
return xdmp:to-json($map)

Resultado inesperado:

{
    "Financials": [
        "Healthcare", 
        "Materials"
    ], 
    "Technology": [
        "Financials", 
        "Healthcare", 
        "Materials"
    ]
}

¿Estoy usando XQuery de manera incorrecta o comprendo mal cómo funciona el índice de Marklogic? ¿Cómo puedo obtener la salida correcta? Estoy de acuerdo con JavaScript o XQuery.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que el código de Xquery funciona correctamente y utiliza el índice de Marklogic. La salida inesperada puede deberse al orden en el que se procesaron los documentos o a cómo se estructuraron los documentos de entrada.

    Para obtener la salida esperada, puedes modificar el código de Xquery para ordenar los valores por año antes de agregarlos al mapa. Aquí tienes una versión actualizada del código:

    let $keys := ('Financials', 'Technology')
    let $map := map:map()
    let $_ :=
      for $key in $keys
      let $query :=  cts:path-range-query("/performance/industry", "=", $key)
      let $values := cts:values(cts:path-reference('/performance/benchmark'), (), (), $query)
      let $sorted-values := sort(
        for $value in $values
        let $year := xs:int(documents({cts:path-reference('/performance/benchmark') eq $value})/performance/year)
        order by $year ascending
        return $value
      )
      return map:put($map, $key, $sorted-values)
    return xdmp:to-json($map)
    

    Este código recupera los valores del índice y los ordena por año antes de agregarlos al mapa. La función documents() se utiliza para recuperar los documentos individuales en función del valor de referencia del benchmark.

    La salida debería ser la esperada:

    {
      "Financials": ["Materials", "Healthcare"],
      "Technology": ["Healthcare", "Materials", "Financials"]
    }
    

    Ten en cuenta que este código asume que solo hay un documento por combinación de benchmark y año. Si hay varios documentos, la función sort() puede no funcionar correctamente.

Comments are closed.