Aracılığıyla paylaş


Apache Gremlin için Azure Cosmos DB'de grafik verileri üzerinde sorgu yürütme

Önemli

99,999% kullanılabilirlik hizmet düzeyi sözleşmesi (SLA), anında otomatik ölçeklendirme ve birden çok bölgede otomatik yük devretme ile yüksek ölçekli senaryolar için bir veritabanı çözümü mü arıyorsunuz? NoSQL için Azure Cosmos DB'ye göz önünde bulundurun.

Çevrimiçi analitik işleme (OLAP) grafı uygulamak mı yoksa mevcut bir Apache Gremlin uygulamasını geçirmek mi istiyorsunuz? Microsoft Fabric'te Graph'i göz önünde bulundurun.

Apache Gremlin için Azure Cosmos DB, sorgular için Gremlin TinkerPop söz dizimini destekler. Bu kılavuzda, bu hizmet kullanılarak gerçekleştirilebilecek yaygın sorgular açıklanmaktadır. Gremlin konsolunu veya en sevdiğiniz Gremlin sürücüsünü kullanarak bu kılavuzda aşağıdaki sorguları çalıştırabilirsiniz.

Önkoşullar

  • Azure aboneliği

  • Apache Gremlin için Azure Cosmos DB hesabı
  • Test için örnek verilere erişim

Grafikteki köşe sayısını sayma

Grafikteki ürün köşelerinin toplam sayısını sayar. Bu işlem, ürün kataloğunuzun boyutunu anlamak veya veri yüklerini doğrulamak için kullanışlıdır.

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

Grafikte belirli bir etikete sahip köşe sayısını sayma

Graftaki belirli bir etiketi içeren toplam ürün köşesi sayısını sayar. Bu örnekte etiket şeklindedir product.

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

Ürünleri etikete ve özelliğe göre filtreleme

Belirli bir etiket ve özellik değeriyle eşleşen ürünleri alın. Bu sorgu, 800 TL'den büyük bir fiyata sahip ürünler gibi sonuçları ilgi çekici bir alt kümeye daraltmak için yararlıdır.

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

Ürünlerden belirli özellikleri yansıtma

Yalnızca eşleşen ürünlerden seçilen özellikleri döndürür. Bu sorgu, döndürülen veri miktarını azaltır ve ürün adları gibi ilgili alanlara odaklanır.

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

Grafikte geçiş yaparak ilgili ürünleri bulun. Örneğin, giden 'değiştirir' kenarlarını ve ardından bağlı ürün köşelerini geçirerek belirli bir ürünle değiştirilen tüm ürünleri bulun.

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

Değiştirme zincirinde iki atlama ötedeki ürünleri bulmak için bu sorguyu kullanın:

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

Yürütme profiliyle sorgu yürütmeyi analiz etme

Adımını kullanarak Gremlin sorgusunun performans ve yürütme ayrıntılarını analiz edin executionProfile() . Bu adım, sorun giderme ve iyileştirmeye yardımcı olan sorgudaki her adım için ölçümleri içeren bir JSON nesnesi döndürür.

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

Adım hakkında executionProfile() daha fazla bilgi için bkz. yürütme profili başvurusu.

Tavsiye

Adım executionProfile() Gremlin sorgusunu yürütür. Bu sorgu, sorguda addV belirtilen değişikliklerin oluşturulmasına ve işlenmesine neden olan veya addE adımlarını içerir. Gremlin sorgusu tarafından oluşturulan istek birimleri de ücretlendirilir.

Kör fan-out sorgu desenlerini tanımlama

Bir sorgu gerektiğinden daha fazla bölüme eriştiğinde, genellikle eksik bölüm anahtarı önkoşullarından dolayı kör bir fan-out oluşur. Bu kötü model gecikme süresini ve maliyeti artırabilir. Yürütme profili, yüksek fanoutFactorbir göstererek bu tür desenleri tanımlamaya yardımcı olur.

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

Yayma sorgularını iyileştirme

Yüksek fanoutFactor (örneğin 5), sorgunun birden çok bölüme erişmiş olduğunu gösterir. en iyi duruma getirmek için sorgu koşuluna bölüm anahtarını ekleyin:

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

Filtrelenmemiş sorgu düzeni

Filtrelenmemiş sorgular büyük bir ilk veri kümesini işleyip maliyeti ve gecikme süresini artırabilir.

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

Filtrelenmiş sorgu düzeni

Geçişlerden önce filtre eklemek çalışma kümesini azaltabilir ve performansı artırabilir. Yürütme profili filtrelemenin etkisini gösterir. Filtrelenen sorgu daha az köşe işleyerek daha düşük gecikme süresine ve maliyete neden olur.

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