Vue d'ensemble
En UQL, un filtre est utilisé pour définir des conditions de récupération de nodes et edges en fonction de leurs schemas et properties.
Les filtres sont mis en œuvre dans certaines méthodes qui représentent des nodes ou edges dans les clauses de requête. Par exemple, les méthodes nodes()
et edges()
.
Syntaxe
Un filtre est une expression enfermée entre accolades { }
. Typiquement, il implique des références aux schemas et properties des nodes et edges.
Exemple : Trouver les nodes @user
, et les nodes @movie
dont les valeurs de la property rating
sont supérieures à 3.
find().nodes({@user || @movie.rating > 3}) as n
return n{*}
Un filtre évalue soit une valeur booléenne soit un null. Il détermine la validité d'un node ou edge en renvoyant true lorsque la condition du filtre est remplie.
Dans les cas où l'expression du filtre ne produit pas une valeur booléenne ou null, le résultat est converti en true ou false en fonction de son type et de sa valeur :
Type | Convertir en true | Convertir en false |
---|---|---|
int32,uint32,int64,uint64,float,double | Lorsqu'il n'est pas égal à 0 | Lorsqu'il est égal à 0 |
string,text | Lorsque le premier caractère n'est pas '0' | Lorsque le premier caractère est '0' |
datetime | Lorsqu'il n'est pas '0000-00-00 00:00:00' | Lorsqu'il est '0000-00-00 00:00:00' |
timestamp | Lorsqu'il n'est pas '1970-01-01 08:00:00 +08:00' (ou équivalent) | Lorsqu'il est '1970-01-01 08:00:00 +08:00' (ou équivalent) |
point | Jamais | Toute valeur |
list | Jamais | Toute valeur |
Exemple : Trouver les nodes @user
dont les valeurs de la property age
, lorsque soustraites par 33, résultent en des valeurs non nulles.
find().nodes({@user.age - 33}) as n
return n{*}
Exemples
Filtre Général
Dans toute clause de requête, vous pouvez filtrer les nodes et edges en comparant leurs schemas et properties avec des valeurs constantes et/ou des alias.
find().nodes({@user.registeredOn >= "2021-09-01 09:00:00"}) as u1
with max(u1.age) as maxAge
find().nodes({@user.age == maxAge}) as u2
return u2
n(as start).e()[3].n({level == start.level}) as p
return p
Remarque : Le second modèle de node n()
appelle l'alias défini dans le premier modèle de node.
En général, les properties référencées dans le filtre peuvent être utilisées directement sans aucun indexage. Cependant, différents types d'indexage doivent être envisagés pour accélérer le processus de requête. Veuillez vous référer à Acceleration pour plus d'informations.
Filtre Inter-Étapes
Dans une clause de requête basée sur un modèle, vous pouvez employer les alias système prev_n et prev_e pour faciliter le filtrage inter-étapes.
n({@card}).e({@transfersTo.time > prev_e.time})[3].n({@card}) as p
return p
Les properties référencées par
prev_n
etprev_e
(telles que la property time dans l'exemple) doivent être LTE-ées pour l'accélération.
Les méthodes path_ascend()
et path_descend()
dans certaines commandes de requête path comme ab()
servent au même objectif de comparaison inter-étapes, et elles nécessitent également que la property sujet soit LTE-é. Cependant, l'entrée de ces méthodes ne prend pas la forme d'un filtre.
ab().src({_id == "A"}).dest({_id == "E"}).depth(:3).path_ascend(@default.weight) as p
return p{*}
Filtre Texte Intégral
Dans toute clause de requête, les nodes et edges peuvent être filtrés en utilisant un index texte intégral créé.
find().nodes({~content CONTAINS "graph computing parallel"}) as n
return n{*}