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.
Les modèles de graphe sont des blocs de construction principaux de vos requêtes GQL dans le graphe dans Microsoft Fabric. Ils décrivent les structures que vous recherchez dans le graphe à l’aide de nœuds et de bords d’une manière intuitive et visuelle. Considérez les modèles de graphique en tant que modèles que le moteur de requête tente de faire correspondre aux données réelles de votre graphique.
Cet article explique la syntaxe et les règles de composition pour les modèles de graphe dans GQL.
Important
Cet article utilise exclusivement l’exemple de jeu de données de graphe de réseau social.
Modèles d’éléments simples
Les modèles d’éléments simples vous aident à faire correspondre des nœuds et des arêtes individuels de votre graphique qui répondent à des exigences spécifiques. Ces modèles constituent la base de la mise en correspondance de modèles plus complexes.
Modèles de nœud simples
Un modèle de nœud spécifie les étiquettes et les propriétés qu’un nœud doit avoir à faire correspondre :
(:Place&City { name: "New York" })
Ce modèle correspond à tous les nœuds qui ont à la fois les étiquettes et les PlaceCity étiquettes (indiquées par l’opérateur) et dont & la name propriété est "New York"égale. Cette combinaison d’étiquettes et de propriétés requises est appelée remplissage du modèle de nœud.
Concepts clés :
-
Correspondance des étiquettes : utilisez-la
&pour exiger plusieurs étiquettes. - Filtrage des propriétés : spécifiez des valeurs exactes que les propriétés doivent correspondre.
- Correspondance flexible (« covariante ») : les nœuds mis en correspondance peuvent avoir plus d’étiquettes et de propriétés au-delà des étiquettes spécifiées.
Note
Les nœuds peuvent avoir plusieurs étiquettes, mais les types de périphérie avec plusieurs étiquettes ne sont pas encore pris en charge.
Modèles de bord simples
Les modèles de périphérie sont plus complexes que les modèles de nœud. Ils spécifient non seulement un remplissage, mais relient aussi un motif de nœud d’origine à un pattern de nœud cible. Les modèles de périphérie décrivent les exigences à la fois sur le bord et ses points de terminaison :
(:Person)-[:likes|knows { creationDate: ZONED_DATETIME("2010-08-31T13:16:54Z") }]->(:Comment)
La direction -[...]-> de la flèche est importante : elle détermine (:Person) le motif du nœud d’origine et (:Comment) celui du nœud cible. Comprendre le sens de la périphérie est essentiel pour interroger correctement votre graphe.
Modèle en miroir équivalent :
Vous pouvez retourner la flèche et permuter les modèles de nœud pour créer le modèle de bord en miroir équivalent :
(:Comment)<-[:likes { creationDate: ZONED_DATETIME("2010-08-31T13:16:54Z") }]-(:Person)
Ce modèle trouve les mêmes relations, mais du point de vue opposé.
Modèles de bord dirigés vers n’importe quelle
Lorsque la direction d’un bord de graphe n’a pas d’importance pour votre requête, vous pouvez la laisser non spécifiée en créant un modèle de bord dirigé vers n’importe quel :
(:Song)-[:inspired]-(:Movie)
Ce motif correspond aux mêmes arêtes que (:Song)-[:inspired]->(:Movie) et (:Movie)-[:inspired]->(:Song) combinées, quel que soit le nœud d’origine et celui de cible (cet exemple ne provient pas du type de graphe réseau social).
Raccourcis du modèle de bord du graphique
GQL fournit des raccourcis pratiques pour les modèles de périphérie courants pour rendre vos requêtes plus concises :
-
()->()()-[]->()représente (bord dirigé avec n’importe quelle étiquette) -
()<-()()<-[]-()représente (bord dirigé dans l’inverse avec n’importe quelle étiquette) -
()-()()-[]-()signifie (arête dirigée avec n’importe quelle étiquette)
Ces raccourcis peuvent être utiles lorsque vous vous intéressez à la connectivité, mais pas au type de bord de graphique spécifique.
Expressions d’étiquette
Les modèles peuvent exprimer des exigences complexes sur les étiquettes des nœuds et des arêtes correspondants.
Exemple :
MATCH (:Person|(Organization&!Company))-[:isLocatedIn]->(p:City|Country)
RETURN count(*) AS num_matches
Cela compte le nombre de isLocatedIn périphéries qui connectent Person des nœuds ou des nœuds (mais Organizationpas)Company (qui sont toujours University des nœuds dans le schéma de réseau social) ou des CityCountry nœuds.
Syntaxe :
| Syntaxe | Meaning |
|---|---|
A&B |
Les étiquettes doivent inclure à la fois A et B. |
A\|B |
Les étiquettes doivent inclure au moins l’une des étiquettes A ou B. |
!A |
Les étiquettes doivent exclure A. |
En outre, utilisez des parenthèses pour contrôler l’ordre de l’évaluation d’expression d’étiquette. Par défaut, ! a la priorité la plus élevée et & a une priorité supérieure à |. Par conséquent !A&B|C|!D , il est identique à ((!A)&B)|C|(!D).
Variables de liaison
Les variables vous permettent de faire référence à des éléments de graphique mis en correspondance dans d’autres parties de votre requête. Comprendre comment lier et utiliser des variables est essentielle pour créer des requêtes puissantes.
Variables d’élément de liaison
Les modèles de nœud et de périphérie peuvent lier des nœuds et des arêtes mis en correspondance à des variables pour référence ultérieure.
(p:Person)-[w:workAt]->(c:Company)
Dans ce modèle, p est lié aux nœuds correspondants Person , w aux arêtes correspondantes workAt et c aux nœuds correspondants Company .
Réutilisation des variables pour les contraintes structurelles :
La réutilisation de la même variable dans un modèle plusieurs fois exprime une restriction sur la structure des correspondances. Chaque occurrence de la même variable doit toujours être liée au même élément de graphe dans une correspondance valide. La réutilisation des variables est puissante pour exprimer des exigences structurelles complexes.
(c:Company)<-[:workAt]-(x:Person)-[:knows]-(y:Person)-[:workAt]->(c:Company)
Le modèle recherche des Person nœuds x et y qui se connaissent et fonctionnent au même Companyniveau, qui est lié à la variable c. La réutilisation garantit c que les deux personnes travaillent dans la même entreprise.
Prédicats de modèle avec des variables d’élément :
Les variables d’élément de liaison vous permettent de spécifier des prédicats de modèle de nœud et de périphérie. Au lieu de fournir simplement un remplissage avec des valeurs de propriété exactes telles que { name: "New York, USA" }, un remplissage peut spécifier un prédicat qui est évalué pour chaque élément candidat. Le modèle correspond uniquement si le prédicat est évalué à TRUE:
(p:Person)-[e:knows WHERE e.creationDate >= ZONED_DATETIME("2000-01-01T18:00:00Z")]-(o:Person)
Le modèle de périphérie trouve les personnes qui se connaissaient depuis le 1er janvier 2000, à l’aide d’une condition flexible plutôt que d’une correspondance exacte.
Note
Les variables de modèle edge se lient toujours au bord individuel dans le prédicat de modèle de bord, même en cas d’utilisation de modèles de longueur variable. Cela peut vous aider à ne pas avoir à supprimer les variables de liste de groupes de périphérie pour effectuer un post-filtre. Consultez Lier des variables de périphérie de modèle de longueur variable.
Techniques avancées de prédicat de modèle :
Les prédicats de modèle fournissent des fonctionnalités de filtrage inline puissantes qui peuvent améliorer la lisibilité des requêtes :
-- Multiple conditions in node predicates
MATCH (p:Person WHERE p.birthday < 19900101 AND p.gender = 'female')
-[:workAt]->
(c:Company WHERE c.name STARTS WITH 'A')
-- Filter on an edge property
MATCH (p1:Person)-[w:workAt WHERE w.workFrom >= 2010]->(c:Company)
-- MATCH WHERE: evaluated after pattern matching
MATCH (p:Person)-[:workAt]->(c:Company)
WHERE p.browserUsed = 'Firefox' AND c.name IS NOT NULL
-- Filter during matching and after
MATCH (p:Person WHERE p.gender = 'male')-[:workAt]->(c:Company)
WHERE p.birthday < 19900101 AND c.url IS NOT NULL
Conseil / Astuce
Gardez un prédicat à l’intérieur du motif lorsqu’il décrit quel nœud ou arête peut participer à la correspondance.
Variables de chemin d’accès de liaison
Vous pouvez également lier un chemin d’accès correspondant à une variable de chemin d’accès pour un traitement ultérieur ou retourner la structure de chemin d’accès complète à l’utilisateur :
p=(c:Company)<-[:workAt]-(x:Person)-[:knows]-(y:Person)-[:workAt]->(c:Company)
Ici, p est lié à une valeur de chemin représentant la structure complète du chemin d’accès correspondant, y compris les valeurs de référence pour tous les nœuds et arêtes dans l’ordre donné.
Les chemins liés peuvent soit être retournés à l’utilisateur, soit traités davantage à l’aide de fonctions telles que NODES ou EDGES:
MATCH p=(c:Company)<-[:workAt]-(x:Person)-[:knows]-(y:Person)-[:workAt]->(c:Company)
LET path_edges = edges(p)
RETURN path_edges, size(path_edges) AS num_edges
GROUP BY path_edges
Composer des modèles
Les requêtes réelles nécessitent souvent des modèles plus complexes que des structures de nœud-edge simples. GQL fournit plusieurs façons de composer des modèles pour les traversées de graphiques sophistiquées.
Composer des modèles de chemin d’accès
Les modèles de chemin d’accès peuvent être composés en concaténant des modèles de nœud et de bord simples pour créer des traversées plus longues.
(:Person)-[:knows]->(:Person)-[:workAt]->(:Company)-[:isLocatedIn]->(:Country)-[:isPartOf]->(:Continent)
Le modèle traverse une personne par le biais de ses liens sociaux et professionnels pour trouver où se trouve la société de son collègue.
Construction de modèle dans le sens des pièces : Vous pouvez également créer des modèles de chemin d’accès plus incrémentiels, ce qui permet de faciliter la lecture et la compréhension des modèles complexes :
(:Person)-[:knows]->(p:Person),
(p:Person)-[:workAt]->(c:Company),
(c:Company)-[:isLocatedIn]->(:Country)-[:isPartOf]->(:Continent)
Cette approche décompose la même traversée en étapes logiques, ce qui facilite la compréhension et le débogage.
Composer des modèles non linéaires
La forme résultante d’un motif n’a pas besoin d’être un chemin linéaire. Vous pouvez correspondre à des structures plus complexes telles que des modèles en forme d’étoile qui rayonnent à partir d’un nœud central :
(p:Person),
(p)-[:studyAt]->(u:University),
(p)-[:workAt]->(c:Company),
(p)-[:likes]-(m)
Le modèle recherche une personne ainsi que ses préférences d’éducation, d’emploi et de contenu en même temps , une requête de profil complète.
Les motifs dans le même MATCH ensemble n’ont pas besoin de partager une variable. Les motifs déconnectés forment un produit cartésien de leurs correspondances. Réutilisez une variable lorsque les motifs doivent lier le même élément du graphe et que seules les combinaisons jointes devraient subsister.
Réutilisation des éléments de contrôle
GQL contrôle des nœuds et arêtes répétés à deux niveaux :
- Un mode correspondance s’applique au motif complet du graphe, y compris les chemins séparés par virgules.
- Un mode chemin s’applique à un seul chemin.
Le mode de match par défaut est REPEATABLE ELEMENTS. Elle permet que la même liaison d’éléments se produise dans différentes parties du motif graphique, sous réserve du mode chemin de chaque chemin. Vous pouvez l’écrire explicitement :
REPEATABLE ELEMENTS (a)-[e1:knows]->(b), (a)-[e2:knows]->(c)
Utilisez DIFFERENT EDGES ou son synonyme DIFFERENT RELATIONSHIPS pour exiger l’unicité des arêtes sur tout le motif du graphe. Ce mode de match modifie également n’importe quel WALK chemin du motif en TRAIL comportement.
DIFFERENT EDGES (a)-[e1:knows]->(b), (a)-[e2:knows]->(c)
Les modes de chemin suivants contrôlent les éléments répétés à l’intérieur de chaque chemin :
| Mode chemin | Réutilisation des éléments |
|---|---|
WALK |
Les nœuds et les arêtes peuvent se répéter. |
TRAIL |
Les arêtes ne peuvent pas se répéter, mais les nœuds peuvent se répéter. |
SIMPLE |
Les nœuds ne peuvent pas se répéter, sauf que le premier et le dernier nœud peuvent être identiques. Les bords ne peuvent pas se répéter. |
ACYCLIC |
Les nœuds ne peuvent pas se répéter, y compris le premier et le dernier nœud. Les bords ne peuvent pas se répéter. |
WALK est le mode de chemin par défaut. Préfixez un chemin avec un autre mode lorsque vous avez besoin d’une unicité d’élément plus stricte :
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.
TRAIL (a)-[e1:knows]->(b)-[e2:knows]->(c)-[e3:knows]->(d)
Le TRAIL motif ne produit que des correspondances où e1, e2, et e3 sont différentes. Les nœuds peuvent toujours se répéter, donc le chemin peut former un cycle sans réutiliser une arête.
Contrôlez quels chemins sont retournés
Un préfixe de recherche de chemin contrôle quels chemins un motif de chemin retourne. Le préfixe par défaut ALL renvoie tous les chemins correspondant au mode et au motif. Vous pouvez écrire ALL explicitement :
ALL TRAIL (a:Person)-[:knows]->{1,4}(b:Person)
Utilisez ANY SHORTEST pour retourner un chemin correspondant le plus court pour chaque paire source-destination de chaque ligne d’entrée :
MATCH p = ANY SHORTEST
(src:Person)-[:knows]->{1,4}(dst:Person)
RETURN src.id AS sourceId, dst.id AS targetId, path_length(p) AS hopCount
ORDER BY sourceId, targetId
LIMIT 100
Si plusieurs chemins sont liés pour la longueur la plus courte, la requête en retourne un, mais le chemin lié n’est pas déterministe. Une borne inférieure de zéro peut renvoyer un chemin zéro saut d’un nœud source vers lui-même.
ALL SHORTEST Et ANY les recherches de chemin ne sont pas prises en charge.
Placez les prédicats avant ou après la sélection du chemin
Le placement des prédicats détermine si une condition définit des chemins éligibles ou filtre les chemins après que le préfixe de recherche de chemin les ait sélectionnés :
- Un inline
WHEREdans un motif de nœud ou d’arête fait partie du motif. Elle limite quels chemins sont éligibles avantALLouANY SHORTESTqui sont appliqués. - Un niveau
WHEREd’instruction après le motif completMATCHest un postfiltre. Il filtre les lignes après que le préfixe de recherche de chemin a été sélectionné. - Une instruction ultérieure
FILTERfiltre également les lignes après la sélection du chemin.
Cette distinction est particulièrement importante avec ANY SHORTEST. Dans le schéma suivant, seules knows les arêtes créées à la date spécifiée ou après sont éligibles lorsque la requête sélectionne le chemin le plus court :
MATCH p = ANY SHORTEST
(src:Person WHERE src.firstName = 'Alice')
-[connection:knows
WHERE connection.creationDate >= ZONED_DATETIME('2020-01-01T00:00:00Z')]->{1,4}
(dst:Person WHERE dst.firstName = 'Bob')
RETURN p
Déplacer la condition d’arête vers un postfiltre change la signification. La requête sélectionne d’abord un chemin le plus court sans cette condition. Il supprime ensuite le chemin sélectionné si une arête ne remplit pas la condition ; il ne sélectionne pas un chemin plus long à la place :
MATCH p = ANY SHORTEST
(src:Person WHERE src.firstName = 'Alice')
-[connections:knows]->{1,4}
(dst:Person WHERE dst.firstName = 'Bob')
FILTER ALL(connection IN connections
WHERE connection.creationDate >= ZONED_DATETIME('2020-01-01T00:00:00Z'))
RETURN p
Important
Pour certaines ANY SHORTEST formes de requête, Graph peut actuellement appliquer une condition au niveau MATCH ... WHERE de l’instruction avant la sélection du chemin. Jusqu’à ce que cette limitation soit résolue, utilisez des prédicats en ligne pour l’éligibilité aux chemins et une instruction séparée FILTER pour le filtrage post-sélection. Pour plus d’informations, consultez les limitations actuelles.
Utiliser des modèles de longueur variable
Les modèles de longueur variable sont des constructions puissantes qui vous permettent de trouver des chemins d’accès de longueurs variables sans écrire de spécifications de modèle répétitives. Ils sont essentiels pour parcourir les hiérarchies, les réseaux sociaux et d’autres structures où la longueur optimale du chemin n’est pas connue à l’avance.
Modèles de longueur variable délimités
De nombreuses requêtes de graphe courantes nécessitent la répétition du même modèle de bord plusieurs fois. Au lieu d’écrire des modèles détaillés comme :
(:Person)-[:knows]->(:Person)-[:knows]->(:Person)-[:knows]->(:Person)
Vous pouvez utiliser la syntaxe de longueur variable plus concise :
(:Person)-[:knows]->{3}(:Person)
Spécifie {3} que le -[:knows]-> modèle de bord doit être répété exactement trois fois.
Plages de répétition flexibles : Pour plus de flexibilité, vous pouvez spécifier une limite inférieure et une limite supérieure pour la répétition :
(:Person)-[:knows]->{1, 3}(:Person)
Ce modèle trouve des amis directs, des amis des amis et des amis-de-amis-de-amis dans une seule requête.
Note
La borne inférieure peut aussi être nulle. Une correspondance à zéro saut ne contient aucune arête et nécessite que les deux motifs de nœuds terminaux correspondent au même nœud.
Exemple :
(p1:Person)-[:knows]->{0,1}(p2:Person)
Ce motif correspond à chaque personne à la fois p1 et p2 à zéro saut, et correspond aux paires connectées à un même saut.
Lorsqu’aucune borne inférieure n’est spécifiée dans {,n}, elle tombe par défaut à zéro.
Compositions complexes à longueur variable : Les motifs de longueur variable peuvent faire partie de motifs plus grands et plus complexes, comme dans la requête suivante :
MATCH (c1:Comment)<-[:likes]-(p1:Person)-[:knows]-(p2:Person)-[:likes]->(c2:Comment),
(c1:Comment)<-[:replyOf]-{1,3}(m)-[:replyOf]->{1,3}(c2:Comment)
RETURN *
LIMIT 100
Le schéma présente des paires de commentaires où des personnes qui se connaissent ont aimé différents commentaires et un message m est relié à chaque commentaire par une chaîne de une à trois replyOf arêtes.
Lier des variables de périphérie de modèle de longueur variable
Lorsque vous liez un modèle de bord de longueur variable, la valeur et le type de la variable de périphérie changent en fonction du contexte de référence. Comprendre ce comportement est essentiel pour traiter correctement les correspondances de longueur variable :
Deux degrés de référence :
- À l’intérieur d’un modèle de longueur variable : les variables de bord de graphe se lient à chaque bord individuel le long du chemin correspondant (également appelé « degré singleton de référence »)
- En dehors d’un modèle de longueur variable : les variables de bord du graphe sont liées à la séquence de tous les bords le long du chemin correspondant (également appelé « degré de référence de groupe »)
Exemple illustrant les deux contextes :
MATCH (:Person)-[e:knows WHERE e.creationDate >= ZONED_DATETIME("2000-01-01T00:00:00Z")]->{1,3}()
RETURN e[0]
LIMIT 100
L’évaluation de la variable e de périphérie se produit dans deux contextes :
Dans l’énoncé
MATCH: La requête trouve des chaînes d’amis-d’amis-d’amis où chaque amitié a été établie depuis l’année 2000. Pendant la correspondance de modèle, le prédicate.creationDate >= ZONED_DATETIME("2000-01-01T00:00:00Z")de modèle de bord est évalué une fois pour chaque arête candidate. Dans ce contexte,eest lié à une valeur de référence de périphérie unique.Dans l’instruction
RETURN: Ici,eest liée à une liste (groupe) de valeurs de référence de périphérie dans l’ordre dans lequel elles se produisent dans la chaîne correspondante. Le résultat est la première valeur dee[0]référence de périphérie dans chaque chaîne correspondante.
Variables de contours à longueur variable en agrégation horizontale :
Les variables d’arête liées par l’appariement de motifs de longueur variable sont des listes de groupes en dehors du motif à longueur variable et peuvent donc être utilisées en agrégation horizontale.
MATCH (a:Person)-[e:knows WHERE e.creationDate >= ZONED_DATETIME("2000-01-01T00:00:00Z")]->{1,3}(b)
RETURN a, b, size(e) AS num_edges
LIMIT 100
Pour plus d’informations, voir Fonctions agrégées.
Modèles de longueur variable sans limite
Utilisez un quantificateur non borné lorsque la longueur maximale du chemin n’est pas connue :
-- Two or more edges
TRAIL (:Person)-[:knows]->{2,}(:Person)
Les * raccourcis et + spécifient zéro ou plus et une ou plus répétitions :
-- Zero or more edges
ACYCLIC (:Person)-[:knows]->*(:Person)
-- One or more edges
SIMPLE (:Person)-[:knows]->+(:Person)
Un motif non borné avec la combinaison par défaut ALL WALK est rejeté car les cycles peuvent produire un nombre infini de chemins correspondants. Utilisez TRAIL, SIMPLE, ou ACYCLIC pour limiter le chemin à travers l’unicité des arêtes ou des nœuds. Ces modes garantissent la terminaison, mais un grand graphe peut tout de même produire un grand nombre de chemins.
Important
Pour un chemin délimité par un non borné ANY SHORTEST WALK, les seules utilisations supportées sont PATH_LENGTH(path) et, à côté, path IS NULL. Le graphe ne matérialise pas le chemin complet sous cette forme. Utiliser une borne supérieure finie ou spécifier TRAIL, SIMPLE, ou ACYCLIC retourner ou utiliser autrement le chemin.