Cypher est un langage de requête graphique déclaratif qui permet une requête de données expressive et efficace dans un graphe de propriétés.
Cypher était en grande partie une invention d'Andrés Taylor alors qu'il travaillait pour Neo4j, Inc. (anciennement Neo Technology) en 2011. Cypher était à l'origine destiné à être utilisé avec la base de données graphique Neo4j , mais a été ouvert via le projet openCypher en octobre 2015.
Le langage a été conçu avec la puissance et les capacités de SQL (langage de requête standard pour le modèle de base de données relationnelle ) à l'esprit, mais Cypher s'est basé sur les composants et les besoins d'une base de données construite sur les concepts de la théorie des graphes . Dans un modèle de graphe, les données sont structurées sous forme de nœuds ( sommets en mathématiques et en science des réseaux) et de relations (arêtes en mathématiques et en science des réseaux) pour se concentrer sur la manière dont les entités des données sont connectées et liées les unes aux autres.
Modèle graphique
Cypher est basé sur le modèle de graphe de propriétés , qui organise les données en nœuds et en arêtes (appelés « relations » dans Cypher). En plus de ces éléments graphiques standard de nœuds et de relations, le modèle de graphe de propriétés ajoute des étiquettes et des propriétés pour décrire des catégories et des attributs plus précis des données.
Les nœuds sont les entités du graphique. Ils peuvent contenir n'importe quel nombre d'attributs ( paires clé-valeur ) appelés propriétés. Les nœuds peuvent être étiquetés avec zéro ou plusieurs étiquettes (comme des balises ou des catégories), représentant leurs différents rôles dans un domaine. Les relations fournissent des connexions dirigées, nommées et sémantiquement pertinentes entre deux entités de nœud. Une relation a toujours une direction, un nœud de départ, un nœud de fin et exactement un type de relation. Comme les nœuds, les relations peuvent également avoir des propriétés.
Les étiquettes peuvent regrouper des nœuds similaires en attribuant zéro ou plusieurs étiquettes de nœud. Les étiquettes sont en quelque sorte des balises et vous permettent de spécifier certains types d'entités à rechercher ou à créer. Les propriétés sont des paires clé-valeur avec une liaison d'une clé de chaîne et d'une valeur du système de type Cypher. Les requêtes Cypher sont assemblées avec des modèles de nœuds et des relations avec tout filtrage spécifié sur les étiquettes et les propriétés pour créer, lire, mettre à jour, supprimer des données trouvées dans le modèle spécifié.
Système de types de données
Le système de types de données de Cypher inclut de nombreux types de données courants utilisés dans d'autres langages de programmation et de requête. Les types de données pris en charge incluent les types de valeurs scalaires tels que boolean , string , number , integer et floating-point numbers . Il prend également en charge les types temporels tels que datetime, localdatetime, date, time, localtime et duration. Des types de données de conteneur pour les cartes et les listes sont disponibles, ainsi que des types de graphiques pour les nœuds, les relations, les chemins et un type void .
Syntaxe
Le langage de requête Cypher décrit les modèles de nœuds et de relations et filtre ces modèles en fonction des étiquettes et des propriétés. La syntaxe de Cypher est basée sur l'art ASCII , qui est un art visuel basé sur du texte pour les ordinateurs. Cela rend le langage très visuel et facile à lire car il représente à la fois visuellement et structurellement les données spécifiées dans la requête. Par exemple, les nœuds sont représentés par des parenthèses autour des attributs et des informations concernant l'entité. Les relations sont représentées par une flèche (orientée ou non) avec le type de relation entre crochets.
//nœud ( variable : Étiquette { propertyKey : 'propertyValue' }) //relation -[ variable : RELATIONSHIP_TYPE ]-> //Modèle de chiffrement ( node1 : LabelA ) -[ rel1 : RELATIONSHIP_TYPE ]-> ( node2 : LabelB )
Mots clés
Comme d'autres langages de requête, Cypher contient une variété de mots-clés pour spécifier des modèles, filtrer des modèles et renvoyer des résultats. Parmi les plus courants, on trouve : MATCH, WHERE et RETURN. Leur fonctionnement est légèrement différent de SELECT et WHERE dans SQL ; cependant, ils ont des objectifs similaires.
MATCH est utilisé avant de décrire le modèle de recherche pour trouver des nœuds, des relations ou des combinaisons de nœuds et de relations ensemble. WHERE dans Cypher est utilisé pour ajouter des contraintes supplémentaires aux modèles et filtrer les modèles indésirables. RETURN de Cypher formate et organise la manière dont les résultats doivent être générés. Tout comme avec d'autres langages de requête, vous pouvez renvoyer les résultats avec des propriétés spécifiques, des listes, un ordre, etc.
En utilisant les mots-clés avec la syntaxe de modèle indiquée ci-dessus, l'exemple de requête ci-dessous recherchera le modèle du nœud (étiquette d'acteur et propriété appelée nom avec la valeur « Nicole Kidman ») connecté par une relation (type ACTED_IN et direction sortante à partir du premier nœud) à un autre nœud (étiquette de film). La clause WHERE filtre ensuite pour ne conserver que les modèles où le nœud Movie dans la clause match a une propriété year inférieure à la valeur du paramètre transmis. Dans le retour, la requête spécifie de générer les nœuds movie qui correspondent au modèle et de filtrer à partir des clauses match et where.
MATCH ( nicole : Acteur { nom : 'Nicole Kidman' }) -[ : ACTED_IN ]-> ( film : Film ) OÙ film . année < $ yearParameter RETOUR film
Cypher contient également des mots-clés pour spécifier des clauses d'écriture, de mise à jour et de suppression de données. CREATE et DELETE sont utilisés pour créer et supprimer des nœuds et des relations. SET et REMOVE sont utilisés pour définir des valeurs sur des propriétés et ajouter/supprimer des étiquettes sur des nœuds. MERGE est utilisé pour créer des nœuds de manière unique sans doublons. Les nœuds ne peuvent être supprimés que s'ils n'ont plus d'autres relations existantes. Par exemple :
MATCH ( startContent : Contenu ) - [ relation : IS_RELATED_TO ]-> ( endContent : Contenu ) OÙ endContent . source = 'utilisateur' FACULTATIF MATCH ( endContent ) - [ r ]- () SUPPRIMER relation , endContent
Standardisation
Avec le projet openCypher, un effort a commencé pour normaliser Cypher comme langage de requête pour le traitement des graphes. Dans le cadre de ce processus, cinq réunions en face à face des implémenteurs d'openCypher (oCIM) ont eu lieu. La première réunion a eu lieu en février 2017 au siège de SAP à Walldorf en Allemagne, en même temps qu'une réunion du Linked Data Benchmark Council. La dernière OCIM a eu lieu à Berlin, en même temps que l'atelier du W3C sur les normes Web pour la gestion des données graphiques, en mars 2019.
Lors de cette réunion, un consensus s'est dégagé pour que Cypher devienne un élément important d'un projet plus vaste de langage de requête graphique normalisé international appelé GQL. En septembre 2019, une proposition de projet de norme GQL a été approuvée par un vote des organismes nationaux de normalisation qui sont membres du Comité technique mixte ISO/CEI 1 (responsable des normes des technologies de l'information). La proposition de projet GQL stipule ce qui suit :
L'utilisation d'un graphe comme représentation fondamentale pour la modélisation des données est une approche émergente dans la gestion des données. Dans cette approche, l'ensemble de données est modélisé sous forme de graphe, représentant chaque entité de données comme un sommet (également appelé nœud) du graphe et chaque relation entre deux entités comme une arête entre les sommets correspondants. Le modèle de données graphique a attiré l'attention pour ses avantages uniques. Tout d'abord, le modèle graphique peut être un choix naturel pour les ensembles de données qui ont des structures hiérarchiques, complexes ou même arbitraires. De telles structures peuvent être facilement codées dans le modèle graphique sous forme d'arêtes. Cela peut être plus pratique que le modèle relationnel, qui nécessite la normalisation de l'ensemble de données en un ensemble de tables avec des types de lignes fixes. Deuxièmement, le modèle graphique permet une exécution efficace de requêtes coûteuses ou de fonctions d'analyse de données qui doivent observer les relations multi-sauts entre les entités de données, telles que les requêtes d'accessibilité, les requêtes de chemin le plus court ou le moins cher, ou l'analyse de centralité. Il existe deux modèles de graphe actuellement utilisés : le modèle Resource Description Framework (RDF) et le modèle Property Graph. Le modèle RDF a été normalisé par le W3C dans un certain nombre de spécifications. Le modèle Property Graph, en revanche, possède une multitude d'implémentations dans les bases de données graphiques, les algorithmes graphiques et les outils de traitement de graphes. Cependant, il manque un langage de requête standardisé et commun pour les graphes de propriétés (comme SQL pour les systèmes de bases de données relationnelles). GQL est proposé pour combler ce vide.
En 2024, la norme GQL a été publiée comme langage de requête graphique standard sous la norme ISO/IEC 39075:2024. La première implémentation open source d'un sous-ensemble du langage est déjà disponible. Outre l'implémentation, on peut également trouver une formalisation et lire la syntaxe du sous-ensemble spécifique de GQL.