Microsoft Fabric'de grafik verilerini filtreleme ve toplama

Filtreleme sonuçlarınızı önemli olan satırlara daraltıyor. Toplama, bu satırları sayılar, toplamlar ve ortalamalar halinde özetler. Bu makalede, GQL sorgularındaki her iki tekniğin de Microsoft Fabric'daki graflara nasıl uygulanacağı gösterilmektedir.

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

Bu makaleyi satır ve desen filtreleme, gruplanmış ve gruplanmamış toplama, toplu filtreler ve koşullu yönlendirme için kullanın. Çok sıçramlı desenler oluşturmak ve yol seçmek için bkz. Graf desen sorguları yaz. Uyarlamaya hazır iş görevleri için Yaygın GQL sorguları yazma bölümüne bakın.

Prerequisites

FİlTRE ile satırları filtreleme

Yalnızca bir koşulu karşılayan satırları tutmak için kullanın FILTER . Eşleşen sonuçları daraltmak için FILTER ardından MATCH yerleştirin.

Aşağıdaki sorgu, tüm kadınların adını ve doğum gününü döndürür.

MATCH (p:Person)
FILTER p.gender = 'female'
RETURN p.firstName, p.lastName, p.birthday

Birden çok koşulu AND ve OR ile birleştirin. Örneğin, aşağıdaki sorgu 1990'da doğan tüm kadınların adlarını döndürür:

MATCH (p:Person)
FILTER p.gender = 'female' AND p.birthday < 19900101
RETURN p.firstName, p.lastName

Tavsiye

Koşul, hangi düğümün veya kenarın eşleşmeye katılabileceğini belirlediğinde satır içi WHERE ifade kullanın. FILTER öğesini, koşul önceki bir ifade tarafından üretilen satır için geçerliyse kullanın. Koşulların yerleştirilmesi, en kısa yol sonuçlarını değiştirebilir; bkz. Koşulları yol seçiminden önce veya sonra yerleştirme.

Desen eşleştirme sırasında filtre uygulama

Bir MATCH desen içindeki satır WHERE içi cümleler, hangi düğümlerin ve kenarların eşleşmeye uygun olduğunu sınırlar. Sorgu optimizatoru, tarama sırasında eşdeğer önlemleri uygulayabilir, yani satır içi sözdizimi ayrı bir FILTER'dan daha hızlı değildir. Amaçlanan anlamanlamı ifade eden biçimi seçin.

Örneğin, 1994 yılından önce doğan kişileri ve çalıştıkları şirketi bulmak için sonuçları adı 'A' ile başlayan şirketlerle sınırlandırın:

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

Kenar özelliklerini aynı şekilde filtreleyin. Örneğin, yalnızca 2000 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 >= 2000]->(c:Company)
RETURN p.firstName, p.lastName, c.name, w.workFrom

Hat içi ve maç sonrası filtreleme arasında seçim hakkındaki daha fazla bilgi için bakınız: GQL sorgu performansını optimize et.

Filtrelerde null değerleri işleme

GQL üç değerli mantık kullanır: koşullar TRUE, FALSE veya UNKNOWN olarak değerlendirilir. Özellik değeri null olduğunda karşılaştırmalar döndürür UNKNOWN. FILTER, UNKNOWN eşleşmiyormuş gibi davranır, bu nedenle satır dışlanır.

Null değerlerini açıkça test etmek için IS NULL ve IS NOT NULL kullanın:

-- Only include people whose browser is known
MATCH (p:Person)
FILTER p.browserUsed IS NOT NULL
RETURN p.firstName, p.browserUsed

Bir özellik null olabileceğinde varsayılan değeri değiştirmek için kullanın coalesce() :

MATCH (p:Person)
RETURN p.firstName, coalesce(p.browserUsed, 'Unknown browser') AS browser

Caution

NULL = NULL UNKNOWN olarak değerlendirilir, TRUE değil. Her zaman eşitlik kontrolü yerine null değerlerini test etmek için IS NULL kullanın.

RETURN ile sonuçları toplama

Sonuçlarınızı özetlemek için içindeki RETURN toplama işlevlerini kullanın. Grafik aşağıdaki toplam fonksiyonları destekler: COUNT, SUM, AVG, COLLECT_LISTCOLLECT_ONEMINMAXve .COLLECT_ELEMENTS

Örneğin, grafikteki tüm kişileri saymak için:

MATCH (p:Person)
RETURN count(*) AS totalPeople

Kaç ayrı şirketin kişi çalıştırması gibi farklı değerleri saymak için:

MATCH (p:Person)-[:workAt]->(c:Company)
RETURN count(DISTINCT c) AS companyCount

Bir agregat için filtre girişi

Yalnızca o toplamanın girdisini filtrelemek için bir toplamanın ardından FILTER (WHERE predicate) ekleyin. Aynı RETURN alandaki diğer agregalar hâlâ tüm giriş satırlarını alır.

MATCH (p:Person)
RETURN count(*) AS allPeople,
       count(*) FILTER (WHERE p.birthday < 19900101) AS peopleBornBefore1990

Koşulu sağlayan satırlardan en fazla bu kadarını kullanmak için LIMIT öğesini aggregate filtresinin içine ekleyin. Sorgu, toplamaya özgü sınırdan önce yüklemi uygular.

MATCH (p:Person)
RETURN count(*) FILTER (WHERE p.birthday < 19900101 LIMIT 100) AS sampleCount

Toplamaya özgü FILTER ve LIMIT, sorgunun geri kalanından satırları kaldırmaz. Satır akışını filtrelemek istediğinizde, bir FILTER ifadesi veya eşleşme düzeyinde bir WHERE yan tümcesi kullanın.

Değerleri topla

COLLECT_LIST, null değerler de dahil olmak üzere her giriş değeri için bir liste öğesi döndürmek amacıyla kullanılır. Kopyaları kaldırmak için ekle DISTINCT .

MATCH (p:Person)
RETURN collect_list(DISTINCT p.browserUsed) AS browsers

COLLECT_ONE bir sıfır olmayan giriş değeri döndürür. Seçilen değer deterministik değildir, bu yüzden sadece gruptan herhangi bir değer kabul edilebilir olduğunda kullanın.

COLLECT_ELEMENTS liste değerli girdileri kabul eder ve elemanlarını tek bir listeye birleştirir:

MATCH (p:Person)
RETURN collect_elements([p.firstName, p.lastName]) AS names

Sütunlar gruplanmadığında, girdi satırı olmayan bir toplu sorgu COLLECT_LIST ve COLLECT_ELEMENTS için boş bir liste, COLLECT_ONE için ise null döndürür.

GROUP BY ile sonuçları gruplandırma

Paylaşılan değerlere göre satırları gruplandırmak ve her grup içinde toplamları hesaplamak için GROUP BY içinde RETURN kullanın. Bu gruplandırma, SQL'in GROUP BYGQL eşdeğeridir.

Örneğin, şirket başına çalışanları saymak için:

MATCH (p:Person)-[:workAt]->(c:Company)
LET companyId = c.id, companyName = c.name
RETURN companyId, companyName, count(*) AS employeeCount
GROUP BY companyId, companyName
ORDER BY employeeCount DESC

Birden çok sütuna göre gruplandırma ve aynı anda birkaç toplama işlemi yapma. Örneğin, kişi sayısını ve doğum günü aralığını cinsiyete ve tarayıcıya göre ayırarak en yaygın 10 bileşimi döndürerek:

MATCH (p:Person)
LET gender = p.gender
LET browser = p.browserUsed
RETURN gender,
       browser,
       count(*) AS personCount,
       min(p.birthday) AS earliestBirthday,
       max(p.birthday) AS latestBirthday
GROUP BY gender, browser
ORDER BY personCount DESC
LIMIT 10

Note

RETURN içindeki tüm toplama olmayan ifadeler, GROUP BY içinde görünmelidir. içinde GROUP BY olmayan ifadeler bir toplama işlevi kullanmalıdır.

Toplanan sonuçları sıralama ve sınırlama

top-N sonuçlarını bulmak için ORDER BY ve LIMIT'i birlikte GROUP BY ile kullanın.

Örneğin, yerleşik kişi sayısına göre ilk beş şehri bulmak için:

MATCH (p:Person)-[:isLocatedIn]->(city:City)
LET cityId = city.id, cityName = city.name
RETURN cityId, cityName, count(*) AS residentCount
GROUP BY cityId, cityName
ORDER BY residentCount DESC
LIMIT 5

Important

ORDER BY öğesini LIMIT önüne yerleştirin. LIMIT her zaman zaten sıralanmış sonuç kümesi için geçerlidir.

Satırları koşullu ifadelerle yönlendirin

Her gelen satırı ilk eşleşen dala yönlendirmek için bir koşul ifadesi kullanın. Girdi, sadece bir toplama değil, önceki herhangi bir sorgu aşamasından gelebilir. Örneğin, aşağıdaki sorgu, çalışan sayıları hesaplandıktan sonra şirketleri kategorize eder:

MATCH (p:Person)-[:workAt]->(c:Company)
LET companyId = c.id, companyName = c.name
RETURN companyId, companyName, count(*) AS employeeCount
GROUP BY companyId, companyName
NEXT
WHEN employeeCount >= 100u THEN
  RETURN companyId, companyName, employeeCount, 'Large' AS category
WHEN employeeCount >= 10u THEN
  RETURN companyId, companyName, employeeCount, 'Medium' AS category
ELSE
  RETURN companyId, companyName, employeeCount, 'Small' AS category

Dallar, sadece ifadeleri döndürmek yerine tam sorgu ifadeleri ve iç içe işlem işlemleri çalıştırabilir. Aşağıdaki örnek, farklı dal şekilleri üzerinden üç giriş satırı gönderir. Bir dal bir MATCH çalıştırır, biri UNION ALL ile iki agregayı birleştirip ardından sonuçlarını toplulaştırır ve yedek dal sabit bir değer döndürür:

FOR selector IN [1, 2, 3]
RETURN selector
NEXT
WHEN selector = 1 THEN
  MATCH (:Person)-[:knows]->(:Person)
  RETURN count(*) AS total, 'Knows edges' AS category
WHEN selector = 2 THEN {
  MATCH (:Person)-[:workAt]->(:Company)
  RETURN count(*) AS partialCount
  UNION ALL
  MATCH (:Person)-[:studyAt]->(:University)
  RETURN count(*) AS partialCount
  NEXT
  RETURN sum(partialCount) AS total, 'Affiliation edges' AS category
}
ELSE
  RETURN 0u AS total, 'No selected metric' AS category

Sorgu motoru, her satır için koşulları sırayla değerlendirir. Sadece ilk eşleşen şubeyi çalıştırır. Bir yüklem UNKNOWN olarak değerlendirilirse, değerlendirme sonraki dalla devam eder. Bir ELSE olmadan, bir WHEN dalıyla eşleşmeyen satırlar atlanır.

Koşullu ifadeler ifadelerden CASE farklıdır. Graph, eşitlik temelli değer seçimi için basit CASE <expression> WHEN <value> ifadeleri destekler. Aranan CASE WHEN <predicate> ifadeler desteklenmiyor. Daha fazla bilgi için Koşullu ifadeler sayfasına bakınız.