Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Porovnávání vzorů grafů umožňuje popsat strukturu dat, která chcete najít pomocí intuitivní vizuální syntaxe. Místo spojování tabulek píšete vzory, které vypadají jako samotné relace – uzly propojené hranami. V tomto článku se dozvíte, jak psát dotazy na vzor GQL pro běžné scénáře v grafu v Microsoft Fabric.
Příklady používají ukázkovou datovou sadu sociální sítě. Úplný odkaz na syntaxi vzorů najdete v tématu Vzory grafů 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ů
MATCHaRETURN. Viz průvodce jazykem GQL.
Porovnávání přímých relací
Základní vzor odpovídá typu uzlu, určitému typu okraje a jinému typu uzlu. Syntaxe vypadá jako diagram relace.
Pokud například chcete najít až 100 lidí spárovaných se společností, ve které pracují:
MATCH (p:Person)-[:workAt]->(c:Company)
RETURN p.firstName, p.lastName, c.name
LIMIT 100
Pokud neznáte nebo vás nezajímá směr, použijte neorientovaný vzor hran. Pokud například chcete najít až 100 vzájemných známých bez ohledu na to, kdo zahájil spojení:
MATCH (a:Person)-[:knows]-(b:Person)
RETURN a.firstName, b.firstName
LIMIT 100
Note
Graph v současné době nepodporuje vytváření nesměrovaných hran, ale pomocí syntaxe můžete zadávat dotazy na hrany v libovolném -[:label]- směru.
Filtrování patternů pomocí vloženého WHERE
Umístěte WHERE do vzoru pro filtrování uzlů a hran, jakmile jsou shodné. Tento přístup je efektivnější než filtrování dodatečně.
Pokud například chcete najít lidi, kteří se narodili před 1990, kteří pracují ve společnosti, jejichž jméno začíná na "A":
MATCH (p:Person WHERE p.birthday < 19900101)-[:workAt]->(c:Company WHERE c.name STARTS WITH 'A')
RETURN p.firstName, p.lastName, c.name
Filtrováním vlastností okrajů omezte, které relace odpovídají. Pokud například chcete vrátit jenom lidi, kteří začali pracovat ve společnosti v roce 2010 nebo novějším:
MATCH (p:Person)-[w:workAt WHERE w.workFrom >= 2010]->(c:Company)
RETURN p.firstName, c.name, w.workFrom
Porovnání relací s více segmenty směrování
Pomocí vzorů s proměnlivou délkou můžete procházet více skoky v jednom výrazu. Zadejte minimální a maximální počet hopů se {min,max} syntaxí.
Pokud například chcete najít až 100 lidí dosažitelných ve vzdálenosti dvou až čtyř stupňů přátelství od Alice:
MATCH (src:Person WHERE src.firstName = 'Alice')-[:knows]->{2,4}(dst:Person)
RETURN dst.firstName, dst.lastName
LIMIT 100
Pokud chcete najít až 100 spojení prvního a druhého stupně (jedno nebo dvě propojení) z Alice:
MATCH (src:Person WHERE src.firstName = 'Alice')-[:knows]->{1,2}(dst:Person)
RETURN DISTINCT dst.firstName, dst.lastName
LIMIT 100
Ovládat procházení pomocí režimů trasy
Ve výchozím nastavení používá GQL TRAIL režim, který brání procházení stejné hrany více než jednou. Režimy cesty používejte explicitně, pokud potřebujete různé záruky.
| Režim cesty | Chování | Použijte, když... |
|---|---|---|
WALK |
Umožňuje opakované uzly a hrany. | Chcete surový průchod bez omezení. Zřídka potřebná; užitečné hlavně pro průzkumné dotazy. |
TRAIL |
Žádné opakované hrany (výchozí) | Chcete se vyhnout opakovanému procházení stejného vztahu, ale stejný uzel se může objevit prostřednictvím různých vztahů. Funguje dobře pro většinu traverzních dotazů. |
SIMPLE |
Žádné opakované uzly s výjimkou počátečního a koncového | Nechcete, aby se uzel zobrazoval více než jednou mezi cestou, ale povolujete cesty, které se vrací na začátek. Užitečné pro detekci smyček. |
ACYCLIC |
Žádné opakované uzly | Musíte zaručit, že se žádný uzel nezobrazí v cestě více než jednou. Používá se pro striktní hierarchie, rodokmen nebo jakékoli procházení, kde by opakované navštívení uzlu vedlo k nesprávným výsledkům. |
WALK je nejvíce omezující režim a ACYCLIC je nejvíce omezující.
TRAIL je výchozí a funguje dobře pro většinu dotazů. Použijte přísnější režim pouze v případě, že ho vyžaduje váš případ použití.
Pokud chcete ukázat rozdíl, zvažte cestu Alice → Boba → Carol → Bob:
- WALK — umožňuje tuto cestu. Uzly a hrany se můžou volně opakovat.
- TRAIL — umožňuje tuto cestu. Bob se zobrazí dvakrát, ale každá použitá hrana je jiná relace (Alice→Bob a Carol→Bob jsou odlišné hrany), takže se neopakuje žádná hrana.
- SIMPLE — blokuje tuto cestu. Bob se zobrazí vícekrát a SIMPLE umožňuje, aby se uzel opakoval jenom v případě, že se jedná o začátek i konec cesty (uzavřený cyklus). Tady je Alice začátek a Bob je konec, takže neplatí žádná výjimka.
- ACYCLIC — blokuje tuto cestu. Bob se kdekoliv v cestě objevuje více než jednou.
Následující příklad ukazuje, jak pomocí TRAIL zjistit, kolik různých cest vede ke každému z prvních 100 lidí dosažitelných v síti Alice ve čtyřech krocích.
MATCH TRAIL (src:Person WHERE src.firstName = 'Alice')-[:knows]->{1,4}(dst:Person)
RETURN dst.firstName, dst.lastName, count(*) AS pathCount
LIMIT 100
Použijte ACYCLIC k vrácení až 100 lidí, kteří jsou dosažitelní z Alice do čtyř kroků, kde je každá osoba v cestě jedinečná.
MATCH ACYCLIC (src:Person WHERE src.firstName = 'Alice')-[:knows]->{1,4}(dst:Person)
RETURN dst.firstName, dst.lastName
LIMIT 100
Tip
U velkých grafů vždy nastavte horní mez vzorů s proměnlivou délkou ({1,4} nikoli {1,}). Neomezené procházení v hustých grafech může narazit na časová omezení dotazu. Viz Aktuální omezení.
Použijte znovupoužití proměnné k vyjádření sdílených entit
Opakované použití stejné proměnné ve dvou částech vzoru vytvoří implicitní omezení rovnosti – oba odkazy musí odpovídat stejnému uzlu. Tato technika umožňuje vyjádřit, jak "najít entity spojené prostřednictvím společného třetího subjektu".
Pokud například chcete najít až 100 dvojic lidí, kteří se navzájem znají a pracují ve stejné společnosti:
MATCH (c:Company)<-[:workAt]-(a:Person)-[:knows]-(b:Person)-[:workAt]->(c)
RETURN a.firstName, b.firstName, c.name
LIMIT 100
Proměnná c se znovu použije pro oba workAt cíle, takže dotaz vrátí jenom páry, ve kterých se oba lidé navzájem znají a pracují ve stejné společnosti.
Chcete-li najít až 100 dvojic lidí, kteří se oběma líbí stejný příspěvek:
MATCH (a:Person)-[:likes]->(post:Post)<-[:likes]-(b:Person)
WHERE a.id < b.id
RETURN a.firstName, b.firstName, post.id
LIMIT 100
Tip
Podmínka WHERE a.id < b.id zabraňuje zobrazení duplicitních párů (Alice + Bob a Bob + Alice) ve výsledcích.
Kombinování více vzorů
Vypište více vzorů v jednom MATCHodděleném čárkami. Všechny vzory musí sdílet aspoň jednu proměnnou, aby se správně spojily.
Pokud například chcete najít až 100 lidí spolu s pracovištěm i městem, ve kterém žijí:
MATCH (p:Person)-[:workAt]->(c:Company),
(p)-[:isLocatedIn]->(city:City)
RETURN p.firstName, c.name AS company, city.name AS city
LIMIT 100
Sdílená proměnná p spojuje dva vzory. Každý řádek výsledků představuje jednu osobu se svou společností a městem.
Shoda volitelných vztahů
Používá se OPTIONAL MATCH , když relace nemusí existovat pro každý uzel. Řádky bez shody se zachovají s NULL hodnotami, podobně jako při použití SQL operace LEFT JOIN.
Můžete například získat až 100 lidí se jménem jejich společnosti, včetně těch bez zaměstnavatele (to znamená, těch, kteří mají ve sloupci společnosti uvedeno NULL):
MATCH (p:Person)
OPTIONAL MATCH (p)-[:workAt]->(c:Company)
RETURN p.firstName, p.lastName, c.name AS company
LIMIT 100
Použijte IS NULL za OPTIONAL MATCH k vyhledání až 100 lidí, kteří nepracují v žádné firmě:
MATCH (p:Person)
OPTIONAL MATCH (p)-[:workAt]->(c:Company)
FILTER c IS NULL
RETURN p.firstName, p.lastName
LIMIT 100