Köra frågor på grafdata i Azure Cosmos DB för Apache Gremlin

Viktigt!

Letar du efter en databaslösning för storskaliga scenarier med ett serviceavtal på 99,999% tillgänglighetsnivå (SLA), snabb autoskalning och automatisk redundans i flera regioner? Överväg Azure Cosmos DB för NoSQL.

Vill du implementera ett OLAP-diagram (Online Analytical Processing) eller migrera ett befintligt Apache Gremlin-program? Överväg Graph i Microsoft Fabric.

Azure Cosmos DB för Apache Gremlin stöder Gremlin TinkerPop-syntaxen för frågor. Den här guiden går igenom vanliga frågor som kan utföras med hjälp av den här tjänsten. Du kan köra följande frågor i den här guiden med hjälp av Gremlin-konsolen eller din favoritdrivrutin för Gremlin.

Förutsättningar

  • En prenumeration på Azure

    • Om du inte har en Azure-prenumeration, skapa ett gratis konto innan du börjar.
  • Ett Azure Cosmos DB för Apache Gremlin-konto
  • Åtkomst till exempeldata för testning

Räkna antalet hörn i diagrammet

Räkna det totala antalet produkthörn i diagrammet. Den här åtgärden är användbar för att förstå storleken på produktkatalogen eller validera datainläsningar.

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

Räkna antalet hörn med en specifik etikett i diagrammet

Räkna det totala antalet produkthörn i diagrammet som innehåller en specifik etikett. I det här exemplet är productetiketten .

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

Filtrera produkter efter etikett och egenskap

Hämta produkter som matchar en specifik etikett och egenskapsvärde. Den här frågan är användbar för att begränsa resultatet till en delmängd av intresse, till exempel produkter med ett pris som är större än 800 USD.

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

Projektspecifika egenskaper från produkter

Returnera endast markerade egenskaper från de matchade produkterna. Den här frågan minskar mängden data som returneras och fokuserar på relevanta fält, till exempel produktnamn.

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

Hitta relaterade produkter genom att bläddra i diagrammet. Du kan till exempel hitta alla produkter som ersatts av en specifik produkt genom att gå igenom utgående "ersätter" kanter och sedan till de anslutna produkthörnarna.

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

Använd den här frågan för att hitta produkter två hopp bort i ersättningskedjan:

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

Analysera frågekörning med körningsprofil

Analysera prestanda- och körningsinformationen för en Gremlin-fråga med hjälp av executionProfile() steget . Det här steget returnerar ett JSON-objekt med mått för varje steg i frågan, vilket hjälper till med felsökning och optimering.

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 }
      }
    ]
  }
]

Mer information om steget finns i referens för executionProfile()körningsprofil.

Tips/Råd

Steget executionProfile() kör Gremlin-frågan. Den här frågan innehåller addV stegen eller addE , vilket resulterar i att ändringarna som anges i frågan skapas och checkas in. Enheter för begäran som genereras av Gremlin-frågan debiteras också.

Identifiera frågemönster för blinda utsända

En blind-out inträffar när en fråga kommer åt fler partitioner än nödvändigt, ofta på grund av saknade partitionsnyckelpredikat. Det här antimönstret kan öka svarstiden och kostnaden. Körningsprofilen hjälper till att identifiera sådana mönster genom att visa en hög fanoutFactor.

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 }
      }
    ]
  }
]

Optimera uttjäntas frågor

En hög fanoutFactor (till exempel 5) anger att frågan har åtkomst till flera partitioner. Om du vill optimera tar du med partitionsnyckeln i frågepredikatet:

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

Mönster för ofiltrerad fråga

Ofiltrerade frågor kan bearbeta en stor initial datauppsättning, vilket ökar kostnaden och svarstiden.

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 }
      }
    ]
  }
]

Filtrerat frågemönster

Om du lägger till filter före blädderingar kan du minska arbetsuppsättningen och förbättra prestandan. Körningsprofilen visar effekten av filtrering. Den filtrerade frågan bearbetar färre hörn, vilket resulterar i lägre svarstid och kostnad.

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 }
      }
    ]
  }
]