Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
La mise en correspondance des modèles de graphique vous permet de décrire la structure des données que vous souhaitez trouver à l’aide d’une syntaxe visuelle intuitive. Au lieu de joindre des tables, vous écrivez des modèles qui ressemblent aux relations elles-mêmes : les nœuds connectés par des arêtes. Cet article explique comment écrire des requêtes de modèle GQL pour des scénarios courants dans le graphique dans Microsoft Fabric.
Les exemples utilisent l’exemple de jeu de données de réseau social. Pour obtenir une référence complète de syntaxe de modèle, consultez les modèles de graphique GQL.
Utilisez cet article pour apprendre à construire et combiner des motifs de nœuds, d’arêtes et de chemins. Pour des tâches prêtes à s’adapter telles que la recherche de voisins ou d’entités sans relations, voir Écrire des requêtes GQL communes. Pour les flux de travail de filtrage, de regroupement et d’agrégation, voir Filtrer et agréger les données des graphes.
Prerequisites
- Un élément de graphe construit à partir de l’échantillon de jeu de données des réseaux sociaux, avec les types de nœuds, types d’arêtes et propriétés décrits dans l’exemple du schéma du réseau social.
- Familiarité avec les requêtes de base
MATCHetRETURN. Consultez le guide de langue GQL.
Mettre en correspondance les relations directes
Un modèle de base correspond à un type de nœud, à un type de périphérie spécifique et à un autre type de nœud. La syntaxe ressemble à un diagramme de la relation.
Par exemple, pour trouver jusqu’à 100 personnes associées à l’entreprise à laquelle ils travaillent :
MATCH (p:Person)-[:workAt]->(c:Company)
RETURN p.firstName, p.lastName, c.name
LIMIT 100
Utilisez un modèle d'arête non orienté quand vous ne connaissez pas ou ne vous souciez pas de la direction. Par exemple, pour trouver jusqu’à 100 connaissances mutuelles, quel que soit l’origine de la connexion :
MATCH (a:Person)-[:knows]-(b:Person)
RETURN a.firstName, b.firstName
LIMIT 100
Note
Actuellement, le graphe ne prend pas en charge la création de bords non dirigés, mais vous pouvez interroger des arêtes dans n’importe quelle direction à l’aide -[:label]- de la syntaxe.
Modèles de filtrage avec WHERE en ligne
Placez WHERE à l’intérieur du motif lorsqu’une condition définit quel nœud ou arête peut participer à la correspondance. Utilisez une condition au niveau MATCH ... WHERE de l’instruction pour postfiltrer la correspondance complétée, ou une condition séparée FILTER lorsque la condition s’applique à la ligne produite par une instruction antérieure. Le placement des prédicats peut modifier les résultats du chemin le plus court. Pour plus d’informations, consultez Placez les prédicats avant ou après la sélection de chemin.
Par exemple, pour trouver des personnes nées avant 1990 qui travaillent dans une entreprise dont le nom commence par « A » :
MATCH (p:Person WHERE p.birthday < 19900101)-[:workAt]->(c:Company WHERE c.name STARTS WITH 'A')
RETURN p.firstName, p.lastName, c.name
Filtrez sur les propriétés de périphérie pour limiter les relations qui correspondent. Par exemple, pour ne retourner que les personnes qui ont commencé à travailler pour une entreprise en 2010 ou plus tard :
MATCH (p:Person)-[w:workAt WHERE w.workFrom >= 2010]->(c:Company)
RETURN p.firstName, c.name, w.workFrom
Mettre en correspondance les relations multi-tronçons
Utilisez des modèles de longueur variable pour parcourir plusieurs tronçons dans une seule expression. Spécifiez le nombre minimal et maximal de tronçons syntaxiquement avec {min,max}.
Par exemple, pour trouver jusqu’à 100 personnes accessibles dans les deux à quatre degrés d’amitié d’Alice :
MATCH (src:Person WHERE src.firstName = 'Alice')-[:knows]->{2,4}(dst:Person)
RETURN dst.firstName, dst.lastName
LIMIT 100
Pour trouver jusqu’à 100 connexions immédiates et de second degré (un ou deux sauts) à partir d’Alice :
MATCH (src:Person WHERE src.firstName = 'Alice')-[:knows]->{1,2}(dst:Person)
RETURN DISTINCT dst.firstName, dst.lastName
LIMIT 100
Contrôler la traversée avec les modes de chemin
Par défaut, GQL utilise WALK, ce qui permet la répétition des nœuds et des arêtes. Utilisez un autre mode chemin lorsque vous avez besoin d’une unicité d’élément plus stricte.
| Mode chemin | Comportement | À utiliser quand... |
|---|---|---|
WALK |
Permet la répétition des nœuds et des arêtes (par défaut) | Vous voulez que tous les chemins correspondants restent dans une limite finie. |
TRAIL |
Pas d’arêtes répétées | Vous voulez éviter de parcourir de nouveau la même arête, mais le même nœud peut apparaître via des arêtes différentes. |
SIMPLE |
Pas de nœuds répétés sauf un nœud de départ et d’un nœud de fin partagés, et pas d’arêtes répétées | Vous souhaitez qu'aucun nœud n'apparaisse plus d'une fois dans un chemin, mais autorisez les chemins qui reviennent au point de départ. Utile pour détecter les boucles. |
ACYCLIC |
Aucun nœud ou arête répétée | Vous devez garantir qu’aucun nœud n’apparaît n’importe où dans le chemin plusieurs fois. Utiliser pour les hiérarchies strictes, la traçabilité ou toute traversée où la révision d’un nœud produirait des résultats incorrects. |
WALK est le mode le plus permissif et ACYCLIC est le plus restrictif.
Pour SIMPLE et ACYCLIC, l’unicité des arêtes découle de l’unicité des nœuds. Un SIMPLE chemin peut se refermer en revenant à son premier nœud, mais il ne peut toujours pas réutiliser une arête.
Pour illustrer la différence, considérez le chemin d’Alice → Bob → Carol → Bob :
- WALK : autorise ce chemin d’accès. Les nœuds et les arêtes peuvent se répéter librement.
- TRAIL : autorise ce chemin d’accès. Bob apparaît deux fois, mais chaque bord utilisé est une relation différente (Alice→Bob et Carol→Bob sont des bords distincts), donc aucun bord n’est répété.
- SIMPLE : bloque ce chemin d’accès. Bob apparaît plusieurs fois, et SIMPLE permet uniquement à un nœud de se répéter s’il s’agit à la fois du début et de la fin du chemin (un cycle fermé). Ici, Alice est le début et Bob est la fin, donc aucune exception ne s’applique.
- ACYCLIQUE : bloque ce chemin d’accès. Bob apparaît plus d’une fois n’importe où dans le chemin.
L’exemple suivant montre comment utiliser TRAIL pour compter combien de chemins distincts mènent à chacune des 100 premières personnes accessibles dans le réseau d’Alice en quatre sauts.
MATCH TRAIL (src:Person WHERE src.firstName = 'Alice')-[:knows]->{1,4}(dst:Person)
LET personId = dst.id
RETURN personId, dst.firstName, dst.lastName, count(*) AS pathCount
GROUP BY personId, dst.firstName, dst.lastName
ORDER BY pathCount DESC
LIMIT 100
Utilisez ACYCLIC pour retourner jusqu’à 100 personnes atteignables à partir d’Alice en quatre sauts, où chaque personne dans le chemin est unique :
MATCH ACYCLIC (src:Person WHERE src.firstName = 'Alice')-[:knows]->{1,4}(dst:Person)
RETURN dst.firstName, dst.lastName
LIMIT 100
Le mode de correspondance par défaut REPEATABLE ELEMENTS permet de réutiliser une arête par des chemins séparés dans le même motif graphique. Utilisez DIFFERENT EDGES ou DIFFERENT RELATIONSHIPS lorsque chaque liaison d’arête sur tous les chemins doit être différente :
MATCH DIFFERENT EDGES
(p:Person)-[:knows]->(friend:Person),
(p)-[:knows]->(other:Person)
RETURN p.firstName, friend.firstName, other.firstName
LIMIT 100
Retour sur un chemin le plus court
ALL est la recherche de chemin par défaut et retourne chaque chemin correspondant. Utilisez ANY SHORTEST pour retourner un chemin le plus court pour chaque paire source-destination. La requête suivante trouve un chemin le plus court d’Alice à Bob :
MATCH p = ANY SHORTEST
(src:Person WHERE src.firstName = 'Alice')-[:knows]->{1,4}
(dst:Person WHERE dst.firstName = 'Bob')
RETURN p, path_length(p) AS hopCount
Lorsque plusieurs chemins les plus courts sont à égalité, le choix du chemin renvoyé n’est pas déterministe.
ALL SHORTEST Et ANY les recherches de chemin ne sont pas prises en charge.
Le placement des prédicats peut modifier le résultat de ANY SHORTEST. Les prédicats intégrés de nœuds et d’arêtes limitent les chemins admissibles, tandis qu’un post-filtre peut supprimer le chemin sélectionné sans pour autant sélectionner à la place un chemin plus long. Voir Placer les prédicats avant ou après la sélection du chemin.
Conseil / Astuce
Préfère une borne supérieure finie pour le coût prévisible de la requête. Les modèles non bornés ALL WALK ne sont pas pris en charge. Les motifs non bornés avec TRAIL, SIMPLE ou ACYCLIC prennent fin grâce à l’unicité des éléments, mais peuvent toujours renvoyer de nombreux chemins. Unbounded ANY SHORTEST WALK ne prend en charge que des formes de requête spécifiques. Consultez les limitations actuelles.
Utiliser la réutilisation des variables pour exprimer des entités partagées
La réutilisation de la même variable dans deux parties d’un modèle crée une contrainte d’égalité implicite : les deux références doivent correspondre au même nœud. Cette technique vous permet d’exprimer « rechercher des entités connectées via une troisième entité partagée ».
Par exemple, pour trouver jusqu’à 100 paires de personnes qui se connaissent et travaillent dans la même entreprise :
MATCH (c:Company)<-[:workAt]-(a:Person)-[:knows]-(b:Person)-[:workAt]->(c)
RETURN a.firstName, b.firstName, c.name
LIMIT 100
La variable c est réutilisée pour les deux workAt cibles, de sorte que la requête retourne uniquement des paires où les deux personnes se connaissent et travaillent au même niveau d’entreprise.
Pour trouver jusqu’à 100 paires de personnes qui ont tous les deux aimé le même billet :
MATCH (a:Person)-[:likes]->(post:Post)<-[:likes]-(b:Person)
WHERE a.id < b.id
RETURN a.firstName, b.firstName, post.id
LIMIT 100
Conseil / Astuce
La WHERE a.id < b.id condition empêche les paires en double (Alice + Bob et Bob + Alice) d’apparaître dans les résultats.
Combiner plusieurs modèles
Répertoriez plusieurs modèles dans un seul MATCHmodèle séparé par des virgules. Réutilisez une variable lorsque les motifs doivent lier le même élément du graphe.
Par exemple, pour trouver jusqu’à 100 personnes avec leur lieu de travail et la ville dans laquelle ils vivent :
MATCH (p:Person)-[:workAt]->(c:Company),
(p)-[:isLocatedIn]->(city:City)
RETURN p.firstName, c.name AS company, city.name AS city
LIMIT 100
La variable p partagée connecte les deux modèles. Chaque ligne de résultat représente une personne avec sa société et sa ville.
Les motifs déconnectés sont également valides, mais ils forment un produit cartésien de leurs correspondances. Utilisez-les uniquement lorsque vous avez intentionnellement besoin de chaque combinaison. Pour des conseils de performance, voir Utiliser les variables partagées pour des jointures efficaces.
Mettre en correspondance les relations facultatives
Utilisez OPTIONAL MATCH quand une relation n’existe peut-être pas pour chaque nœud. Les lignes sans correspondance sont conservées avec les valeurs NULL, semblable à une SQL LEFT JOIN.
Exemple : Renvoyer jusqu’à 100 personnes avec leur nom d’entreprise, y compris celles sans emploi (c'est-à-dire, qui renvoient NULL pour la colonne de l’entreprise)
MATCH (p:Person)
OPTIONAL MATCH (p)-[:workAt]->(c:Company)
RETURN p.firstName, p.lastName, c.name AS company
LIMIT 100
Utilisez IS NULL après OPTIONAL MATCH pour trouver jusqu’à 100 personnes qui ne travaillent à aucune entreprise :
MATCH (p:Person)
OPTIONAL MATCH (p)-[:workAt]->(c:Company)
FILTER c IS NULL
RETURN p.firstName, p.lastName
LIMIT 100