概述
路径模板子句n().e()...n()
使用点边模板组装路径后进行路径查询,支持过滤路径中的点和边、剔除带环路的结果、限制查询的结果数量等。
语法
- 子句别名:支持,数据类型为PATH
- 支持前缀OPTIONAL:若无查询结果,子句返回一条点和边均null的一步路径,即null-[null]-null
- 参数:
参数 |
类型 | 规范 | 必须携带 | 描述 |
参数别名 |
---|---|---|---|---|---|
no_circle() |
/ | / | 否 | 剔除含有环路的路径;有关嬴图中环路的定义,可参考术语解释 | 不支持 |
limit() |
int | ≥-1 | 否 | 子句每次执行时返回的结果数量,-1 表示返回所有 |
不支持 |
示例
示例图集一
![](https://img.ultipa.cn/draw/draw_f8ef91a691c64099bc29dc89ec48b1af.jpg?v='')
在一个空图集中,依次运行以下各行语句创建示例图集:
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}])
使用单点、单边模板
本例查找单点路径,要求只包含@movie点,返回点的全部信息:
n({@movie}) as p
return p{*}
Léon
Avatar
The Terminator
本例查找4步路径,按顺序单独规定其中5个点和4条边的schema以及边的方向,返回路径中点和边的全部信息:
n({@movie}).re({@filmedIn}).n({@country})
.le({@filmedIn}).n({@movie})
.le({@direct}).n({@director})
.re({@direct}).n({@movie}) as p
return p{*}
Léon ----> France <---- The Terminator <---- James Cameron ----> Avatar
Léon ----> USA <---- The Terminator <---- James Cameron ----> Avatar
Léon ----> USA <---- Avatar <---- James Cameron ----> The Terminator
The Terminator ----> USA <---- Avatar <---- James Cameron ----> The Terminator
Avatar ----> USA <---- The Terminator <---- James Cameron ----> Avatar
使用多边模板
本例查找从电影Léon到电影Avatar的1~4步路径,返回路径中点和边的全部信息:
n({@movie.name == "Léon"}).e()[:4].n({@movie.name == "Avatar"}) as p
return p{*}
Léon ----> France <---- The Terminator ----> USA <---- Avatar
Léon ----> France <---- The Terminator <---- James Cameron ----> Avatar
Léon ----> USA <---- The Terminator <---- James Cameron ----> Avatar
Léon ----> USA <---- Avatar
使用多边多点模板
查找从电影Léon到电影Avatar的1~4步路径,要求中间不经过France这个国家点,返回路径中点和边的全部信息:
n({@movie.name == "Léon"}).e().nf({name != "France"})[:4].n({@movie.name == "Avatar"}) as p
return p{*}
Léon ----> USA <---- The Terminator <---- James Cameron ----> Avatar
Léon ----> USA <---- Avatar
无权重最短路径
本例查找从电影Léon到电影Avatar的4步内最短路径,返回路径中点和边的全部信息:
n({@movie.name == "Léon"}).e()[*:4].n({@movie.name == "Avatar"}) as p
return p{*}
Léon ----> USA <---- Avatar
表示最短路径的多边模板
e()[*:N]
或e().nf()[*:N]
必须是路径中的最后一个边模板。
闭环路径
本例查找4步路径,按顺序单独规定其中前4个点和4条边的schema以及边的方向,要求第5个点与第1个点一样(即路径形成闭环),返回路径中点和边的全部信息:
n({@movie} as a).re({@filmedIn}).n({@country})
.le({@filmedIn}).n({@movie})
.le({@direct}).n({@director})
.re({@direct}).n(a) as p
return p{*}
The Terminator ----> USA <---- Avatar <---- James Cameron ----> The Terminator
Avatar ----> USA <---- The Terminator <---- James Cameron ----> Avatar
剔除带有环路的路径
本例查找4步路径,按顺序单独规定其中5个点和4条边的schema以及边的方向,要求剔除带环路的路径,返回路径中点和边的全部信息:
n({@movie}).re({@filmedIn}).n({@country})
.le({@filmedIn}).n({@movie})
.le({@direct}).n({@director})
.re({@direct}).n({@movie}).no_circle() as p
return p{*}
Léon ----> France <---- The Terminator <---- James Cameron ----> Avatar
Léon ----> USA <---- The Terminator <---- James Cameron ----> Avatar
Léon ----> USA <---- Avatar <---- James Cameron ----> The Terminator
限制查询数量
本例查找2条4步路径,按顺序单独规定其中5个点和4条边的schema以及边的方向,返回路径中点和边的全部信息:
n({@movie}).re({@filmedIn}).n({@country})
.le({@filmedIn}).n({@movie})
.le({@direct}).n({@director})
.re({@direct}).n({@movie}).limit(2) as p
return p{*}
Léon ----> France <---- The Terminator <---- James Cameron ----> Avatar
Léon ----> USA <---- The Terminator <---- James Cameron ----> Avatar
使用前缀OPTIONAL
本例查找从导演Luc Besson到电影Avatar的2步路径,返回路径中点和边的全部信息,由于无结果,因此返回null:
optional n({@director.name == "Luc Besson"}).e()[2].n({@movie.name == "Avatar"}) as p
return p{*}
null --null-- null --null-- null
如果没有使用前缀OPTIONAL,查询无结果时无返回值。
示例图集二
![](https://img.ultipa.cn/draw/draw_8257c4dc021644c4bce1b09c9eeee012.jpg?v='')
在一个空图集中,依次运行以下各行语句创建示例图集:
create().node_schema("customer").node_schema("account").edge_schema("has").edge_schema("transfer")
create().edge_property(@transfer, "time", datetime)
insert().into(@customer).nodes([{_id:"C001", _uuid:1}])
insert().into(@account).nodes([{_id:"A001", _uuid:2}, {_id:"A002", _uuid:3}, {_id:"A003", _uuid:4}, {_id:"A004", _uuid:5}])
insert().into(@has).edges([{_uuid:1, _from_uuid:1, _to_uuid:2}, {_uuid:2, _from_uuid:1, _to_uuid:3}])
insert().into(@transfer).edges([{_uuid:3, _from_uuid:2, _to_uuid:4, time:"2023-03-01"}, {_uuid:4, _from_uuid:2, _to_uuid:5, time:"2023-04-25"}, {_uuid:5, _from_uuid:4, _to_uuid:5, time:"2023-03-27"}, {_uuid:6, _from_uuid:5, _to_uuid:3, time:"2023-02-15"}])
过滤0步
本例查找从客户C001的账户向外0~2步的转账路径,返回路径中点和边的全部信息:
n({_id == "C001"}).re({@has}).n({@account})
.re({@transfer})[0:2].n({@account}) as p
return p{*}
C001 ----> A001
C001 ----> A001 ----> A003
C001 ----> A001 ----> A003 ----> A004
C001 ----> A001 ----> A004
C001 ----> A001 ----> A004 ----> A002
C001 ----> A002
多边模板
e()[0:N]
或e().nf()[0:N]
中0步生效的条件为该模板前后两个单点模板n()
的过滤条件相同。此时0步相当于舍弃该多边模板,将其前后的单点视为一个点。
步间过滤
本例查找账户间的2步向外转账路径,要求转账边的time属性值递增,返回路径中点和边的全部信息:
n({@account}).re({@transfer.time > prev_e.time})[2].n({@account}) as p
return p{*}
A001 ----> A003 ----> A004
边属性@transfer.time需LTE。