概述
使用语句subgraph([<path_template1>, <path_template2>, ...])
可以描述并搜索由多个路径模板组成的子图。这些路径模板通常有相交的点或边,通过重复使用别名在子图中共享元素。
语法
- 语句别名: N/A
- 不支持为子图中的路径模板声明别名,但可以在单点模板
n()
和单边模板e()
中声明别名。
subgraph([
<path_template1>,
<path_template2>,
...
])
示例图集
在一个空图集中,逐行运行以下语句,创建示例图集:
create().node_schema("user").node_schema("card").edge_schema("owns").edge_schema("transfers")
insert().into(@user).nodes([{_id:"user1"}, {_id:"user2"}, {_id:"user3"}, {_id:"user4"}, {_id:"user5"}])
insert().into(@card).nodes([{_id:"card14"}, {_id:"card22"}, {_id:"card37"}, {_id:"card45"}, {_id:"card63"}, {_id:"card65"}])
insert().into(@owns).edges([{_from:"user1", _to:"card45"}, {_from:"user2", _to:"card65"}, {_from:"user3", _to:"card37"}, {_from:"user4", _to:"card14"}, {_from:"user4", _to:"card22"}, {_from:"user5", _to:"card63"}])
insert().into(@transfers).edges([{_from:"card45", _to:"card14"}, {_from:"card65", _to:"card14"}, {_from:"card63", _to:"card14"}, {_from:"card65", _to:"card37"}, {_from:"card22", _to:"card65"}, {_from:"card37", _to:"card22"}, {_from:"card22", _to:"card37"}, {_from:"card22", _to:"card14"}])
单个共享元素
查找接收过user1
和user2
直接转账的用户:
subgraph([
n({_id == "user1"}).e().n({@card}).re({@transfers}).n({@card} as c).e().n({@user} as u),
n({_id == "user2"}).e().n({@card}).re({@transfers}).n(c)
])
return u._id
结果:
u._id |
---|
user4 |
多个共享元素
查找不同账户间的3步单向交易环路,并返回账户所有者信息:
subgraph([
n({@user} as u1).e().n({@card} as c1),
n({@user && _id > u1._id} as u2).e().n({@card} as c2),
n({@user && _id > u2._id} as u3).e().n({@card} as c3),
n(c1).re().n(c2).re().n(c3).re().n(c1)
])
return table(u1._id, u2._id, u3._id)
结果:
u1._id | u2._id | u3._id |
---|---|---|
user2 | user3 | user4 |
查找两张卡片,要求都向card14
和card37
发送过交易请求,并且两张卡片之间存在直接交易。
subgraph([
n({@card} as c1).e().n({@card} as c2),
n(c1 as c11).re().n({_id == "card14"}).le().n(c2 as c22),
n(c11).re().n({_id == "card37"}).le().n(c22)
])
where c1._id > c2._id
return table(c11._id, c22._id)
结果:
c11._id | c22._id |
---|---|
card65 | card22 |
如需在subgraph()
中的不同路径模板里多次引用一个别名,则必须在每次引用后重命名该别名,以保持其作用域。这能确保该别名在多个模板中可用,避免了潜在冲突或超出作用域的报错。