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.

Bu makaleyi düğüm, kenar ve yol desenlerinin nasıl oluşturulacağını ve birleştirileceğini öğrenmek için kullanın. Komşuları veya ilişkisi olmayan varlıkları bulmak gibi uyuma hazır görevler için bkz. Yaygın GQL sorguları yaz. Filtreleme, gruplandırma ve toplu iş akışları için bkz. Grafik verilerini filtrele ve topla.

Prerequisites

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

Bir koşul, hangi düğümün veya kenarın eşleşmeye katılabileceğini tanımlıyorsa WHERE öğesini desen içinde yerleştirin. Tamamlanan eşleşmeyi postfiltrelemek için bir MATCH ... WHERE ifade düzeyinde bir koşul kullanın veya bu koşul önceki bir ifadeyle üretilen satıra uygulandığında ayrı FILTER bir koşul kullanın. Yüklem konumlandırması en kısa yol sonuçlarını değiştirebilir. Daha fazla bilgi için, yol seçiminden önceki veya sonra olan Place predicates'e bakınız.

Ö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 WALK, kullanır ve bu da tekrar edilen düğümler ve kenarlara izin verir. Öğelerin daha sıkı benzersizliğine ihtiyaç duyduğunuzda başka bir yol modu kullanın.

Yol modu Davranış Ne zaman kullan...
WALK Tekrarlanan düğümlere ve kenarlara izin verir (varsayılan) Tüm uyumlu yürüyüşleri sonlu bir sınır içinde yapmak istersiniz.
TRAIL Tekrarlayan kenarlar yok Aynı kenarı tekrar takip etmekten kaçınmak istersiniz, ancak aynı düğüm farklı kenarlardan görünebilir.
SIMPLE Paylaşılan başlangıç ve son düğümü dışında tekrarlanan düğümler yok ve tekrar edilen kenarlar 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 Tekrarlayan düğümler veya kenarlar 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.

ACYCLIC ve SIMPLE için, kenar tekilliği düğüm tekilliğinden kaynaklanır. SIMPLE Bir yol, ilk düğümüne geri dönerek kapanabilir, ancak yine de bir kenarı yeniden kullanamaz.

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)
LET personId = dst.id
RETURN personId, dst.firstName, dst.lastName, count(*) AS pathCount
GROUP BY personId, dst.firstName, dst.lastName
ORDER BY pathCount DESC
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

Varsayılan REPEATABLE ELEMENTS eşleşme modu, bir kenarın aynı grafik desenindeki ayrı yollar tarafından yeniden kullanılmasına olanak tanır. Tüm yollardaki her kenar bağlamasının farklı olması gerektiğinde DIFFERENT EDGES veya DIFFERENT RELATIONSHIPS kullanın:

MATCH DIFFERENT EDGES
  (p:Person)-[:knows]->(friend:Person),
  (p)-[:knows]->(other:Person)
RETURN p.firstName, friend.firstName, other.firstName
LIMIT 100

En kısa yolu geri getir

ALL varsayılan yol aramasıdır ve her eşleşen yolu döndürür. Her kaynak-hedef çifti için en kısa yollardan birini döndürmek üzere ANY SHORTEST kullanın. Aşağıdaki sorgu, Alice'ten Bob'a en kısa yolu bulur:

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

Birden fazla en kısa yol eşitlendiğinde, hangi yolun geri döneceği deterministik değildir. ALL SHORTEST Ve ANY yol aramaları desteklenmiyor.

Yüklemin konumu, ANY SHORTEST sonucunu değiştirebilir. Inline node ve edge predicate'ler hangi yolların uygun olduğunu sınırlarken, bir postfilter daha uzun bir yol seçmeden seçilen yolu kaldırabilir. Bkz. Konum yüklemlerini yol seçiminden önce veya sonra yerleştirme.

Tavsiye

Tahmin edilebilir sorgu maliyeti için sonlu bir üst sınırı tercih edin. Sınırsız ALL WALK kalıplar desteklenmiyor. Sınırsız desenler, TRAIL, SIMPLEveya ACYCLIC ile eleman benzersizliği nedeniyle sona erer, ancak yine de birçok yolu geri getirebilir. Unbounded ANY SHORTEST WALK yalnızca belirli sorgu şekillerini destekler. 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. Desenlerin aynı grafik öğesine bağlanması gerektiğinde bir değişkeni yeniden kullanın.

Ö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.

Bağlantısız kalıplar da geçerlidir, ancak eşleşmelerinin bir Kartezyen çarpımı oluştururlar. Onları yalnızca tüm kombinasyonlara bilerek ihtiyaç duyduğunuzda kullanın. Performans rehberliği için, bkz. Verimli birleşimler için paylaşılan değişkenler kullan.

İ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