Filtrování a agregace dat grafu v Microsoft Fabric

Filtrováním se výsledky zužují na řádky, na které záleží. Agregace shrnuje tyto řádky do počtů, součtů a průměrů. V tomto článku se dozvíte, jak použít obě techniky v dotazech GQL na graf v Microsoft Fabric.

Příklady používají ukázkovou datovou sadu sociální sítě. Úplný odkaz na příkazy a výrazy jazyka GQL najdete v průvodci jazykem GQL.

Předpoklady

  • Položka grafu s načtenými daty Pokud s grafem teprve začínáte, nejprve dokončete kurz .
  • Znalost základních dotazů MATCH a RETURN Viz průvodce jazykem GQL.

Filtrování řádků pomocí funkce FILTER

Slouží FILTER k zachování pouze řádků, které splňují podmínku. Umístěte FILTER po MATCH pro zúžení odpovídajících výsledků.

Následující dotaz vrátí všechny ženy s jejich jménem a datem narození:

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

Kombinování více podmínek s AND a OR. Například následující dotaz vrátí jména všech žen, které se narodily před 1990:

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

Tip

Pro zajištění lepšího výkonu filtrujte během porovnávání vzorů pomocí vložené WHERE klauzule, spíše než v samostatném FILTER příkazu. Viz Filtr během porovnávání vzorů.

Filtrování během porovnávání vzorů

Vložené WHERE klauzule uvnitř MATCH vzoru omezují, které uzly a hrany se shodují před vytvořením výsledků. Tento přístup je efektivnější než klauzule po vyhodnocení shody FILTER, protože dotazovací stroj vyřadí řádky dříve.

Pokud například chcete najít lidi, kteří se narodili před 1994, společně se společností, kde pracují, omezte výsledky na společnosti, jejichž jméno začíná na "A":

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

Vlastnosti okrajů můžete filtrovat stejným způsobem. Pokud například chcete vrátit jenom lidi, kteří začali pracovat ve společnosti v roce 2000 nebo novějším:

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

Další informace o rozdílu výkonu mezi interním a po vyhodnocení filtrováním najdete v dokumentu Optimalizace výkonu dotazů GQL.

Zpracování hodnot null ve filtrech

Funkce GQL používá tříhodnotovou logiku: predikáty se vyhodnocují jako TRUE, FALSEnebo UNKNOWN. Pokud je hodnota vlastnosti null, vrátí porovnání UNKNOWN. FILTER UNKNOWN považuje za neodpovídající, takže řádek je vyloučený.

Použijte IS NULL a IS NOT NULL k testování hodnot null explicitně.

-- Only include people who have a nickname
MATCH (p:Person)
FILTER p.nickname IS NOT NULL
RETURN p.firstName, p.nickname

Slouží coalesce() k nahrazení výchozí hodnoty, pokud vlastnost může mít hodnotu null:

MATCH (p:Person)
RETURN p.firstName, coalesce(p.nickname, p.firstName) AS displayName

Caution

NULL = NULL vyhodnocuje jako UNKNOWN, ne TRUE. Vždy se používá IS NULL k testování hodnot null, nikoli rovnosti.

Agregace výsledků s RETURN

Pomocí agregačních funkcí RETURN můžete shrnout výsledky. GQL podporuje count(), , sum()avg(), min(), a max().

Pokud chcete například spočítat všechny lidi v grafu:

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

Počet jedinečných hodnot, jako je počet společností, které zaměstnávají lidi:

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

Seskupení výsledků pomocí funkce GROUP BY

Použijte GROUP BY v RETURN ke seskupení řádků podle sdílených hodnot a výpočtu agregátů v rámci každé skupiny. Toto seskupení je ekvivalentem GQL v SQL GROUP BY.

Pokud chcete například spočítat zaměstnance na společnost:

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

Seskupte podle několika sloupců a vypočítáte několik agregací najednou. Můžete například rozdělit počet osob a rozsah narozenin podle pohlaví a prohlížeče a vrátit 10 nejběžnějších kombinací:

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

Všechny neagregační výrazy v RETURN musí být uvedeny v GROUP BY. Výrazy, které nejsou ve GROUP BY výrazech, musí používat agregační funkci.

Seřazení a omezení agregovaných výsledků

Použijte ORDER BY a LIMIT společně s GROUP BY k nalezení nejvýše N výsledků.

Pokud například chcete najít prvních pět měst podle počtu obyvatel:

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

Důležité

Místo ORDER BY před LIMIT. LIMIT vždy platí pro již seřazenou sadu výsledků.

Použijte PŘÍPAD pro podmíněné hodnoty v výsledcích

Slouží CASE/WHEN/THEN/ELSE k výpočtu podmíněných hodnot v RETURN nebo LET.

Pokud chcete například zařadit lidi do kategorií na základě jejich roku narození:

MATCH (p:Person)
RETURN p.firstName,
       CASE WHEN p.birthday < 19800101 THEN 'Before 1980'
            WHEN p.birthday < 20000101 THEN '1980–1999'
            ELSE '2000 or later'
       END AS era