Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu makalede, Microsoft Fabric'de grafla çalışırken tahmin edilebilir ve verimli bir şekilde performans gösteren GQL (Graph Sorgu Dili) sorguları yazmaya yönelik yönergeler sağlanır. Öneriler, geçerli platform davranışına ve belgelenmiş kısıtlamalara dayanır.
Grafik boyutu, sonuç boyutu ve sorgu zaman aşımıyla ilgili sabit sınırlar için bkz . Geçerli sınırlamalar. Bu makaledeki çeşitli öneriler, grafik şemanızı nasıl tasarladığınızla da ilgilidir. Daha fazla bilgi için bkz . Grafik şeması tasarlama.
Filtreleri anlamsallarına göre yerleştirin
Hangi düğümün veya kenarın eşleşmeye katılabileceğini tanımlıyorsa, yüklemi graf deseninin içine yerleştirin. Tamamlanmış eşleşmeyi sonradan filtrelemek için ifade düzeyinde bir MATCH ... WHERE koşulu ya da koşul daha önceki bir ifade tarafından üretilen satıra uygulanıyorsa ayrı bir FILTER ifadesi kullanın.
Örneğin, eşleşen düğümler üzerindeki koşullar için desen düzeyinde WHERE maddeler kullanın:
MATCH (p:Person WHERE p.birthday < 19940101)-[:workAt]->(c:Company WHERE c.id > 1000)
RETURN p.firstName, p.lastName, c.name
Ayrı FILTER bir koşulu, varsayılan ALL yol aramasını kullanan sıradan zorunlu bir eşleşmeden sonra aynı durumu ifade edebilir:
MATCH (p:Person)-[:workAt]->(c:Company)
FILTER p.birthday < 19940101 AND c.id > 1000
RETURN p.firstName, p.lastName, c.name
Sorgu optimizatoru, tarama sırasında eşdeğer önlemleri uygulayabilir, bu da sorgu semantiklerini korur, yani satır içi sözdizimi doğası gereği daha hızlı değildir. Şartın uygulandığı zamanı ifade eden formu seçin.
Yüklemin konumu, ANY SHORTEST ile sonuçları değiştirebilir. Satır içi yüklemler, en kısa yol seçimine uygun olan yolları kısıtlar. Bir ifade seviyesi WHERE veya sonraki FILTER bir yol seçiminden sonra uygulanır, böylece daha uzun bir yol seçmeden seçilen en kısa yolu kaldırabilir. Geçerli MATCH ... WHERE kısıtlaması ve güvenilir bir yerleştirme düzeni için bkz. Yüklemleri yol seçiminden önce veya sonra yerleştirme.
OPTIONAL MATCH ile yerleştirme de önemlidir; satır içi bir WHERE isteğe bağlı eşleşmeyi kısıtlarken, sonraki bir FILTER NULL ile genişletilmiş satırı kaldırabilir.
Tavsiye
Desen düzeyini WHERE sql JOIN ... ON koşuluna benzer olarak düşünün. Ortaya çıkan satırı sonradan filtrelemek yerine, hangi eşleşmelerin koşulları sağladığını açıklar.
Yalnızca ihtiyacınız olan özellikleri döndürme
Yalnızca senaryonuzun gerektirdiği düğüm ve kenar özelliklerini döndürür. Özelliklerin yalnızca bir alt kümesine ihtiyacınız olduğunda tam düğümleri döndürmekten veya RETURN * kullanmaktan kaçının.
Gereksiz özelliklerin seçilmesi veri okuma, serileştirme maliyeti ve yanıt boyutunu artırır. Grafik modelleme sırasında, sadece düğüm tipi özellikler olarak ihtiyacınız olan kaynak sütunları seçin.
Önerilen: Dar projeksiyon.
MATCH (p:Person)-[:workAt]->(c:Company)
RETURN p.firstName, p.lastName, c.name
Kaçının: Tam düğümleri döndürmekten.
MATCH (p:Person)-[:workAt]->(c:Company)
RETURN *
Uyarı
Yalnızca sorgular veya analiz için gerekli olduğunda grafik modellemesi sırasında düğüm türü özellikleri ekleyin. Düğüm başına daha az özellik hem depolama hem de sorgu ek yükünü azaltır.
Sonuç kümesi boyutunu sınırla
Yüksek kardinaliteye sahip olabilecek düğümleri veya ilişkileri sorgularken LIMIT veya diğer sınırlayıcı koşulları uygulayın. İlişkisiz grafik eşleşmeleri, platform sınırlarına yaklaşan çok büyük sonuç kümeleri oluşturabilir.
Önerilen: Sınırlanmış sonuçlar.
MATCH (p:Person)-[:knows]->(friend:Person)
RETURN p.firstName, friend.firstName
LIMIT 1000
Önle: İlişkisiz yüksek kardinalite eşleşmesi.
MATCH (p:Person)-[:knows]->(friend:Person)
RETURN p.firstName, friend.firstName
Önemli
Grafik, iç ikili temsili 64 MB'yi aşan sorgu yanıtlarını keser. Kısaltılmış yanıt, genel kodu 01000 ve kanonik GQLSTATUS değeri 01M11 olan ek bir durum da içerir. Filtreler, dar projeksiyonlar ve LIMIT sonuç boyutunu azaltmak için kullanın. Daha fazla bilgi için bkz . Geçerli sınırlamalar.
Geçişleri kısa ve hedefli tutun
İç içe veya son derece karmaşık grafik desenlerinden kaçının. Belirli bir soruyu doğrudan yanıtlayan basit, hedeflenen dolaşmaları kullanın. Değişken uzunlukta bir desendeki her ek atlama, özellikle yoğun bağlantılı grafiklerde motorun değerlendirdiği yol sayısını üstel şekilde artırabilir.
Önerilen: Sıkı sınırlar.
-- Use the narrowest hop range that answers your question
MATCH (p:Person)-[:knows]->{1,3}(friend:Person)
RETURN p.firstName, friend.firstName
LIMIT 1000
Kaçının: Belirgin bir ihtiyaç yokken geniş bir tarama aralığı.
-- A wider range on a dense graph is more expensive
MATCH (p:Person)-[:knows]->{1,8}(friend:Person)
RETURN *
Önemli
Görsel sorgu oluşturucu, değişken uzunlukta yolları sekiz zıplama ile sınırlar, ancak bu kullanıcı arayüzü sınırı kod düzenleyicideki GQL için geçerli değildir. Senaryonuzun izin verdiği en sıkı sınırı kullanın çünkü daha geniş bir aralık daha fazla yola uyabilir.
Bir yol aynı kenardan birden fazla geçmemeliyse TRAIL kullanın
Geçerli bir yolun bir kenarı tekrarlamaması gerektiğinde TRAIL yol modunu kullanın. Döngülü grafiklerde, bu kısıtlama varsayılan moda kıyasla WALK eşleşme yollarının sayısını da azaltabilir.
-- TRAIL prevents revisiting the same :knows edge
MATCH TRAIL (src:Person)-[:knows]->{1,4}(dst:Person)
WHERE src.firstName = 'Alice' AND dst.firstName = 'Bob'
RETURN count(*) AS numPaths
TRAIL olmadan, döngüsel bir grafta aynı sorgu, bir kenarı tekrarlayan yollar döndürebilir.
TRAIL’ı genel bir performans optimizasyonu olarak ele almak yerine, gerekli yol semantiğine uygun modu kullanın.
Sınırsız ALL WALK bir desen desteklenmez çünkü döngüler sonsuz sayıda yol üretebilir. Sınırsız TRAIL, SIMPLE, ve ACYCLIC desenler sonlansa da, yine de birçok yolu sayabilirler. Sorgu sınırsız geçiş gerektirmiyorsa sonlu bir üst sınır kullanın.
Verimli birleşimler için paylaşılan değişkenleri kullanma
Bir sorgu birden çok ilişkiden veri gerektirdiğinde, aynı varlık üzerindeki desenleri birleştirmek için paylaşılan bir değişken kullanın. Paylaşılan değişken olmadan desenler, her iki desendeki eşleşmelerin her birleşimi olan kartezyen bir ürün üretebilir ve bu da çok daha büyük bir sonuç kümesine yol açar.
Önerilen: Paylaşılan değişken p desenleri birleştirir.
-- Single shared variable ensures an efficient join
MATCH (p:Person)-[:workAt]->(c:Company),
(p)-[:isLocatedIn]->(city:City)
RETURN p.firstName, c.name AS company, city.name AS city
LIMIT 1000
Kaçının: Paylaşılan değişken içermeyen bağımsız örüntüler.
-- Without a shared variable, this produces a cartesian product
MATCH (p1:Person)-[:workAt]->(c:Company),
(p2:Person)-[:isLocatedIn]->(city:City)
RETURN p1.firstName, c.name, p2.firstName, city.name
Kartezyen ürün, bir desenden elde edilen her sonucu diğerinden elde edilen her sonuçla eşleştirir. 1.000 satırla eşleşiyorsa Person-workAt->Company ve Person-isLocatedIn->City 500 satırla eşleşiyorsa, sorgu 1.000 × 500 = 500.000 satır döndürür. Paylaşılan değişken eklemek birleştirmeyi kısıtlar, böylece yalnızca eşleşen çiftler döndürülür.
Düğümleri tanımlarken anahtar özelliklere göre filtreleme
Düğümleri benzersiz şekilde tanımlamak ve veri bütünlüğünü sağlamak için düğüm anahtarı kısıtlamaları tanımlanır. Belirli bir düğüme ihtiyacınız olduğunda, ilişkisiz düğümlerle eşleşmemek için onun anahtar özelliğini desen öncülüne ekleyin.
Örneğin, grafik türünüz, id'yi Person düğümlerinin anahtarı olarak tanımlıyorsa:
CONSTRAINT person_pk
FOR (n:Person) REQUIRE n.id IS KEY
Ardından, o kişiye ihtiyaç duyduğunuzda id üzerinde filtreleme yapın:
MATCH (p:Person WHERE p.id = 12345)-[:workAt]->(c:Company)
RETURN p.firstName, c.name
Filtre olmadan, sorgu Person kenarlarını geçmeden önce her workAt düğümle eşleşir:
MATCH (p:Person)-[:workAt]->(c:Company)
RETURN p.firstName, c.name
Tavsiye
Önemli bir kısıtlama, kimlik ve benzersizliği belirler. Tek başına belirli bir fiziksel arama veya sorgulama planı garanti etmez.
Uygun veri türlerini seçin
Her özelliğin değerlerini ve amaçlanan işlemleri temsil eden veri tipini seçin. Örneğin, hesaplayacağınız veya sayısal olarak karşılaştırdığınız değerler için biçimlendirilmiş sayıları dizgi olarak saklamak yerine sayısal bir tip kullanın.
Desteklenen veri türleri için bkz . Geçerli sınırlamalar — Veri türleri ve Desteklenen özellik türleri.
İlgili çapraz geçişleri tek bir sorguda birleştirme
Mümkün olduğunda, aynı kenarlardan bağımsız olarak geçen ayrı sorgular oluşturmak yerine tek bir grafik düzeninde ilgili varlıkları alın. Çapraz geçişlerin birleştirilmesi, yedekli desen eşleştirmeyi önler ve bir ilk sorgunun her sonuç satırı için ayrı bir sorgu tetiklediği N+1 sorgu sorununu önler.
Önerilen: Tek birleştirilmiş desen.
MATCH (c:Customer)-[:purchases]->(o:`Order`)-[:`contains`]->(product:`Product`)
RETURN c.fullName, o, product.productName
LIMIT 1000
Önle: Aynı Customer → Order kenardan geçen iki ayrı sorgu.
-- Query 1: fetch 100 orders
MATCH (c:Customer)-[:purchases]->(o:`Order`)
RETURN c.fullName, o
LIMIT 100
-- Query 2: repeat for each returned order, substituting its key value
MATCH (o:`Order` WHERE o.SalesOrderDetailID_K = 12345)-[:`contains`]->(product:`Product`)
RETURN o, product.productName
Gerçekçi veri hacimlerinde sorguları test etme
Küçük veri kümelerinde iyi performans gösteren sorgular doğrusal olarak ölçeklendirilmeyebilir. Sorgularınızı beklenen üretim iş yükünüzü temsil eden veri birimleriyle test edin.
- Filtreler ve sınırlar içeren muhafazakar sorgu şekillerini tercih edin.
- Büyük grafiklerde keşif "tüm verileri geri döndürme" sorgularından kaçının.
- 20 dakikalık zaman aşımı sınırına göre sorgu süresini izleyin.