Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Note
Den här funktionen är för närvarande i offentlig förhandsversion. Den här förhandsversionen tillhandahålls utan ett serviceavtal och rekommenderas inte för produktionsarbetsbelastningar. Vissa funktioner kanske inte stöds eller kan vara begränsade. Mer information finns i Kompletterande villkor för användning av Microsoft Azure-förhandsversioner.
Med matchning av grafmönster kan du beskriva strukturen för de data som du vill hitta med hjälp av intuitiv, visuell syntax. I stället för att koppla tabeller skriver du mönster som ser ut som själva relationerna – noder som är anslutna via kanter. Den här artikeln visar hur du skriver GQL-mönsterfrågor för vanliga scenarier i grafen i Microsoft Fabric.
I exemplen används exempeldatauppsättningen för sociala nätverk. En fullständig mönstersyntaxreferens finns i GQL-grafmönster.
Förutsättningar
- Ett diagramobjekt med data inlästa. Om du är ny inom grafteknologi, slutför först självstudien.
- Kunskaper om grundläggande
MATCH- ochRETURN-sökfrågor. Se språkguiden för GQL.
Matcha direkta relationer
Ett grundläggande mönster matchar en nodtyp, en specifik kanttyp och en annan nodtyp. Syntaxen ser ut som ett diagram över relationen.
Om du till exempel vill hitta upp till 100 personer kopplade till företaget de arbetar på:
MATCH (p:Person)-[:workAt]->(c:Company)
RETURN p.firstName, p.lastName, c.name
LIMIT 100
Använd ett oriktat kantmönster när du inte vet eller inte bryr dig om riktning. Om du till exempel vill hitta upp till 100 gemensamma bekanta oavsett vem som initierade anslutningen:
MATCH (a:Person)-[:knows]-(b:Person)
RETURN a.firstName, b.firstName
LIMIT 100
Note
Grafen stöder för närvarande inte att skapa oriktade kanter, men du kan fråga efter kanter i valfri riktning genom att använda syntaxen -[:label]-.
Filtrera mönster med inlinje WHERE
Placera WHERE inuti mönstret för att filtrera noder och kanter när de matchas. Den här metoden är effektivare än att filtrera i efterhand.
Till exempel för att hitta personer födda före 1990 som arbetar på ett företag vars namn börjar med "A":
MATCH (p:Person WHERE p.birthday < 19900101)-[:workAt]->(c:Company WHERE c.name STARTS WITH 'A')
RETURN p.firstName, p.lastName, c.name
Filtrera på gränsegenskaper för att begränsa vilka relationer som matchar. Om du till exempel bara vill returnera personer som började arbeta på ett företag 2010 eller senare:
MATCH (p:Person)-[w:workAt WHERE w.workFrom >= 2010]->(c:Company)
RETURN p.firstName, c.name, w.workFrom
Matcha relationer med flera hopp
Använd mönster med variabel längd för att navigera flera hopp i ett uttryck. Ange det lägsta och högsta antalet hopp med {min,max} syntax.
Till exempel för att hitta upp till 100 personer som kan nås inom två till fyra grader av vänskap från Alice:
MATCH (src:Person WHERE src.firstName = 'Alice')-[:knows]->{2,4}(dst:Person)
RETURN dst.firstName, dst.lastName
LIMIT 100
För att hitta upp till 100 omedelbara och andra gradens anslutningar (ett eller två hopp) från Alice:
MATCH (src:Person WHERE src.firstName = 'Alice')-[:knows]->{1,2}(dst:Person)
RETURN DISTINCT dst.firstName, dst.lastName
LIMIT 100
Kontrollera bläddering med sökvägslägen
GQL använder som standard TRAIL-läge, vilket förhindrar att samma kant traverseras mer än en gång. Använd sökvägslägen explicit när du behöver olika garantier.
| Sökvägsläge | Behavior | Använd när... |
|---|---|---|
WALK |
Tillåter upprepade noder och kanter | Du vill ha rå bläddering utan begränsningar. Sällan behövs; främst användbart för undersökande frågor. |
TRAIL |
Inga upprepade kanter (standard) | Du vill undvika att återskapa samma relation, men samma nod kan visas via olika relationer. Fungerar bra för de flesta traverseringsfrågor. |
SIMPLE |
Inga upprepade noder förutom start och slut | Du vill att ingen nod ska visas mer än en gång mitt i en sökväg, men tillåt sökvägar som närmar sig början igen. Användbart för att identifiera loopar. |
ACYCLIC |
Inga upprepade noder alls | Du måste garantera att ingen nod visas någonstans i sökvägen mer än en gång. Använd för strikta hierarkier, släktskap eller någon traversering där ett återbesök av en nod skulle ge felaktiga resultat. |
WALK är det mest tillåtande läget och ACYCLIC är det mest restriktiva.
TRAIL är standard och fungerar bra för de flesta frågor. Använd endast ett mer restriktivt läge när ditt användningsfall kräver det.
Tänk på vägen Alice → Bob → Carol → Bob för att illustrera skillnaden.
- WALK – ger tillgång till den här sökvägen. Noder och kanter kan upprepas fritt.
- TRAIL – tillåter den här sökvägen. Bob visas två gånger, men varje kant som används är en annan relation (Alice→Bob och Carol→Bob är distinkta kanter), så ingen kant upprepas.
- SIMPLE – blockerar den här sökvägen. Bob visas mer än en gång och SIMPLE tillåter bara att en nod upprepas om det är både början och slutet av sökvägen (en stängd cykel). Här är Alice början och Bob är slutet, så inget undantag gäller.
- ACYCLIC – blockerar den här sökvägen. Bob visas mer än en gång någonstans i sökvägen.
I följande exempel visas hur du använder TRAIL för att räkna hur många distinkta sökvägar som leder till var och en av de första 100 personer som kan nås i Alices nätverk inom fyra hopp:
MATCH TRAIL (src:Person WHERE src.firstName = 'Alice')-[:knows]->{1,4}(dst:Person)
RETURN dst.firstName, dst.lastName, count(*) AS pathCount
LIMIT 100
Använd ACYCLIC för att returnera upp till 100 personer som kan nås från Alice inom fyra hopp, där varje person i sökvägen är unik:
MATCH ACYCLIC (src:Person WHERE src.firstName = 'Alice')-[:knows]->{1,4}(dst:Person)
RETURN dst.firstName, dst.lastName
LIMIT 100
Tips/Råd
För stora grafer anger du alltid en övre gräns för mönster med variabel längd ({1,4} i stället {1,}för ). Obegränsad förflyttning över täta grafer kan nå tidsbegränsningar för fråge. Se Aktuella begränsningar.
Använd återanvändning av variabler för att representera delade entiteter
Om du återanvänder samma variabel i två delar av ett mönster skapas en implicit likhetsbegränsning – båda referenserna måste matcha samma nod. Med den här tekniken kan du uttrycka "hitta entiteter som är anslutna via en delad tredje entitet".
Om du till exempel vill hitta upp till 100 par personer som känner varandra och arbetar på samma företag:
MATCH (c:Company)<-[:workAt]-(a:Person)-[:knows]-(b:Person)-[:workAt]->(c)
RETURN a.firstName, b.firstName, c.name
LIMIT 100
Variabeln c återanvänds för båda workAt målen, så frågan returnerar bara par där båda känner varandra och arbetar på samma företag.
För att hitta upp till 100 par personer som båda gillade samma inlägg:
MATCH (a:Person)-[:likes]->(post:Post)<-[:likes]-(b:Person)
WHERE a.id < b.id
RETURN a.firstName, b.firstName, post.id
LIMIT 100
Tips/Råd
Villkoret WHERE a.id < b.id förhindrar att duplicerade par (Alice + Bob och Bob + Alice) visas i resultatet.
Kombinera flera mönster
Lista flera mönster i en enda MATCH, avgränsad med kommatecken. Alla mönster måste dela minst en variabel så att de ansluts korrekt.
För att till exempel hitta upp till 100 personer tillsammans med både deras arbetsplats och den stad de bor i:
MATCH (p:Person)-[:workAt]->(c:Company),
(p)-[:isLocatedIn]->(city:City)
RETURN p.firstName, c.name AS company, city.name AS city
LIMIT 100
Den delade variabeln p ansluter de två mönstren. Varje resultatrad representerar en person med sitt företag och sin stad.
Matcha valfria relationer
Använd OPTIONAL MATCH när en relation kanske inte finns för varje nod. Rader utan matchning behålls med NULL värden som liknar en SQL LEFT JOIN.
Visa till exempel upp till 100 personer med deras företagsnamn, inklusive personer utan arbetsgivare (det vill säga som har NULL för företagskolumnen):
MATCH (p:Person)
OPTIONAL MATCH (p)-[:workAt]->(c:Company)
RETURN p.firstName, p.lastName, c.name AS company
LIMIT 100
Använd IS NULL efter OPTIONAL MATCH för att hitta upp till 100 personer som inte arbetar på något företag:
MATCH (p:Person)
OPTIONAL MATCH (p)-[:workAt]->(c:Company)
FILTER c IS NULL
RETURN p.firstName, p.lastName
LIMIT 100