Filtrovať a agregovať grafové dáta v Microsoft Fabric

Filtrovanie zúži výsledky na riadky, ktoré sú dôležité. Agregácia tieto riadky zhrňuje do počtov, súčtov a priemerov. Tento článok vám ukáže, ako aplikovať obe techniky v GQL dotazoch proti grafu v Microsoft Fabric.

Príklady používajú vzorkovú dátovú sadu sociálnych sietí. Pre úplný prehľad o GQL príkazoch a výrazoch pozri GQL jazykový sprievodca.

Požiadavky

  • Grafová položka s načítanými dátami. Ak ste v Graphe nováčik, najskôr dokončite tutoriál .
  • Znalosť základov MATCH a RETURN otázok. Pozri jazykový sprievodca GQL.

Riadky filtra s FILTER

Používajte FILTER len riadky, ktoré spĺňajú podmienku. Umiestnite za ním FILTERMATCH , aby ste zúžili zhodné výsledky.

Nasledujúci dotaz vracia všetky ženy s ich menom a dátumom narodenia:

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

Skombinujte viacero podmienok s AND a .OR Napríklad nasledujúci dotaz vráti mená všetkých žien narodených pred rokom 1990:

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

Tip

Pre lepší výkon filtrujte počas pattern matching pomocou inline WHERE klauzuly namiesto samostatného príkazu FILTER . Pozri Filter počas porovnávania vzorov.

Filter počas rozpoznávania vzorov

Inline WHERE klauzuly vo vnútri vzoru MATCH obmedzujú, ktoré uzly a hrany sa zhodujú pred vytvorením akýchkoľvek výsledkov. Tento prístup je efektívnejší ako klauzula po zhode FILTER , pretože dotazovací engine orezuje riadky skôr.

Napríklad, aby ste našli ľudí narodených pred rokom 1994 spolu so spoločnosťou, v ktorej pracujú, a obmedziť výsledky na spoločnosti, ktorých názov začína 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 hrán filtrujte rovnakým spôsobom. Napríklad, aby sme vracali len ľudí, ktorí začali pracovať v spoločnosti v roku 2000 alebo neskôr:

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

Viac o rozdieloch vo výkone medzi inline a post-match filtrovaním nájdete v článku Optimalizovať výkon dotazov GQL.

Spracovanie nulových hodnôt vo filtroch

GQL používa trojhodnotovú logiku: predikáty vyhodnocujú do TRUE, FALSE, alebo UNKNOWN. Keď je hodnota vlastnosti nulová, porovnania vrátia .UNKNOWN FILTER považuje sa UNKNOWN za nezhodujúce, takže riadok je vylúčený.

Použite IS NULL a IS NOT NULL na testovanie nulových hodnôt explicitne:

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

Použite coalesce() na dosadenie predvolenej hodnoty, keď môže byť vlastnosť nulová:

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

Výstraha

NULL = NULL vyhodnocuje na UNKNOWN, nie TRUE. Vždy používajte IS NULL na testovanie nulových hodnôt, nie rovnosti.

Agregované výsledky s RETURN

Použite agregované funkcie na RETURN zhrnutie vašich výsledkov. GQL podporuje count(), sum(), avg(), min(), a .max()

Napríklad, ak počítame všetkých ľudí v grafe:

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

Na počítanie rôznych hodnôt, napríklad koľko rôznych spoločností zamestnáva ľudí:

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

Výsledky skupín s GROUP BY

Použite GROUP BY v RETURN na zoskupenie riadkov podľa zdieľaných hodnôt a výpočet agregátov v rámci každej skupiny. Táto skupina je ekvivalentom SQL GROUP BYv GQL.

Napríklad, ak počítame zamestnancov na spoločnosť:

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

Zoskupte podľa viacerých stĺpcov a vypočítajte viacero agregátov naraz. Napríklad rozložte počet osôb a rozsah narodenia podľa pohlavia a prehliadača, vráťte 10 najbežnejších kombinácií:

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šetky neagregované výrazy v musia RETURN byť v GROUP BY. Výrazy, ktoré nie sú v , GROUP BY musia používať agregovanú funkciu.

Triedenie a obmedzovanie agregovaných výsledkov

Používajte ORDER BY a LIMIT spolu s GROUP BY hľadaním najlepších výsledkov.

Napríklad na nájdenie piatich najlepších miest podľa počtu obyvateľov:

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é

Miesto ORDER BY pred LIMIT. LIMIT vždy platí pre už zoradený súbor výsledkov.

Použite CASE pre podmienené hodnoty vo výsledkoch

Použitie CASE/WHEN/THEN/ELSEna výpočet podmienených hodnôt v RETURN alebo .LET

Napríklad, na kategorizáciu ľudí do období podľa roku narodenia:

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