Compartir vía


Ejecución de consultas en datos de grafos en Azure Cosmos DB for Apache Gremlin

Importante

¿Busca una solución de base de datos para escenarios a gran escala con un contrato de nivel de servicio (SLA) de disponibilidad de 99,999%, escalabilidad automática instantánea y conmutación automática por error en varias regiones? Considere la posibilidad de usar Azure Cosmos DB para NoSQL.

¿Desea implementar un grafo de procesamiento analítico en línea (OLAP) o migrar una aplicación de Apache Gremlin existente? Considere el uso de Graph en Microsoft Fabric.

Azure Cosmos DB for Apache Gremlin admite la sintaxis de Gremlin TinkerPop para consultas. En esta guía, se describen las consultas comunes que se pueden realizar mediante este servicio. Puede ejecutar las siguientes consultas en esta guía mediante la consola de Gremlin o su controlador de Gremlin favorito.

Prerrequisitos

  • Una suscripción de Azure

    • Si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.
  • Una cuenta de Azure Cosmos DB for Apache Gremlin
  • Acceso a datos de ejemplo para pruebas

Recuento del número de vértices en el gráfico

Cuente el número total de vértices de producto en el grafo. Esta operación es útil para comprender el tamaño del catálogo de productos o validar las cargas de datos.

g.V().hasLabel('product').count()

Recuento del número de vértices con una etiqueta específica en el grafo

Cuente el número total de vértices de producto en el grafo que incluyen una etiqueta específica. En este ejemplo, la etiqueta es product.

g.V().hasLabel('product').count()

Filtrado de productos por etiqueta y propiedad

Recupere productos que coincidan con una etiqueta y un valor de propiedad específicos. Esta consulta es útil para restringir los resultados a un subconjunto de intereses, como productos con un precio superior a 800 USD.

g.V().hasLabel('product').has('price', gt(800))

Propiedades de productos específicas del proyecto

Obtenga solo las propiedades seleccionadas de los productos coincidentes. Esta consulta reduce la cantidad de datos devueltos y se centra en los campos pertinentes, como los nombres de producto.

g.V().hasLabel('product').values('name')

Busque productos relacionados mediante el recorrido del grafo. Por ejemplo, busque todos los productos que se reemplazaron por un producto específico mediante el recorrido de bordes de "replaces" salientes y, luego, los vértices del producto conectado.

g.V(['gear-surf-surfboards', 'bbbbbbbb-1111-2222-3333-cccccccccccc']).outE('replaces').inV().hasLabel('product')

Use esta consulta para buscar productos de dos saltos en la cadena de reemplazo:

g.V(['gear-surf-surfboards', 'bbbbbbbb-1111-2222-3333-cccccccccccc']).outE('replaces').inV().hasLabel('product').outE('replaces').inV().hasLabel('product')

Análisis de la ejecución de consultas con el perfil de ejecución

Analice los detalles de rendimiento y ejecución de una consulta de Gremlin mediante el paso executionProfile(). Este paso devuelve un objeto JSON con métricas para cada paso de la consulta, lo que ayuda a solucionar problemas y a optimizar.

g.V(['gear-surf-surfboards', 'bbbbbbbb-1111-2222-3333-cccccccccccc']).out().executionProfile()
[
  {
    "gremlin": "g.V('mary').out().executionProfile()",
    "totalTime": 28,
    "metrics": [
      {
        "name": "GetVertices",
        "time": 24,
        "annotations": { "percentTime": 85.71 },
        "counts": { "resultCount": 2 },
        "storeOps": [ { "fanoutFactor": 1, "count": 2, "size": 696, "time": 0.4 } ]
      },
      {
        "name": "GetEdges",
        "time": 4,
        "annotations": { "percentTime": 14.29 },
        "counts": { "resultCount": 1 },
        "storeOps": [ { "fanoutFactor": 1, "count": 1, "size": 419, "time": 0.67 } ]
      },
      {
        "name": "GetNeighborVertices",
        "time": 0,
        "annotations": { "percentTime": 0 },
        "counts": { "resultCount": 1 }
      },
      {
        "name": "ProjectOperator",
        "time": 0,
        "annotations": { "percentTime": 0 },
        "counts": { "resultCount": 1 }
      }
    ]
  }
]

Para obtener más información sobre el paso executionProfile(), consulte referencia de perfil de ejecución.

Sugerencia

El paso executionProfile() ejecuta la consulta de Gremlin. Esta consulta incluye los pasos addV o addE, lo que da lugar a la creación y confirmación de los cambios especificados en la consulta. También se cobran las unidades de solicitud generadas por la consulta de Gremlin.

Identificación de patrones de consulta de distribución ramificada ciega

Una distribución ramificada ciega se produce cuando una consulta accede a más particiones de las necesarias, a menudo debido a la falta de predicados de clave de partición. Este antipatrón puede aumentar la latencia y el costo. El perfil de ejecución ayuda a identificar estos patrones mostrando un fanoutFactor alto.

g.V(['gear-surf-surfboards', 'aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb']).executionProfile()
[
  {
    "gremlin": "g.V('tt0093640').executionProfile()",
    "totalTime": 46,
    "metrics": [
      {
        "name": "GetVertices",
        "time": 46,
        "annotations": { "percentTime": 100 },
        "counts": { "resultCount": 1 },
        "storeOps": [ { "fanoutFactor": 5, "count": 1, "size": 589, "time": 75.61 } ]
      },
      {
        "name": "ProjectOperator",
        "time": 0,
        "annotations": { "percentTime": 0 },
        "counts": { "resultCount": 1 }
      }
    ]
  }
]

Optimización de consultas de distribución ramificada

Un valor fanoutFactor alto (como 5) indica que la consulta accedió a varias particiones. Para optimizar, incluya la clave de partición en el predicado de consulta:

g.V(['gear-surf-surfboards', 'aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb'])

Patrón de consulta sin filtrar

Las consultas sin filtrar podrían procesar un conjunto de datos inicial grande, lo que aumenta el costo y la latencia.

g.V().hasLabel('product').out().executionProfile()
[
  {
    "gremlin": "g.V().hasLabel('tweet').out().executionProfile()",
    "totalTime": 42,
    "metrics": [
      {
        "name": "GetVertices",
        "time": 31,
        "annotations": { "percentTime": 73.81 },
        "counts": { "resultCount": 30 },
        "storeOps": [ { "fanoutFactor": 1, "count": 13, "size": 6819, "time": 1.02 } ]
      },
      {
        "name": "GetEdges",
        "time": 6,
        "annotations": { "percentTime": 14.29 },
        "counts": { "resultCount": 18 },
        "storeOps": [ { "fanoutFactor": 1, "count": 20, "size": 7950, "time": 1.98 } ]
      },
      {
        "name": "GetNeighborVertices",
        "time": 5,
        "annotations": { "percentTime": 11.9 },
        "counts": { "resultCount": 20 },
        "storeOps": [ { "fanoutFactor": 1, "count": 4, "size": 1070, "time": 1.19 } ]
      },
      {
        "name": "ProjectOperator",
        "time": 0,
        "annotations": { "percentTime": 0 },
        "counts": { "resultCount": 20 }
      }
    ]
  }
]

Patrón de consulta filtrado

Agregar filtros antes de los recorridos puede reducir el conjunto de trabajo y mejorar el rendimiento. El perfil de ejecución muestra el efecto del filtrado. La consulta filtrada procesa menos vértices, lo que da lugar a una menor latencia y costo.

g.V().hasLabel('product').has('clearance', true).out().executionProfile()
[
  {
    "gremlin": "g.V().hasLabel('tweet').has('lang', 'en').out().executionProfile()",
    "totalTime": 14,
    "metrics": [
      {
        "name": "GetVertices",
        "time": 14,
        "annotations": { "percentTime": 58.33 },
        "counts": { "resultCount": 11 },
        "storeOps": [ { "fanoutFactor": 1, "count": 11, "size": 4807, "time": 1.27 } ]
      },
      {
        "name": "GetEdges",
        "time": 5,
        "annotations": { "percentTime": 20.83 },
        "counts": { "resultCount": 18 },
        "storeOps": [ { "fanoutFactor": 1, "count": 18, "size": 7159, "time": 1.7 } ]
      },
      {
        "name": "GetNeighborVertices",
        "time": 5,
        "annotations": { "percentTime": 20.83 },
        "counts": { "resultCount": 18 },
        "storeOps": [ { "fanoutFactor": 1, "count": 4, "size": 1070, "time": 1.01 } ]
      },
      {
        "name": "ProjectOperator",
        "time": 0,
        "annotations": { "percentTime": 0 },
        "counts": { "resultCount": 18 }
      }
    ]
  }
]