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.

La paginación de Gremlin a través de RangeLocalStep(0,1) falla en una travesía vacía.

He seguido la receta de paginación de Gremlin y he encontrado que funciona bien en todos los escenarios, excepto cuando se solicita 1 elemento en una operación de navegación vacía, en ese caso falla con el siguiente mensaje de error:

El inicio proporcionado no se asigna a ningún valor: []->[NeptuneMemoryTrackerStep, RangeLocalStep(0,1)]

Solicitar un elemento de una operación de navegación no vacía funciona correctamente. También está bien solicitar 0 elementos, 2 elementos o 10.000 elementos de una operación de navegación vacía.

El comportamiento es el esperado sin errores, excepto cuando se solicita exactamente 1 elemento en una operación de navegación vacía.

¿Cómo puedo hacer que la paginación sea resistente y funcione en consultas que no encuentran datos cuando los consumidores solicitan exactamente un elemento?

g.inject([])
.as('items', 'count')
.select('items', 'count')
.by(range(local, 0, 1))
.by(count(local))
.project('count', 'items')
.by(select('count'))
.by(select('items'))

Por cierto, esto se está ejecutando en AWS Neptune.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para hacer que la paginación sea resiliente y funcione contra consultas que no encuentran datos cuando los consumidores solicitan exactamente un elemento, puede modificar la fórmula de paginación mediante el uso de los pasos fold y coalesce.

    Aquí tienes un ejemplo de consulta:

    g.V().hasLabel('nonExistentLabel')
      .fold()
      .coalesce(unfold().range(local, 0, 1), constant('no existen resultados'))
    

    Explicación:

    • fold() colocará la búsqueda vacía en una lista, para que pueda ser procesada por otros pasos como range.
    • coalesce devolverá la primera búsqueda que produzca al menos un resultado. La primera parte unfold().range(local, 0, 1) intentará obtener el primer (y único) elemento de la búsqueda, mientras que constant('no existen resultados') devolverá un mensaje indicando que no se encontraron resultados.
    • Si la búsqueda no tiene resultados, la parte unfold().range(local, 0, 1) lanzará un error. Sin embargo, debido a coalesce, se devolverá el segundo argumento (constant('no existen resultados')) en su lugar.

    Esta consulta debería funcionar correctamente incluso cuando se solicite exactamente un elemento de una búsqueda vacía.

    Nota: Esta consulta es solo un ejemplo y puede que necesite adaptarse a tu caso de uso específico.

Comments are closed.