Kirjoita yleisiä GQL-kyselyitä Microsoft Fabric -ohjelmassa

Tämä artikkeli tarjoaa käytännöllisiä GQL-kyselykuvioita yleisiin graafitehtäviin Microsoft Fabric:ssa: naapureiden löytäminen, monihyppyyhteyksien läpikäyminen, jaettujen yhteyksien tunnistaminen, suhteiden laskeminen ja yhteyksien puuttuvien entiteettien löytäminen.

Esimerkit käyttävät sosiaalisen verkoston otosaineistoa. Kyselyvirran ja lauseiden kokonaisvaltaisen selityksen löydät GQL-kielioppaasta. Käytä tätä artikkelia, kun tiedät, minkä graafisen tehtävän haluat suorittaa. Systemaattista ohjetta solmu-, reuna- ja polkukuvioiden rakentamiseen löytyy kohdasta Write graph pattern queries. Yksityiskohtaiset suodatus- ja aggregointityönkulut löytyvät kohdasta Suodata ja aggregoitu graafidata.

Edellytykset

Etsi suorat naapurit

Palauta kaikki solmut, jotka on yhdistetty aloitussolmuun yhdellä hypyllä.

Etsi kaikki, jotka tietty henkilö tuntee:

MATCH (p:Person WHERE p.firstName = 'Alice')-[:knows]->(friend:Person)
RETURN friend.firstName, friend.lastName

Löydä kaikki yritykset, joissa henkilö on työskennellyt:

MATCH (p:Person WHERE p.firstName = 'Alice')-[:workAt]->(c:Company)
RETURN c.name, c.url

Löydä ystävien ystäviä (monihyppäys)

Käytä muuttuvan pituisia kuvioita {min,max} useamman kuin yhden hypyn ylittämiseen.

Etsi ihmisiä, joihin pääsee täsmälleen kahden knows reunan päässä Alicesta:

MATCH (alice:Person WHERE alice.firstName = 'Alice')-[:knows]->{2,2}(fof:Person)
RETURN DISTINCT fof.firstName, fof.lastName
LIMIT 100

Löydä kaikki tavoitettavissa kolmen asteen sisällä:

MATCH (src:Person WHERE src.firstName = 'Alice')-[:knows]->{1,3}(dst:Person)
RETURN DISTINCT dst.firstName, dst.lastName
LIMIT 100

Löydä lyhin reitti Alicesta jokaiselle henkilölle, joka on saavutettavissa neljän hypyn sisällä:

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

Jos useampi lyhyin polku saavuttaa saman henkilön samassa hyppymäärässä, ANY SHORTEST palauttaa yksi niistä ilman determinististä tasapelivaihtoehtoa.

Inline-predikaatit rajoittavat, mitkä polut ovat oikeutettuja .ANY SHORTEST Jälkisuodattimet tulevat voimaan, kun lyhin polku on valittu. Esimerkkeinä katso Paikkapredikaatit ennen tai jälkeen polun valinnan.

Vinkki

Käytä rajallista ylärajaa ennustettavaan kyselykustannuksiin. Rajoittamatonta ALL WALK liikkumista ei tueta. Muut rajoittamattomat polkutilat voivat silti tuottaa suuria tuloksia. Katso Nykyiset rajoitukset.

Laske suhteita yksiköittäin

Käytä GROUP BY With count(*) laskemaan, kuinka monta suhdetta kukin entiteetti on. Yksityiskohtaiset ryhmittelyt, aggregaattisuodatukset ja ehdolliset reitityskuviot löytyvät kohdasta Suodatin ja aggregoitu graafidata.

Laske, kuinka monta ystävää kullakin henkilöllä on, järjestettynä useimmasta vähimpään:

MATCH (p:Person)-[:knows]->(friend:Person)
LET personId = p.id, name = p.firstName || ' ' || p.lastName
RETURN personId, name, count(*) AS friendCount
GROUP BY personId, name
ORDER BY friendCount DESC
LIMIT 20

Laske arvo kullekin entiteille

Käytä korreloitua CALL alikyselyä laskeaksesi arvon jokaiselle syöteriville. Ulomman kyselyn muuttujat ovat implisiittisesti saatavilla alikyselyn sisällä.

Laske ystävien määrä kullekin henkilölle:

MATCH (p:Person)
CALL {
  MATCH (p)-[:knows]->(friend:Person)
  RETURN count(*) AS friendCount
}
RETURN p.firstName, p.lastName, friendCount
ORDER BY friendCount DESC

Ulommat muuttujat pysyvät käytettävissä myöhemmin CALL. Alikyselyn sisällä luoduista muuttujista vain palautetut sarakkeet tulevat saataville sen ulkopuolella. Ryhmättämätön count(*) palautus, 0 kun yhteensopivia ystäviä ei ole, joten tämä kysely säilyttää ihmiset, joilla ei ole ystäviä.

Tavallinen CALL pudottaa ulkorivin, kun alikysely ei palauta rivejä, ja tuottaa yhden ulostulorivin jokaiselle alikyselyriville, kun se palauttaa useita rivejä. Käytä OPTIONAL CALL sitä, kun sinun täytyy säilyttää ulkoinen rivi, jolla ei ole vastaavaa alikyselyriviä.

Löydä yhteisiä yhteyksiä

Muuttujan uudelleenkäyttö kahdessa kuvion osassa luo implisiittisen "sama solmu" -rajoitteen. Käytä tätä rajoitetta löytääksesi entiteettejä, jotka ovat yhteydessä yhteisen kolmannen entiteettiin.

Etsi pareja, jotka molemmat tuntevat saman henkilön:

MATCH (a:Person)-[:knows]->(mutual:Person)<-[:knows]-(b:Person)
WHERE a.id < b.id
RETURN a.firstName, b.firstName, mutual.firstName AS sharedContact
LIMIT 100

Etsi parit, jotka työskentelevät samassa yrityksessä:

MATCH (c:Company)<-[:workAt]-(a:Person), (c)<-[:workAt]-(b:Person)
WHERE a.id < b.id
RETURN a.firstName, b.firstName, c.name AS company
LIMIT 100

Vinkki

Ehto WHERE a.id < b.id estää dpluusioparien (Alice–Bob ja Bob–Alice) esiintymisen tuloksissa.

Etsi olentoja ilman suhteita

Käytetään NOT EXISTS etsimään solmuja, joille korreloitu alikysely ei anna rivejä.

Etsi ihmisiä, jotka eivät työskentele missään yrityksessä:

MATCH (p:Person)
WHERE NOT EXISTS {
  MATCH (p)-[:workAt]->(c:Company)
  RETURN c
}
RETURN p.firstName, p.lastName
LIMIT 100

Löydä postauksia ilman kommentteja:

MATCH (post:Post)
WHERE NOT EXISTS {
  MATCH (comment:Comment)-[:replyOf]->(post)
  RETURN comment
}
RETURN post.id, post.content
LIMIT 100

Etsi entiteettejä, joilla on paljon yhteyksiä

Yhdistä GROUP BY ja FILTER tunnistaa vahvasti yhteydessä olevat solmut. Tämä menetelmä on hyödyllinen hubien tai poikkeamien löytämisessä.

Etsi ihmisiä, joilla on yli 10 ystävää:

MATCH (p:Person)-[:knows]->(friend:Person)
LET personId = p.id, name = p.firstName || ' ' || p.lastName
RETURN personId, name, count(*) AS friendCount
GROUP BY personId, name
FILTER friendCount > 10
ORDER BY friendCount DESC

Note

FILTER After GROUP BY toimii kuten HAVING SQL:ssä. Se suodattaa koottujen tulosten perusteella, ei yksittäisten rivien perusteella.