ArangoDB:如何获取路径中指定集合的最后一个顶点?
问题与解决方案:获取车辆中所有收音机资产
问题描述
我有包含assets(资产)和assetTypes(资产类型)的文档集合,以及构建以下关系的边集合:
- 资产类型层级:dmr-radio is_a radio is_a asset
- 资产包含关系层级:车辆 contains 收音机
- 资产与资产类型的关联:车辆 is_a vehicle,收音机 is_a dmr-radio
我想要查找指定车辆中的所有收音机资产,尝试用K_PATHS图查询获取属于收音机类型的资产,但无法只返回assets集合中的最后一个顶点(即收音机资产)。当前查询语句:
FOR path IN 1..100 OUTBOUND K_PATHS 'assets/493761' TO 'assetTypes/radio' GRAPH assetRelationships RETURN path
请问是否有方法获取路径中指定集合的最后顶点,以及更优的查询方式?
解决方案
方法1:直接提取路径中符合条件的最后顶点
你可以在返回阶段过滤路径的终点集合,只保留assets类型的顶点。修改查询如下:
FOR path IN 1..100 OUTBOUND K_PATHS 'assets/493761' TO 'assetTypes/radio' GRAPH assetRelationships FILTER path.vertices[-1]._collection == 'assets' RETURN path.vertices[-1]
这里用path.vertices[-1]获取路径的最后一个顶点,再通过FILTER判断它是否属于assets集合,最终只返回符合要求的收音机资产。
方法2:拆分两步查询(更高效直观)
K_PATHS适合复杂多路径场景,但如果你的关系逻辑固定,拆分两步查询会更清晰,性能也更可控:
- 先找出指定车辆通过
contains边关联的所有子资产 - 再过滤这些子资产中,类型层级最终指向
radio的资产
查询示例:
// 第一步:获取车辆包含的所有子资产 FOR asset IN 1..100 OUTBOUND 'assets/493761' contains GRAPH assetRelationships // 第二步:检查该资产的类型是否属于radio层级 FOR typePath IN 1..100 OUTBOUND asset._id is_a GRAPH assetRelationships FILTER typePath.vertices[-1]._id == 'assetTypes/radio' RETURN asset
方法3:用TRAVERSAL实现精准遍历
如果需要自定义遍历规则,可以用TRAVERSAL语句,直接指定要关注的顶点集合和边类型:
FOR v, e, p IN TRAVERSAL 'assets/493761' OUTBOUND GRAPH assetRelationships OPTIONS { order: "breadthfirst", edgeRestriction: { contains: {}, is_a: {} }, vertexRestriction: { assets: {}, assetTypes: {} } } // 过滤条件:当前顶点属于assets集合,且能关联到radio类型 FILTER v._collection == 'assets' && EXISTS( FOR type IN 1..100 OUTBOUND v._id is_a GRAPH assetRelationships FILTER type._id == 'assetTypes/radio' LIMIT 1 RETURN 1 ) RETURN v
内容的提问来源于stack exchange,提问作者bytesnz
相关产品推荐
相关产品推荐

