Microsoft Fabric üzerinde yaygın GQL sorguları yazma

Bu makalede, Microsoft Fabric yaygın graf görevleri için pratik GQL sorgu desenleri sağlanır: komşu bulma, çok bağlantılı bağlantılarda dolaşma, paylaşılan bağlantıları tanımlama, ilişkileri sayma ve bağlantısız varlıkları bulma.

Örneklerde sosyal ağ örnek veri kümesi kullanılır. Sorgu akışı ve ifadelerinin uçtan uca açıklaması için GQL dil rehberine bakınız. Yapmak istediğiniz grafik görevini bildiğinizde bu makaleyi kullanın. Düğüm, kenar ve yol desenleri oluşturma konusunda sistematik talimatlar için bkz. Graf desen sorguları yaz. Detaylı filtreleme ve toplama iş akışları için bkz. Grafik verilerini filtrele ve topla.

Prerequisites

Doğrudan komşuları bulma

Başlangıç düğümüne bir adımda bağlı olan tüm düğümleri geri getir.

Belirli bir kişinin tanıdığı herkesi bulun:

MATCH (p:Person WHERE p.firstName = 'Alice')-[:knows]->(friend:Person)
RETURN friend.firstName, friend.lastName

Bir kişinin çalıştığı tüm şirketleri bulun:

MATCH (p:Person WHERE p.firstName = 'Alice')-[:workAt]->(c:Company)
RETURN c.name, c.url

Arkadaşlarınızı bulma (çoklu atlama)

Birden fazla atlamadan geçiş yapmak için değişken uzunlukta desenler {min,max} ile kullanın.

Alice’ten tam olarak iki knows kenar üzerinden ulaşılabilen kişileri bulun:

MATCH (alice:Person WHERE alice.firstName = 'Alice')-[:knows]->{2,2}(fof:Person)
RETURN DISTINCT fof.firstName, fof.lastName
LIMIT 100

Üç derece içinde ulaşılabilen herkesi bulun:

MATCH (src:Person WHERE src.firstName = 'Alice')-[:knows]->{1,3}(dst:Person)
RETURN DISTINCT dst.firstName, dst.lastName
LIMIT 100

Alice'ten her kişiye dört zıplama içinde ulaşılabilecek en kısa yolu bulun:

MATCH p = ANY SHORTEST
  (src:Person WHERE src.firstName = 'Alice')-[:knows]->{1,4}(dst:Person)
RETURN dst.firstName, dst.lastName, path_length(p) AS hopCount
ORDER BY hopCount, dst.lastName
LIMIT 100

Aynı sayıda adımla aynı kişiye ulaşan birden fazla en kısa yol varsa, ANY SHORTEST eşitlik durumunda deterministik bir seçim yapmadan bunlardan birini döndürür.

Satır içi yüklemler, ANY SHORTEST için hangi yolların uygun olduğunu kısıtlar. En kısa yol seçildikten sonra son filtreler uygulanır. Örneğin, yol seçiminden önce veya sonra Place predicate'lerine bakınız.

Tavsiye

Tahmin edilebilir sorgu maliyeti için sonlu bir üst sınır kullanın. Sınırsız ALL WALK geçiş desteklenmiyor. Diğer sınırsız yol modları yine de büyük sonuçlar verebilir. Bkz . Geçerli sınırlamalar.

Varlık başına ilişki sayısı

Her bir varlığın kaç ilişkisi olduğunu saymak için GROUP BY ve count(*) ile kullanın. Detaylı gruplama, toplu filtreleme ve koşullu yönlendirme desenleri için bkz. Grafik verilerini filtrele ve topla.

Her bir kişinin kaç arkadaşı olduğunu say ve en çoktan en aza sırala.

MATCH (p:Person)-[:knows]->(friend:Person)
LET personId = p.id, name = p.firstName || ' ' || p.lastName
RETURN personId, name, count(*) AS friendCount
GROUP BY personId, name
ORDER BY friendCount DESC
LIMIT 20

Her varlık için bir değer hesaplayın

Her giriş satırı için bir değer hesaplamak için koreleli CALL bir alt sorgu kullanın. Dış sorgudan gelen değişkenler alt sorgu içinde örtük olarak mevcuttur.

Her kişi için arkadaş sayısını hesaplayın:

MATCH (p:Person)
CALL {
  MATCH (p)-[:knows]->(friend:Person)
  RETURN count(*) AS friendCount
}
RETURN p.firstName, p.lastName, friendCount
ORDER BY friendCount DESC

Dış değişkenler, CALL öğesinden sonra da erişilebilir olmaya devam eder. Alt sorgu içinde oluşturulan değişkenlerden yalnızca döndürülen sütunlar alt sorgunun dışında kullanılabilir. Eşleşen arkadaş bulunmadığında gruplanmamış count(*), 0 döndürür; bu nedenle bu sorgu, arkadaşı olmayan kişileri korur.

Normal CALL, alt sorgu hiçbir satır döndürmediğinde dış satırı eler ve birden fazla satır döndürdüğünde alt sorgunun döndürdüğü her satır için bir çıktı satırı üretir. Eşleşen alt sorgu satırı olmayan bir dış satırı korumanız gerektiğinde OPTIONAL CALL ifadesini kullanın.

Paylaşılan bağlantıları bulma

Bir değişkeni desenin iki bölümünde yeniden kullanma örtük bir "aynı düğüm" kısıtlaması oluşturur. Paylaşılan bir üçüncü varlık aracılığıyla bağlanan varlıkları bulmak için bu kısıtlamayı kullanın.

Her ikisi de aynı kişiyi bilen kişi çiftlerini bulun:

MATCH (a:Person)-[:knows]->(mutual:Person)<-[:knows]-(b:Person)
WHERE a.id < b.id
RETURN a.firstName, b.firstName, mutual.firstName AS sharedContact
LIMIT 100

Aynı şirkette çalışan kişi çiftlerini bulun:

MATCH (c:Company)<-[:workAt]-(a:Person), (c)<-[:workAt]-(b:Person)
WHERE a.id < b.id
RETURN a.firstName, b.firstName, c.name AS company
LIMIT 100

Tavsiye

Koşul, WHERE a.id < b.id yinelenen çiftlerin (Alice–Bob ve Bob–Alice) sonuçlarda görünmesini engeller.

İlişkisi olmayan varlıkları bulma

NOT EXISTS, ilişkili bir alt sorgunun hiçbir satır döndürmediği düğümleri bulmak için kullanılır.

Herhangi bir şirkette çalışmayan kişileri bulun:

MATCH (p:Person)
WHERE NOT EXISTS {
  MATCH (p)-[:workAt]->(c:Company)
  RETURN c
}
RETURN p.firstName, p.lastName
LIMIT 100

Yorum içermeyen gönderileri bulun:

MATCH (post:Post)
WHERE NOT EXISTS {
  MATCH (comment:Comment)-[:replyOf]->(post)
  RETURN comment
}
RETURN post.id, post.content
LIMIT 100

Birçok bağlantısı olan varlıkları bulma

GROUP BY ve FILTER öğelerini birleştirerek yüksek bağlı düğümleri tanımlayın. Bu yöntem hub'ları veya aykırı değerleri bulmak için kullanışlıdır.

10'dan fazla arkadaşı olan kişileri bulun:

MATCH (p:Person)-[:knows]->(friend:Person)
LET personId = p.id, name = p.firstName || ' ' || p.lastName
RETURN personId, name, count(*) AS friendCount
GROUP BY personId, name
FILTER friendCount > 10
ORDER BY friendCount DESC

Note

FILTER sonra GROUP BY SQL'de olduğu gibi HAVING çalışır. Tek tek satırları değil, toplanan sonucu filtreler.