Microsoft Fabric'de graf deseni sorguları yazma

Graf deseni eşleştirmesi, sezgisel ve görsel söz dizimini kullanarak bulmak istediğiniz verilerin yapısını açıklamanıza olanak tanır. Tabloları birleştirmek yerine, ilişkilere benzeyen desenler yazarsınız- kenarlarla bağlanan düğümler. Bu makalede, Microsoft Fabric grafında yaygın senaryolar için GQL desen sorgularının nasıl yazabileceğiniz gösterilmektedir.

Örneklerde sosyal ağ örnek veri kümesi kullanılır. Tam desen söz dizimi başvurusu için bkz. GQL grafik desenleri.

Prerequisites

  • Verilerin yüklendiği bir grafik öğesi. Grafı yeni kullanıyorsanız, önce öğreticiyi tamamlayın.
  • Temel MATCH ve RETURN sorgular hakkında bilgi. Bkz. GQL dil kılavuzu.

Doğrudan ilişkileri eşleştir

Temel desen bir düğüm türü, belirli bir kenar türü ve başka bir düğüm türüyle eşleşir. Söz dizimi, ilişkinin diyagramına benzer.

Örneğin, çalıştıkları şirketle eşleştirilmiş en fazla 100 kişi bulmak için:

MATCH (p:Person)-[:workAt]->(c:Company)
RETURN p.firstName, p.lastName, c.name
LIMIT 100

Yönü bilmediğiniz veya önemsemediğiniz durumlarda dolaylı olmayan bir kenar deseni kullanın. Örneğin, bağlantıyı kimin başlattığından bağımsız olarak en fazla 100 ortak tanıdık bulmak için:

MATCH (a:Person)-[:knows]-(b:Person)
RETURN a.firstName, b.firstName
LIMIT 100

Note

graph şu anda yönsüz kenarlar oluşturmayı desteklemez, ancak -[:label]- söz dizimini kullanarak kenarları herhangi bir yönde sorgulayabilirsiniz.

Satır içi WHERE ile desenleri filtreleme

Düğümleri ve kenarları eşleştirildikçe filtrelemek için WHERE desenin içine yerleştirin. Bu yaklaşım, olgudan sonra filtrelemekten daha verimlidir.

Örneğin, 1990'da doğan ve adı 'A' ile başlayan bir şirkette çalışan kişileri bulmak için:

MATCH (p:Person WHERE p.birthday < 19900101)-[:workAt]->(c:Company WHERE c.name STARTS WITH 'A')
RETURN p.firstName, p.lastName, c.name

Hangi ilişkilerin eşleşeceklerini kısıtlamak için kenar özelliklerine filtre uygulama. Örneğin, yalnızca 2010 veya sonraki bir tarihte bir şirkette çalışmaya başlayan kişileri döndürmek için:

MATCH (p:Person)-[w:workAt WHERE w.workFrom >= 2010]->(c:Company)
RETURN p.firstName, c.name, w.workFrom

Çoklu atlamalı ilişkileri eşleştir

Bir ifadede birden çok atlamadan geçiş yapmak için değişken uzunlukta desenler kullanın. Söz diziminde {min,max} ile en az ve en fazla atlama sayısını belirtin.

Örneğin, Alice'ten iki ila dört arkadaşlık derecesi içinde ulaşılabilen en fazla 100 kişi bulmak için:

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

Alice'ten en fazla 100 anlık ve ikinci derece bağlantı (bir veya iki atlama) bulmak için:

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

Yol modlarıyla gezinmeyi kontrol etme

Varsayılan olarak GQL, aynı kenarın birden çok kez dolaşmasını engelleyen modu kullanır TRAIL . Farklı garantilere ihtiyacınız olduğunda yol modlarını açıkça kullanın.

Yol modu Davranış Ne zaman kullan...
WALK Yinelenen düğümlere ve kenarlara izin verir Kısıtlama olmadan ham geçiş istiyorsunuz. Nadiren gereklidir; temel olarak keşif sorguları için yararlıdır.
TRAIL Tekrarlanan kenar yok (varsayılan) Aynı ilişkiyi geri çekmekten kaçınmak istiyorsunuz, ancak aynı düğüm farklı ilişkiler aracılığıyla görünebilir. Çoğu çapraz geçiş sorgusu için iyi çalışır.
SIMPLE Başlangıç ve bitiş dışında tekrar eden düğümler yok. Herhangi bir düğümün bir yolun ortasında birden fazla kez görünmesini istemiyor, ancak başlangıca geri dönen yollara izin veriyorsunuz. Döngüleri algılamak için kullanışlıdır.
ACYCLIC Hiç yinelenmiş düğüm yok Hiçbir düğümün yolun herhangi bir yerinde birden çok kez görünmeydiğini garanti etmeniz gerekir. Katı hiyerarşiler, silsile veya bir düğümün yeniden ziyaret edilmesinin yanlış sonuçlara yol açabileceği herhangi bir geçiş için kullanın.

WALK en izinli moddur ve ACYCLIC en kısıtlayıcı moddur. TRAIL varsayılandır ve çoğu sorgu için iyi çalışır. Yalnızca kullanım örneğinin gerektirdiği durumlarda daha kısıtlayıcı bir mod kullanın.

Farkı göstermek için Alice → Bob → Carol → Bob yolunu göz önünde bulundurun:

  • WALK — bu yola izin verir. Düğümler ve kenarlar serbestçe tekrarlanabilir.
  • TRAIL — bu yola izin verir. Bob iki kez yer alır, ancak kullanılan her kenar farklı bir ilişkidir (Alice→Bob ve Carol→Bob farklı kenarlardır), dolayısıyla hiçbir kenar tekrarlanmaz.
  • SIMPLE — bu yolu engeller. Bob birden çok kez görünür ve SIMPLE yalnızca yolun hem başlangıcı hem de sonu (kapalı bir döngü) olduğunda düğümün yinelemesini sağlar. Burada Alice başlangıç, Bob ise sondur, bu nedenle hiçbir özel durum geçerli değildir.
  • ACYCLIC — bu yolu engeller. Bob, yolun herhangi bir yerinde birden çok kez görünür.

Aşağıdaki örnek, dört atlama içinde Alice'in ağında ulaşılabilen ilk 100 kişinin her birine yol açan farklı yol sayısını saymak için nasıl kullanılacağını TRAIL gösterir:

MATCH TRAIL (src:Person WHERE src.firstName = 'Alice')-[:knows]->{1,4}(dst:Person)
RETURN dst.firstName, dst.lastName, count(*) AS pathCount
LIMIT 100

Dört atlama içinde Alice'ten ulaşılabilen en fazla 100 kişi döndürmek için kullanın ACYCLIC ; burada yoldaki her kişi benzersizdir:

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

Tavsiye

Büyük grafikler için her zaman değişken uzunluklu desenlerde ({1,4} yerine {1,}) bir üst sınır ayarlayın. Sınırsız dolaşım, yoğun grafikler üzerinde sorgu zaman aşımı sınırlarına ulaşabilir. Bkz . Geçerli sınırlamalar.

Paylaşılan varlıkları ifade etmek için değişken yeniden kullanma

Bir desenin iki bölümünde aynı değişkeni yeniden kullanma örtük bir eşitlik kısıtlaması oluşturur; her iki başvuru da aynı düğümle eşleşmelidir. Bu teknik, "paylaşılan bir üçüncü varlık aracılığıyla bağlanan varlıkları bulma" ifadenizi sağlar.

Örneğin, birbirini bilen ve aynı şirkette çalışan en fazla 100 çift kişi bulmak için:

MATCH (c:Company)<-[:workAt]-(a:Person)-[:knows]-(b:Person)-[:workAt]->(c)
RETURN a.firstName, b.firstName, c.name
LIMIT 100

Değişken c her iki hedef için de workAt yeniden kullanılır, bu nedenle sorgu yalnızca her iki kişinin de birbirini bildiği ve aynı şirkette çalıştığı çiftleri döndürür.

Aynı gönderiyi beğenen en fazla 100 çift kişi bulmak için:

MATCH (a:Person)-[:likes]->(post:Post)<-[:likes]-(b:Person)
WHERE a.id < b.id
RETURN a.firstName, b.firstName, post.id
LIMIT 100

Tavsiye

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

Birden çok deseni birleştirme

Tek bir MATCHiçindeki birden çok deseni virgülle ayırarak listeleyin. Tüm desenlerin doğru bir şekilde birleştirebilmesi için en az bir değişken paylaşması gerekir.

Örneğin, hem iş yeri hem de bulundukları şehirle birlikte en fazla 100 kişi bulmak için:

MATCH (p:Person)-[:workAt]->(c:Company),
      (p)-[:isLocatedIn]->(city:City)
RETURN p.firstName, c.name AS company, city.name AS city
LIMIT 100

Paylaşılan değişken p iki deseni birbirine bağlar. Her sonuç satırı, kişinin şirketi ve şehri ile bir kişiyi temsil eder.

İsteğe bağlı ilişkileri eşleştir

Her düğüm için bir ilişki bulunmayabilirken kullanın OPTIONAL MATCH . Eşleşmesi olmayan satırlar, SQL'e NULLbenzer değerlerle LEFT JOIN korunur.

Örneğin, işvereni olmayanları da (yani, şirket sütunu NULL dönenler) içerecek şekilde, şirket adıyla birlikte en fazla 100 kişiyi listeleyebilirsiniz.

MATCH (p:Person)
OPTIONAL MATCH (p)-[:workAt]->(c:Company)
RETURN p.firstName, p.lastName, c.name AS company
LIMIT 100

Herhangi bir şirkette çalışmayan en fazla 100 kişiyi bulmak için sonra IS NULL kullanınOPTIONAL MATCH:

MATCH (p:Person)
OPTIONAL MATCH (p)-[:workAt]->(c:Company)
FILTER c IS NULL
RETURN p.firstName, p.lastName
LIMIT 100