表达式
表达式是由 操作符 和 操作数 按照语法要求组成的运算式,每个表达式都有一个 值。表达式可以出现在过滤器中,也可以出现在子句中。
-
表达式的操作符:条件判断符、逻辑运算符、数值运算符(操作符列表及运算优先级见下一节《操作符|优先级》)
-
表达式的操作数:常量、别名、函数值、当前schema、当前属性值
操作数类型 | 操作数举例 | (过滤器中)表达式举例 |
---|---|---|
常量 | 1,"abc", "2020-01-01 0:0:0" | {1+3*2} |
别名 | nodes,edges,paths | {nodes.level},{edges.amount < 2000} |
函数值 | now(),count(nodes),year("2022-04-12") | {year(edges.time) > 2020} |
当前 schema | this.@ | {@ == "card"},{@product} |
当前属性值 | this._id,this.name | {level != 2} |
(上表中 nodes、edges、paths 分别为点、边、路径的别名;当前点、边的别名 this 通常可以省略)
过滤器
如上面表格中的举例所示,Ultipa 过滤器具有以下特征:
- 是一个用花括号
{ }
包裹起来的表达式 - 其操作数中通常(但不一定)含有当前点、边的 schema 或属性值
- 最后一个被执行的操作符通常(但不一定)为条件判断符或逻辑运算符
过滤器能判断当前点、边是否满足要求,其表达式的值为 boolean 类型(真或假),当需要从非 boolean 值转为 boolean 时:
非 boolean 类型 | 何时转为真 | 何时转为假 |
---|---|---|
数值 | 非 0 | 0 |
string,text,datetime | 首个字符非 0 | 首个字符为 0 |
timestamp | 不为 "1970-01-01 08:00:00 +08:00" 的时间 | "1970-01-01 08:00:00 +08:00" 或与之相等的时间 |
示例:查找余额不为 0 的 10 个银行卡
find().nodes({@card.balance}) as n
limit 10
return n{*}
Ultipa 的所有查询操作均使用过滤器对点、边进行筛选,过滤器有三种应用场景:
应用场景 |
说明 |
举例 |
---|---|---|
常规过滤 | 在任意查询中,使用常量、或在该查询语句之前定义的别名对当前点、边进行过滤 | {time > "2022-02-24 07:00:00"} |
步间过滤 | 在模板查询中,使用位于当前点、边之前(左侧)的点、边对当前点、边进行过滤(见《查询》-《路径与子图模板》-《路径模板》- 步间过滤、《查询》-《路径与子图模板》-《路径模板》- 环路查询) | {time > prev_e.time},{_uuid == a._uuid} |
全文过滤 | 在任意查询中,使用关键词对当前点、边的某个属性进行全文过滤(见《条件判断符》-《全文包含》、《索引 | 全文 | LTE》-《全文索引》) | {~content contains "graph ultra* database"} |
(上表中 time 为属性名,a 为同一个路径模板中更早定义的元数据的别名,content 为某属性的全文索引名)