CALL exécute des opérations sur le résultat de chaque sous-requête, et non pas sur la totalité du résultat d'une commande de requête. Il enveloppe les commandes de requête et les opérations dans des accolades {}
, passe l'alias qui déclenche chaque sous-requête à l'aide d'une clause WITH et passe le résultat de chaque sous-requête à l'aide d'une clause RETURN.
Syntaxe :
CALL {
WITH <alias_In>
, <alias_In>
, ...
...
RETURN <expression>
as <alias_Out>
, <expression>
as <alias_Out>
, ...
}
Entrée :
- <alias_In> : L'alias qui déclenche la sous-requête
: La valeur de retour de la sous-requête - <alias_Out> : L'alias de la valeur de retour de la sous-requête, optionnel si
est un alias
Par exemple, sauter la première ligne de chaque résultat de sous-requête p :
find().nodes([1, 5]) as nodes
call {
with nodes
n(nodes).e()[:2].n() as p
skip 1
return p as path
}
return path
Exemple de graph : (à utiliser pour les exemples suivants)
Exécutez les UQLs ci-dessous un par un dans un graphset vide pour créer les données du graph :create().node_schema("country").node_schema("movie").node_schema("director").edge_schema("filmedIn").edge_schema("direct")
create().node_property(@*, "name")
insert().into(@country).nodes([{_id:"C001", _uuid:1, name:"France"}, {_id:"C002", _uuid:2, name:"USA"}])
insert().into(@movie).nodes([{_id:"M001", _uuid:3, name:"Léon"}, {_id:"M002", _uuid:4, name:"The Terminator"}, {_id:"M003", _uuid:5, name:"Avatar"}])
insert().into(@director).nodes([{_id:"D001", _uuid:6, name:"Luc Besson"}, {_id:"D002", _uuid:7, name:"James Cameron"}])
insert().into(@filmedIn).edges([{_uuid:1, _from_uuid:3, _to_uuid:1}, {_uuid:2, _from_uuid:4, _to_uuid:1}, {_uuid:3, _from_uuid:3, _to_uuid:2}, {_uuid:4, _from_uuid:4, _to_uuid:2}, {_uuid:5, _from_uuid:5, _to_uuid:2}])
insert().into(@direct).edges([{_uuid:6, _from_uuid:6, _to_uuid:3}, {_uuid:7, _from_uuid:7, _to_uuid:4}, {_uuid:8, _from_uuid:7, _to_uuid:5}])
Usage Commun
Exemple : Sans utiliser GROUP BY, trouver combien de films sont tournés dans chaque pays
find().nodes({@country}) as nodes
call {
with nodes
n(nodes).e().n({@movie} as n)
return count(n) as number
}
return table(nodes.name, number)
| nodes.name | number |
|------------|--------|
| France | 2 |
| USA | 3 |