Écrire des requêtes GQL courantes dans Microsoft Fabric

Note

Cette fonctionnalité est actuellement disponible en préversion publique. Cette version préliminaire est fournie sans accord de niveau de service et n'est pas recommandée pour des charges de travail en production. Certaines fonctionnalités peuvent être limitées ou non prises en charge. Pour plus d’informations, consultez Conditions d'utilisation supplémentaires pour les versions préliminaires de Microsoft Azure.

Cet article fournit des modèles de requête GQL pratiques pour les tâches de graphe courantes dans Microsoft Fabric : recherche de voisins, traversée de connexions multiop, identification des connexions partagées, comptage des relations et recherche d’entités sans connexion.

Les exemples utilisent l’exemple de jeu de données de réseau social. Pour obtenir des informations de référence sur la langue complète, consultez le guide de langue GQL.

Prerequisites

  • Élément de graphe avec des données chargées. Si vous débutez avec le graphique, suivez d’abord le tutoriel .
  • Familiarité avec les requêtes de base MATCH et RETURN. Consultez le guide de langue GQL.

Rechercher des voisins directs

Retourne tous les nœuds connectés à un nœud de départ par un saut.

Trouvez tout le monde qu’une personne spécifique sait :

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

Trouvez toutes les entreprises qu’une personne a travaillé à :

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

Trouver des amis d'amis (multi-sauts)

Utilisez des modèles de longueur variable avec {min,max} pour parcourir plusieurs tronçons.

Trouvez des gens à deux sauts - amis des amis d’Alice qui Alice ne connaît pas directement :

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

Trouvez tout le monde accessible en trois degrés :

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

Conseil / Astuce

Définissez toujours une limite supérieure sur la traversée de longueur variable. Les modèles non liés sur des graphiques volumineux ou denses peuvent atteindre les limites de délai d’expiration des requêtes. Consultez les limitations actuelles.

Compter les relations par entité

Utilisez GROUP BY avec count(*) pour compter combien de relations possède chaque entité.

Comptez le nombre d’amis que chaque personne a, ordonnées de la plus à la plus petite :

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

Comptez le nombre d’employés qui travaillent à chaque entreprise :

MATCH (p:Person)-[:workAt]->(c:Company)
LET companyName = c.name
RETURN companyName, count(*) AS employeeCount
GROUP BY companyName
ORDER BY employeeCount DESC

Rechercher des connexions partagées

La réutilisation d’une variable dans deux parties d’un modèle crée une contrainte implicite « même nœud ». Utilisez cette contrainte pour rechercher des entités connectées via une troisième entité partagée.

Trouvez des paires de personnes qui connaissent tous les deux la même personne :

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

Trouvez des paires de personnes qui travaillent dans la même entreprise :

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

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.

Rechercher des entités sans relations

Utilisez OPTIONAL MATCH suivi d’une vérification null pour rechercher les nœuds qui n’ont aucune relation correspondante.

Trouvez des personnes qui ne travaillent pas dans une entreprise :

MATCH (p:Person)
OPTIONAL MATCH (p)-[:workAt]->(c:Company)
FILTER c IS NULL
RETURN p.firstName, p.lastName
LIMIT 100

Recherchez des billets sans commentaires :

MATCH (post:Post)
OPTIONAL MATCH (comment:Comment)-[:replyOf]->(post)
FILTER comment IS NULL
RETURN post.id, post.content
LIMIT 100

Rechercher des entités avec de nombreuses connexions

Combinez GROUP BY et FILTER pour identifier les nœuds hautement connectés. Cette méthode est utile pour rechercher des nœuds ou des valeurs hors norme.

Trouvez des personnes avec plus de 10 amis :

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

Note

FILTER après GROUP BY fonctionne comme HAVING dans SQL. Il filtre le résultat agrégé, et non les lignes individuelles.