You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OrientDB技术问询:如何按节点过滤边?查询仅返回单条路径问题

解决OrientDB中筛选终点为指定节点的多条路径问题

我来帮你梳理下问题所在,然后给出可行的解决方案~

原查询的问题分析

你当前的查询最后通过where @rid in (select @rid from Node where id in ['222'])进行过滤,这种方式只会保留遍历到终点节点(id=222)的那一条记录。因为TRAVERSE的结果集中,每个节点和边都会作为单独的行返回,只有终点节点的行满足@rid匹配条件,所以你只能拿到这一行对应的$path,而实际上多条到达222的路径并没有被全部筛选出来。

解决方案

这里提供两种更可靠的写法,都能帮你获取所有符合条件的路径:

方法1:改进TRAVERSE查询,直接判断路径终点

利用OrientDB中$path是数组的特性,$path[-1]代表路径的最后一个节点,我们可以直接在WHERE条件里判断这个节点的id是否为222,这样就能筛选出所有终点符合要求的路径:

SELECT DISTINCT $path AS path
FROM (
  TRAVERSE bothE(), bothV() 
  FROM (SELECT * FROM Node WHERE id = '111') 
  WHILE $depth <= 6
)
WHERE $path[-1].id = '222'
  • DISTINCT用来去除可能存在的重复路径(如果遍历过程中生成了相同路径的话)
  • $depth <=6保持你原有的深度限制

方法2:使用MATCH语句(更推荐,路径查询更直观)

OrientDB的MATCH语法专门针对路径查询设计,语法更清晰,也更容易维护:

MATCH
  {class: Node, where: id = '111'} AS start,
  {as: path, from: start, while: $depth <= 6, bothE(), bothV()}*,
  {class: Node, where: id = '222'} AS end
RETURN path AS full_path

或者更简洁的链式写法:

MATCH
  {class: Node, where: id = '111'} ->(bothE(), bothV())*{depth <= 6} -> {class: Node, where: id = '222'}
RETURN $paths AS all_paths

MATCH会自动收集所有从起点(id=111)到终点(id=222)、深度不超过6的路径,无需额外的过滤逻辑,结果更准确。

内容的提问来源于stack exchange,提问作者Mioying-luffy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:37:26