WITH effectue des opérations fonctionnelles sur l'alias et passe le résultat aux instructions suivantes. Les alias hétérologues seront multipliés cartésiennement.
Syntaxe : WITH <expression>
as <alias>
, <expression>
as <alias>
, ...
Entrée :
<expression>
: Expression opérationnelle<alias>
: Alias du résultat opérationnel, optionnel
La dé-duplication d'un alias dans WITH affectera ses alias homologues.
Par exemple, la dé-duplication contre n2.color affecte son alias homologue pnodes(path) ; la multiplication cartésienne contre les alias hétérologues n1 et list affecte également color, l'alias homologue de list :
find().nodes() as n1 limit 2
n(3).e()[2].n(as n2) as path
with pnodes(path) as list, dedup(n2.color) as color
with n1, list
return n1, list, color
Exemple de graph : (à utiliser pour les exemples suivants)
Exécutez les UQL ci-dessous un par un dans un graphset vide pour créer des données de graph :create().node_schema("account").node_schema("movie").edge_schema("rate").edge_schema("wishlist")
create().node_property(@*, "name").node_property(@account, "age", int32).node_property(@movie, "year", int32).edge_property(@rate, "score", int32)
insert().into(@account).nodes([{_id:"S001", _uuid:1, name:"Pepe", age:24}, {_id:"S002", _uuid:2, name:"Lina", age:23}, {_id:"S003", _uuid:3, name:"Emma", age:26}])
insert().into(@movie).nodes([{_id:"M001", _uuid:4, name:"Léon", year:1994}, {_id:"M002", _uuid:5, name:"Avatar", year:2009}])
insert().into(@rate).edges([{_uuid:1, _from_uuid:1, _to_uuid:4, score:9}, {_uuid:2, _from_uuid:3, _to_uuid:5, score:8}])
insert().into(@wishlist).edges([{_uuid:3, _from_uuid:2, _to_uuid:4}, {_uuid:4, _from_uuid:3, _to_uuid:4}])
Opération Fonctionnelle
Exemple : Trouver tous les nodes de @account qui sont les plus jeunes, renvoyer leur name
find().nodes({@account}) as a
with min(a.age) as minAge
find().nodes({@account.age == minAge}) as b
return b.name
Lina
Analyse : La méthode consistant à trier tous les comptes par ordre croissant d'age et à ne renvoyer qu'un seul résultat pourrait manquer certaines réponses qui sont également les plus jeunes.
Produit Cartésien
Exemple : Associer les nodes de @account et @movie, trouver les 1-step paths @account-@movie, renvoyer null
pour ces paires qui n'ont aucun path
find().nodes({@account}) as a
find().nodes({@movie}) as b
with a, b
optional n(a).e().n(b) as p
return p{*}
Pepe --@rate--> Léon
null --null-- null
Lina --@wishlist--> Léon
null --null-- null
Emma --@wishlist--> Léon
Emma --@rate--> Avatar