Sdílet prostřednictvím


Spouštění dotazů na data grafu ve službě Azure Cosmos DB pro Apache Gremlin

Důležité

Hledáte databázové řešení pro scénáře ve velkém měřítku s 99,999% smlouvou o úrovni služeb (SLA), okamžitým automatickým škálováním a automatickým převzetím služeb při selhání napříč několika oblastmi? Zvažte Azure Cosmos DB for NoSQL.

Chcete implementovat graf online analytického zpracování (OLAP) nebo migrovat existující aplikaci Apache Gremlin? Zvažte Graph v Microsoft Fabricu.

Azure Cosmos DB pro Apache Gremlin podporuje syntaxi Gremlin TinkerPop pro dotazy. Tato příručka vás provede běžnými dotazy, které je možné provést pomocí této služby. V této příručce můžete spouštět následující dotazy pomocí konzoly Gremlin nebo oblíbeného ovladače Gremlin.

Požadavky

  • Předplatné Azure

    • Pokud nemáte předplatné Azure, vytvořte si bezplatný účet před zahájením.
  • Účet Azure Cosmos DB pro Apache Gremlin
  • Přístup k ukázkovým datům pro testování

Spočítat počet vrcholů v grafu

Spočítejte celkový počet vrcholů produktu v grafu. Tato operace je užitečná pro pochopení velikosti katalogu produktů nebo ověřování načítání dat.

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

Spočítat počet vrcholů s konkrétním popiskem v grafu

Spočítejte celkový počet vrcholů produktu v grafu, které obsahují určitý popisek. V tomto příkladu je productpopisek .

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

Filtrování produktů podle popisku a vlastnosti

Načtěte produkty, které odpovídají určitému popisku a hodnotě vlastnosti. Tento dotaz je užitečný pro zúžení výsledků na podmnožinu zájmu, jako jsou produkty s cenou vyšší než 800 Usd.

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

Vlastnosti specifické pro projekt z produktů

Vrátí pouze vybrané vlastnosti z odpovídajících produktů. Tento dotaz snižuje množství vrácených dat a zaměřuje se na relevantní pole, jako jsou názvy produktů.

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

Vyhledejte související produkty procházením grafu. Například vyhledejte všechny produkty, které byly nahrazeny konkrétním produktem, procházením odchozích hran "replaces" a následným přechodem na vrcholy připojeného produktu.

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

Tento dotaz použijte k vyhledání produktů, které jsou ve náhradním řetězci vzdálené dva segmenty směrování:

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

Analýza spouštění dotazů pomocí profilu spuštění

Pomocí tohoto kroku analyzujte podrobnosti o výkonu a provádění dotazu executionProfile() Gremlin. Tento krok vrátí objekt JSON s metrikami pro každý krok v dotazu, který pomáhá s řešením potíží a optimalizací.

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

Další informace o executionProfile() kroku najdete v referenčních informacích k profilu spuštění.

Návod

Tento executionProfile() krok provede dotaz Gremlin. Tento dotaz obsahuje addV kroky nebo addE kroky, které mají za následek vytvoření a potvrzení změn zadaných v dotazu. Za jednotky žádostí vygenerované dotazem Gremlin se také účtují poplatky.

Identifikace vzorů dotazů pro nevidomé ventilátory

Slepý ventilátor nastane, když dotaz přistupuje k více oddílům, než je potřeba, často kvůli chybějícímu predikátu klíče oddílu. Tento antipattern může zvýšit latenci a náklady. Profil spuštění pomáhá identifikovat takové vzory zobrazením vysoké fanoutFactorhodnoty .

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

Optimalizace dotazů na ventilátory

Vysoká fanoutFactor hodnota (například 5) označuje dotaz, ke který se přistupuje více oddílů. Pokud chcete optimalizovat, zahrňte klíč oddílu do predikátu dotazu:

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

Nefiltrovaný vzor dotazu

Nefiltrované dotazy můžou zpracovávat velkou počáteční datovou sadu, což zvyšuje náklady a latenci.

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

Filtrovaný vzor dotazu

Přidání filtrů před procházením může snížit pracovní sadu a zlepšit výkon. Profil spuštění zobrazuje efekt filtrování. Filtrovaný dotaz zpracovává méně vrcholů, což vede k nižší latenci a nákladům.

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