Ce document compare openCypher et Spanner Graph de la manière suivante :
- Terminologie
- Modèle de données
- Schéma
- Requête
- Mutation
Dans ce document, nous partons du principe que vous connaissez openCypher v9.
Avant de commencer
Configurez et interrogez Spanner Graph à l'aide de la console Google Cloud.
Terminologie
openCypher | Spanner Graph |
---|---|
nœuds | nœuds |
relations | arêtes |
libellés de nœuds | libellés de nœuds |
types de relations | étiquettes de périphérie |
clauses | Spanner Graph utilise le terme statement pour une unité d'exécution complète et clause pour un modificateur d'instructions.Par exemple, MATCH est une instruction, tandis que WHERE est une clause. |
unicité des relations openCypher ne renvoie pas de résultats avec des arêtes répétées dans une seule correspondance. |
chemin TRAIL Lorsque l'unicité est souhaitée dans le graphe Spanner, utiliser TRAIL pour renvoyer des arêtes uniques en une seule correspondance.
|
Conformité aux normes
Spanner Graph adopte la norme ISO Graph Query Language (Langage de requête graphique) (GQL) et Requêtes de graphiques de propriétés/SQL (SQL/PGQ).
Modèle de données
Spanner Graph et openCypher adoptent le modèle de données de graphique de propriétés avec quelques différences.
openCypher | Spanner Graph |
---|---|
Chaque relation a un seul type de relation. |
Les nœuds et les arêtes ont une ou plusieurs étiquettes. |
Schéma
openCypher | Spanner Graph |
---|---|
Un graphique n'a pas de schéma prédéfini. | Un schéma de graphique doit être défini explicitement à l'aide de l'instruction CREATE PROPERTY GRAPH .Les étiquettes sont définies de manière statique dans le schéma. Pour mettre à jour les étiquettes, vous n'avez pas besoin de mettre à jour le schéma. Pour en savoir plus, consultez Créer, mettre à jour ou supprimer un schéma de graphique Spanner. |
Requête
Les capacités de requête du graphe de Spanner sont semblables à celles d'openCypher. Les différences entre Spanner Graph et openCypher sont décrites dans cette section.
Spécifier le graphique
Dans openCypher, il existe un graphique par défaut, et les requêtes s'exécutent sur le graphique
graphique. Dans Spanner Graph, vous pouvez définir plusieurs graphiques et une requête
doit commencer par la clause GRAPH
pour spécifier le graphique à interroger. Exemple :
GRAPH FinGraph
MATCH (p:Person)
RETURN p.name
ORDER BY p.name
LIMIT 1;
Pour en savoir plus, reportez-vous à la syntaxe des requêtes de graphique.
Correspondance de modèles de graphiques
Spanner Graph est compatible avec des fonctionnalités de mise en correspondance de modèles de graphes similaires à celles d'openCypher. Les différences sont expliquées dans les sections suivantes.
Unicité de la relation et mode TRAIL
openCypher ne renvoie pas de résultats avec des arêtes répétées dans une seule correspondance. C'est ce que l'on appelle l'unicité des relations dans openCypher. Dans Spanner Graph, les arêtes répétées sont renvoyées par défaut. Lorsque l'unicité est souhaitée, utilisez
TRAIL
pour vous assurer qu'aucune arête répétitive n'existe dans la correspondance unique. Pour en savoir plus sur la sémantique détaillée de TRAIL
et des autres modes de chemin d'accès, consultez la section Mode de chemin d'accès.
L'exemple suivant montre comment les résultats d'une requête changent avec le mode TRAIL
:
- Les requêtes en mode
TRAIL
openCypher et Spanner Graph renvoient des résultats vides, car le seul chemin possible consiste à répétert1
deux fois. - Par défaut, la requête de graphique Spanner renvoie un chemin valide.
openCypher | Graphique Spanner (mode TRAIL) | Graphique Spanner (mode par défaut) | ||||
---|---|---|---|---|---|---|
MATCH (src:Account)-[t1:Transfers]-> (dst:Account)-[t2:Transfers]-> (src)-[t1]->(dst) WHERE src.id = 16 RETURN src.id AS src_id, dst.id AS dst_id; |
GRAPH FinGraph MATCH TRAIL (src:Account)-[t1:Transfers]-> (dst:Account)-[t2:Transfers]-> (src)-[t1]->(dst) WHERE src.id = 16 RETURN src.id AS src_id, dst.id AS dst_id; |
GRAPH FinGraph MATCH (src:Account)-[t1:Transfers]-> (dst:Account)-[t2:Transfers]-> (src)-[t1]-> (dst) WHERE src.id = 16 RETURN src.id AS src_id, dst.id AS dst_id; |
||||
Résultat vide. | Résultat vide. | Résultat:
|
Renvoyer des éléments de graphique sous forme de résultats de requête
openCypher | Spanner Graph |
---|---|
MATCH (account:Account) WHERE account.id = 16; RETURN account; |
GRAPH FinGraph MATCH (account:Account) WHERE account.id = 16; RETURN TO_JSON(account) AS account; |
Dans Spanner Graph, les résultats de requête ne renvoient pas d'éléments de graphique. Utilisez la fonction TO_JSON
pour renvoyer des éléments de graphique au format JSON.
Correspondance de modèle de longueur variable et quantification de modèle
Dans openCypher, la correspondance de modèle de longueur variable s'appelle la quantification du chemin. dans Spanner Graph. La quantification du chemin d'accès utilise une syntaxe différente, comme indiqué ci-dessous. dans l'exemple suivant. Pour en savoir plus, consultez la page Format de chemin d'accès quantifié.
openCypher | Spanner Graph |
---|---|
MATCH (src:Account)-[:Transfers*1..2]->(dst:Account) WHERE src.id = 16 RETURN dst.id ORDER BY dst.id; |
GRAPH FinGraph MATCH (src:Account)-[:Transfers]->{1,2}(dst:Account) WHERE src.id = 16 RETURN dst.id ORDER BY dst.id; |
Modèle de longueur variable : liste d'éléments
Spanner Graph vous permet d'accéder directement aux variables utilisées dans les quantifications de chemin. Dans l'exemple suivant, e
dans Spanner Graph est identique à edges(p)
dans openCypher.
openCypher | Spanner Graph |
---|---|
MATCH p=(src:Account)-[:Transfers*1..3]->(dst:Account) WHERE src.id = 16 RETURN edges(p); |
GRAPH FinGraph MATCH (src:Account) -[e:Transfers]->{1,3} (dst:Account) WHERE src.id = 16 RETURN TO_JSON(e) AS e; |
Chemin le plus court
openCypher dispose de deux fonctions intégrées pour trouver le chemin le plus court entre les nœuds:
shortestPath
et allShortestPath
.
shortestPath
trouve un seul chemin le plus court entre les nœuds.allShortestPath
trouve tous les chemins les plus courts entre les nœuds. Il peut y avoir comporter plusieurs chemins de même longueur.
Spanner Graph utilise une syntaxe différente pour trouver un seul chemin le plus court entre les nœuds : ANY SHORTEST
pour shortestPath.
. La fonction allShortestPath
n'est pas prise en charge dans Spanner Graph.
openCypher | Spanner Graph |
---|---|
MATCH (src:Account {id: 7}), (dst:Account {id: 20}), p = shortestPath((src)-[*1..10]->(dst)) RETURN length(p) AS path_length; |
GRAPH FinGraph MATCH ANY SHORTEST (src:Account {id: 7})-[e:Transfers]->{1, 3} (dst:Account {id: 20}) RETURN ARRAY_LENGTH(e) AS path_length; |
Déclarations et clauses
Le tableau suivant liste les clauses openCypher et indique si elles sont compatibles ou non avec Spanner Graph.
openCypher | Spanner Graph | |
---|---|---|
MATCH |
Compatible Pour en savoir plus, consultez la section Correspondance de modèles de graphiques. | |
OPTIONAL MATCH |
Compatible Pour en savoir plus, consultez la section Correspondance de modèles de graphiques. | |
RETURN / WITH |
Compatible Pour plus d'informations, consultez les
l'instruction RETURN et l'instruction
WITH .
Le graphe Spanner nécessite un aliasage explicite pour les expressions complexes. |
|
Compatible. |
GRAPH FinGraph MATCH (p:Person) RETURN EXTRACT(YEAR FROM p.birthday) AS birthYear; |
|
Non compatible. |
GRAPH FinGraph MATCH (p:Person) RETURN EXTRACT(YEAR FROM p.birthday); -- No aliasing |
|
WHERE |
Compatible Pour en savoir plus, consultez la définition de graphique. | |
ORDER BY |
Compatible Pour en savoir plus, consultez la section Instruction ORDER BY . |
|
SKIP / LIMIT |
Compatible Pour plus d'informations, consultez les
l'instruction SKIP et l'instruction
LIMIT .Spanner Graph nécessite une expression constante pour le décalage et la limite. |
|
Compatible. |
GRAPH FinGraph MATCH (n:Account) RETURN n.id SKIP @offsetParameter LIMIT 3; |
|
Non compatible. |
GRAPH FinGraph MATCH (n:Account) RETURN n.id LIMIT VALUE { MATCH (m:Person) RETURN COUNT(*) AS count } AS count; -- Not a constant expression |
|
UNION |
Compatible Pour en savoir plus, consultez la page Requête de graphique composite. | |
UNION ALL |
Compatible Pour en savoir plus, consultez la section Requête de graphique composite. | |
UNWIND |
Compatible avec l'instruction FOR . |
|
GRAPH FinGraph LET arr = [1, 2, 3] FOR num IN arr RETURN num; |
||
MANDATORY MATCH |
Non compatible | |
CALL[YIELD...] |
Non compatible | |
CREATE , DELETE , SET ,
REMOVE , MERGE |
Pour en savoir plus, consultez la section Mutation et Insérer, mettre à jour ou supprimer des données dans Spanner Graph. |
Types de données
Spanner Graph est compatible avec tous les types de données GoogleSQL. Pour plus pour en savoir plus, consultez Types de données dans GoogleSQL
Les sections suivantes comparent les types de données openCypher avec les données Spanner Graph de données.
Type structurel
openCypher | Spanner Graph |
---|---|
Nœud | Nœud |
Edge | Edge |
Chemin d'accès | Non compatible |
Type de propriété
openCypher | Spanner Graph |
---|---|
INT |
INT64 |
FLOAT |
FLOAT64 |
STRING |
STRING |
BOOLEAN |
BOOL |
LIST Liste homogène de types simples. Par exemple, "Liste de INT ", "Liste de STRING ".Vous ne pouvez pas mélanger les valeurs INT et STRING dans une même liste. |
ARRAY |
Type composite
openCypher | Spanner Graph |
---|---|
LIST |
ARRAY ou JSON |
MAP |
STRUCT ou JSON |
Spanner Graph n'est pas compatible avec les listes hétérogènes de différents types ou des mappages d'une liste de clés dynamiques et de types de valeurs d'éléments hétérogènes. Utilisez le format JSON pour ces cas d'utilisation.
Coercition de type
openCypher | Spanner Graph |
---|---|
INT -> FLOAT |
Compatible |
Pour en savoir plus sur les règles de conversion de type, consultez Règles de conversion dans GoogleSQL
Fonctions et expressions
En plus des fonctions et expressions de graphique, Spanner Graph est également compatible avec toutes les fonctions et expressions intégrées de GoogleSQL.
Pour obtenir la liste complète des fonctions et des expressions, consultez Fonctions, opérateurs et conditions GoogleSQL.
Cette section répertorie les fonctions et expressions openCypher, ainsi que leurs dans Spanner Graph.
Fonctions et expressions de type structurel
Type | Fonction ou expression openCypher |
Graphique Spanner fonction ou expression |
|
---|---|---|---|
Nœud et Edge |
exists(n.prop) |
PROPERTY_EXISTS(n, prop) |
|
id (renvoie un entier) |
Non compatible | ||
properties |
TO_JSON |
||
keys (noms des types de propriété, mais pas des valeurs de propriété) |
PROPERTY_NAMES |
||
labels |
LABELS |
||
Edge | endNode |
Non compatible | |
startNode |
Non compatible | ||
type |
LABELS |
||
Chemin d'accès | length |
Non compatible | |
nodes |
Non compatible. | ||
relationships |
Non compatible | ||
Nœud et périphérie | .
|
. |
|
[]
|
Non compatible | ||
Modèle en tant qu'expression | size(pattern) |
Non compatible Utilisez une sous-requête comme suit :
|
Fonctions et expressions de type de propriété
Type | Fonction ou expression openCypher |
Graphique Spanner fonction ou expression |
|
---|---|---|---|
Scalaire | coalesce |
COALESCE |
|
head |
ARRAY_FIRST |
||
last |
ARRAY_LAST |
||
size(list) |
ARRAY_LENGTH |
||
size(string) |
LENGTH |
||
timestamp |
UNIX_MILLIS(CURRENT_TIMESTAMP()) |
||
toBoolean /toFloat /toInteger |
CAST(expr AS type) |
||
Agréger | avg |
AVG |
|
collect |
ARRAY_AGG |
||
count
| COUNT |
||
max |
MAX |
||
min |
MIN |
||
percentileCont |
PERCENTILE_CONT |
||
percentileDisc |
PERCENTILE_DISC |
||
stDev |
STDDEV |
||
stDevP |
Non compatible | ||
sum |
SUM |
||
Liste | range |
GENERATE_ARRAY |
|
reverse |
ARRAY_REVERSE |
||
tail |
Spanner Graph n'est pas compatible avec tail .Utilisez plutôt ARRAY_SLICE et ARRAY_LENGTH . |
||
Mathématiques | abs |
ABS |
|
ceil |
CEIL |
||
floor |
FLOOR |
||
rand |
RAND |
||
round |
ROUND |
||
sign |
SIGN |
||
e |
EXP(1) |
||
exp |
EXP |
||
log |
LOG |
||
log10 |
LOG10 |
||
sqrt |
SQRT |
||
acos |
ACOS |
||
asin |
ASIN |
||
atan |
ATAN |
||
atan2 |
ATAN2 |
||
cos |
COS |
||
cot |
COT |
||
degrees |
r * 90 / ASIN(1) |
||
pi |
ACOS(-1) |
||
radians |
d * ASIN(1) / 90 |
||
sin |
SIN |
||
tan |
TAN |
||
Chaîne | left |
LEFT |
|
ltrim |
LTRIM |
||
replace |
REPLACE |
||
reverse |
REVERSE |
||
right |
RIGHT |
||
rtrim |
RTRIM |
||
split |
SPLIT |
||
substring |
SUBSTR |
||
tolower |
LOWER |
||
tostring |
CAST(expr AS STRING) |
||
toupper |
UPPER |
||
trim |
TRIM |
||
DISTINCT | DISTINCT |
DISTINCT |
|
Mathématiques | + |
+ |
|
- |
- |
||
* |
* |
||
/ |
/ |
||
% |
MOD |
||
^ |
POW |
||
Comparaison | = |
= |
|
<> |
<> |
||
< |
< |
||
> |
> |
||
<= |
<= |
||
>= |
>= |
||
IS [NOT] NULL |
IS [NOT] NULL |
||
Chaîne de comparaison
|
Graphique Spanner
n'est pas compatible avec
une chaîne de comparaison. Cela équivaut à
comparaisons avec AND . Exemple :
|
||
Booléen | AND |
AND |
|
OR |
OR |
||
XOR |
Graphique Spanner
n'est pas compatible avec XOR . Écrivez la requête avec <> .Exemple:
|
||
NOT |
NOT |
||
Chaîne | STARTS WITH |
STARTS_WITH |
|
ENDS WITH |
ENDS_WITH |
||
CONTAINS |
REGEXP_CONTAINS |
||
+ |
CONCAT |
||
Liste | + |
ARRAY_CONCAT |
|
IN |
ARRAY_INCLUDES |
||
[] |
[] |
Autres expressions
openCypher | Spanner Graph |
---|---|
Expression de casse | Compatible |
Existe sous-requête | Compatible |
Projection cartographique | Non compatible Les types STRUCT offrent des fonctionnalités similaires. |
Compréhension des listes | Non compatibleGENERATE_ARRAY et ARRAY_TRANSFORM couvrent la majorité des cas d'utilisation. |
Paramètre de requête
Les requêtes suivantes montrent la différence entre l'utilisation de paramètres dans openCypher et dans Spanner Graph.
openCypher | Spanner Graph | |
---|---|---|
Paramètre | MATCH (n:Person) WHERE n.id = $id RETURN n.name; |
GRAPH FinGraph MATCH (n:Person) WHERE n.id = @id RETURN n.name; |
Mutation
Spanner Graph utilise le LMD GoogleSQL pour modifier les tables de nœud et d'entrée périphérique. Pour en savoir plus, consultez Insérez, mettez à jour ou supprimez des données de graphique Spanner.
Créer un nœud et une arête
openCypher | Spanner Graph | |
---|---|---|
Créer des nœuds et des arêtes | CREATE (:Person {id: 100, name: 'John'}); CREATE (:Account {id: 1000, is_blocked: FALSE}); |
INSERT INTO Person (id, name) VALUES (100, "John"); |
Créer des nœuds et des arêtes avec les résultats de la requête |
MATCH (a:Account {id: 1}), (oa:Account) WHERE oa <> a CREATE (a)-[:Transfers {amount: 100, create_time: timestamp()}]->(oa); |
INSERT INTO AccountTransferAccount(id, to_id, create_time, amount) SELECT a.id, oa.id, CURRENT_TIMESTAMP(), 100 FROM GRAPH_TABLE( FinGraph MATCH (a:Account {id:1000}), (oa:Account) WHERE oa <> a ); |
Dans Spanner Graph, les libellés sont attribués de manière statique conformément à l'instruction LDD CREATE PROPERTY GRAPH
.
Mettre à jour le nœud et le périphérique
openCypher | Spanner Graph | |
---|---|---|
Modifier les propriétés | MATCH (p:Person {id: 100}) SET p.country = 'United States'; |
UPDATE Person AS p SET p.country = 'United States' WHERE p.id = 100; |
Pour mettre à jour les libellés des graphiques Spanner, consultez la section Créer, mettre à jour ou supprimer un schéma de graphique Spanner.
Fusionner un nœud et une arête
openCypher | Spanner Graph | |
---|---|---|
Insérer un nouvel élément ou mettre à jour des propriétés | MERGE (p:Person {id: 100, country: 'United States'}); |
INSERT OR UPDATE INTO Person (id, country) VALUES (100, 'United States'); |
Supprimer le nœud et le périphérique
Supprimer des arêtes revient à supprimer la table d'entrée.
openCypher | Spanner Graph | |
---|---|---|
Supprimer des nœuds et des arêtes | MATCH (p:Person {id:100}), (a:Account {id:1000}) DELETE (p)-[:Owns]->(a); |
DELETE PersonOwnAccount WHERE id = 100 AND account_id = 1000; |
La suppression de nœuds nécessite de gérer les arêtes pendantes potentielles. Lorsque DELETE CASCADE
est spécifié, DELETE
supprime les arêtes associées de
comme DETACH DELETE
dans openCypher. Pour en savoir plus, consultez la présentation du schéma Spanner.
openCypher | Spanner Graph | |
---|---|---|
Supprimer les nœuds et les arêtes associées | DETACH DELETE (:Account {id: 1000}); |
DELETE Account WHERE id = 1000; |
Renvoyer les résultats de mutation
openCypher | Spanner Graph | |
---|---|---|
Renvoyer les résultats après l'insertion ou la mise à jour | MATCH (p:Person {id: 100}) SET p.country = 'United States' RETURN p.id, p.name; |
UPDATE Person AS p SET p.country = 'United States' WHERE p.id = 100 THEN RETURN id, name; |
Renvoyer les résultats après la suppression | DELETE (p:Person {id: 100}) RETURN p.country; |
DELETE FROM Person WHERE id = 100 THEN RETURN country; |