Suodata ja aggregoitu graafidataa Microsoft Fabric -ohjelmassa

Suodatus rajaa tulokset tärkeisiin riveihin. Aggregaatio tiivistää nämä rivit lukumääriin, kokonaislukuihin ja keskiarvoihin. Tässä artikkelissa näytetään, miten molempia tekniikoita sovelletaan GQL-kyselyissä Microsoft Fabric -graafia vastaan.

Esimerkit käyttävät sosiaalisen verkoston otosaineistoa. Kyselyvirran ja lauseiden kokonaisvaltaisen selityksen löydät GQL-kielioppaasta.

Käytä tätä artikkelia rivi- ja kuviosuodatukseen, ryhmiteltyyn ja ryhmittelemättömään aggregointiin, aggregaattikohtaisiin suodattimiin sekä ehdolliseen reititykseen. Multihop-kuvioiden rakentamista ja polkujen valintaa varten katso Write graph pattern queries. Valmiita mukautettavia liiketoimintatehtäviä varten katso Kirjoita yleiset GQL-kyselyt.

Edellytykset

Suodatinrivit SUODATTIMELLA

Käytä FILTER vain niitä rivejä, jotka täyttävät tietyn ehdon. Aseta FILTER peräkkäin MATCH , jotta voit rajata sovitettuja tuloksia.

Seuraava kysely palauttaa kaikki naiset nimellä ja syntymäpäivällä:

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

Yhdistä useita ehtoja ja ANDOR. Esimerkiksi seuraava kysely palauttaa kaikkien ennen vuotta 1990 syntyneiden naisten nimet:

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

Vinkki

Käytä inline-lauseketta WHERE , kun ehto määrittelee, mikä solmu tai reuna voi osallistua otteluun. Käytä, FILTER kun ehto koskee aiemman lauseen tuottamaa riviä. Predikaatin sijoittelu voi muuttaa lyhimmän polun tuloksia; katso Sijoituspredikaatit ennen tai jälkeen polun valinnan.

Suodatin kuvion sovittamisen aikana

Inline-lausekkeet WHERE kuvion MATCH sisällä rajoittavat, mitkä solmut ja reunat täyttävät ottelun. Kyselyoptimaattori voi soveltaa vastaavia predikaatteja skannauksen aikana, joten inline-syntaksi ei ole itsessään nopeampi kuin erillinen FILTER. Valitse muoto, joka ilmaisee tarkoitetun semantiikkaa.

Esimerkiksi, kun etsitään ennen vuotta 1994 syntyneet henkilöt yhdessä heidän työpaikkansa yrityksen kanssa, ja tulokset rajoitetaan yrityksiin, joiden nimi alkaa 'A':lla:

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

Suodattimen reunan ominaisuudet ovat samalla tavalla. Esimerkiksi, palautetaan vain henkilöt, jotka aloittivat työskentelyn yrityksessä vuonna 2000 tai myöhemmin:

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

Lisätietoja inline- ja post-match-suodatuksen valitsemisesta löytyy kohdasta Optimize GQL query performance.

Käsittele nollaarvoja suodattimissa

GQL käyttää kolmiarvoista logiikkaa: predikaatit arvioivat , TRUEFALSE, tai UNKNOWN. Kun ominaisuuden arvo on nolla, vertailut palauttavat UNKNOWN. FILTER käsitellään UNKNOWN ei täsmäävänä, joten rivi jätetään pois.

Käytä IS NULL ja IS NOT NULL nollaarvojen testaamiseen eksplisiittisesti:

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

Käytä coalesce() oletusarvon korvaamiseen, kun ominaisuus voi olla nolla:

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

Varoitus

NULL = NULL arvioi UNKNOWN, ei TRUE. Käytä IS NULL aina nollaarvojen testaamiseen, ei yhtällisyyttä.

Yhteenlasketut tulokset RETURNin kanssa

Käytä aggregaatiofunktioita RETURN yhteenvetoon tulosten tiivistämiseen. Graafi tukee seuraavia aggregaattifunktioita: COUNT, SUM, AVG, MAXCOLLECT_ONEMINCOLLECT_LISTja .COLLECT_ELEMENTS

Esimerkiksi, kun lasketaan kaikki kuvaajan henkilöt:

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

Jotta voidaan laskea erilliset arvot, kuten kuinka moni eri yritys työllistää ihmisiä:

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

Suodattimen syöte yhdelle aggregaatille

Lisää FILTER (WHERE predicate) aggregaatin perään suodattamaan vain kyseisen aggregaatin syötteen. Muut aggregaatit samassa RETURN järjestelmässä vastaanottavat silti kaikki syöterivit.

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

Lisää LIMIT yhteenlaskettu suodatin sisäpuolelle, jotta käyttö on korkeintaan yhtä monta kelpoisuusriveä. Kysely soveltaa predikaattia ennen aggregaattikohtaista rajaa.

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

Aggregaattikohtainen FILTER ja LIMIT älä poista rivejä muusta kyselystä. Käytä FILTER lauseketta tai match-tason WHERE lauseketta, kun haluat suodattaa rivivirtaa.

Kerää arvot

Käytetään COLLECT_LIST palauttamaan yksi listaelementti jokaiselle syötearvolle, mukaan lukien nollaarvot. Lisää DISTINCT , jotta kaksoiskappaleet poistuvat.

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

COLLECT_ONE palauttaa yhden ei-nollasyötteen arvon. Valittu arvo ei ole deterministinen, joten sitä käytetään vain, kun mikä tahansa ryhmän arvo on hyväksyttävä.

COLLECT_ELEMENTS hyväksyy listaarvoiset syötteet ja yhdistää niiden elementit yhdeksi listaksi:

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

Ilman sarakkeiden ryhmittelyä aggregoitu kysely ilman syöterivejä palauttaa tyhjän listan joukosta COLLECT_LIST ja COLLECT_ELEMENTS ja nullista .COLLECT_ONE

Ryhmän tulokset GROUP BY -menetelmällä

Käytä GROUP BY rivejä RETURN jaettujen arvojen mukaan ryhmittelemiseen ja kunkin ryhmän aggregaattien laskemiseen. Tämä ryhmittely on GQL:n vastine SQL GROUP BY:lle.

Esimerkiksi työntekijöiden laskeminen yrityskohtaisesti:

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

Ryhmittele useiksi sarakkeiksi ja lasketaan useita aggregaatteja samanaikaisesti. Esimerkiksi jaa henkilömäärä ja syntymäpäiväväli sukupuolen ja selaimen mukaan, palauttaen 10 yleisintä yhdistelmää:

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

Kaikkien ei-aggregaattisten lausekkeiden joukossa RETURN on oltava .GROUP BY Lausekkeet, jotka eivät ole sisällä GROUP BY , täytyy käyttää aggregaatiofunktiota.

Lajittele ja rajoita koottuja tuloksia

Käytä ORDER BY ja LIMIT yhdessä GROUP BY löytääksesi top-N-tulokset.

Esimerkiksi, jotta löydät viisi parasta kaupunkia asukkaiden määrän perusteella:

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

Tärkeää

Paikka ORDER BY ennen LIMIT. LIMIT pätee aina jo järjestettyyn tulosjoukkoon.

Reittirivit ehdollisilla lauseilla

Käytä ehdollista lausetta reitittämään jokainen saapuva rivi ensimmäiseen vastaavaan haaraan. Syöte voi tulla mistä tahansa edeltävästä kyselyvaiheesta, ei pelkästään aggregaatiosta. Esimerkiksi seuraava kysely luokittelee yritykset niiden työntekijämäärän laskemisen jälkeen:

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

Haarat voivat suorittaa täydellisiä kyselylauseita ja sisäkkäisiä proseduureja, eivätkä vain palauteta lausekkeita. Seuraava esimerkki lähettää kolme syöttöriviä eri haaramuotojen läpi. Yksi haara suorittaa , MATCHtoinen yhdistää kaksi aggregaattia ja UNION ALL sitten kerää niiden tulokset, ja varahaara palauttaa vakion:

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

Kyselymoottori arvioi predikaatit järjestyksessä jokaiselle riville. Se pyörittää vain ensimmäistä vastaavaa haaraa. Jos predikaatti arvioi , UNKNOWNarviointi jatkuu seuraavalla haaralla. Ilman , ELSErivit, jotka eivät vastaa haaraa WHEN , jätetään pois.

Ehdolliset väitteet eroavat lausekkeista CASE . Graafi tukee yksinkertaisia CASE <expression> WHEN <value> lausekkeita tasa-arvon valintaan. Haetut CASE WHEN <predicate> ilmaisut eivät ole tuettuja. Lisätietoja löytyy kohdasta Ehdolliset lauseet.