ArangoDB图遍历:基于属性跳过节点并推断间接连接
解决ArangoDB中跳过中间节点并推断间接边的问题
原查询仅过滤了遍历到的节点,无法从A→B→C这类含跳过节点的路径中推断出A→C的间接关系。要实现需求,需通过完整路径遍历捕获节点间的间接连接,再基于路径信息生成推断边,以下是调整后的方案:
调整后的AQL查询
LET startNodeId = 'A' // 起始节点ID LET maxDepth = 2 // 最大遍历深度 LET startNode = DOCUMENT('nodeCollectionName', startNodeId) // 遍历所有路径,获取完整的节点、边序列 LET allPaths = ( FOR p IN 1..maxDepth OUTBOUND startNode GRAPH 'graphName' // 仅保留终点节点无需跳过的路径 FILTER p.vertices[-1].ShouldSkip != true RETURN p ) // 处理路径,生成符合要求的推断边和目标节点 LET processedResults = ( FOR path IN allPaths LET pathNodes = path.vertices LET start = pathNodes[0] LET end = pathNodes[-1] // 检查路径中间节点是否全部需要跳过 LET hasNonSkippedMiddleNode = ( FOR node IN pathNodes[1..-2] FILTER node.ShouldSkip != true LIMIT 1 RETURN node ) // 仅保留中间节点全需跳过的路径,生成推断边 FILTER LENGTH(hasNonSkippedMiddleNode) == 0 RETURN { targetNode: end, inferredEdge: { _from: start._id, _to: end._id } } ) // 收集去重后的节点和边 LET resultNodes = UNIQUE(FLATTEN([startNode] + (FOR res IN processedResults RETURN res.targetNode))) LET resultEdges = UNIQUE(FOR res IN processedResults RETURN res.inferredEdge) RETURN { StartNode: startNode, Nodes: resultNodes, Edges: resultEdges }
关键逻辑说明
- 完整路径捕获:使用
FOR p IN ...遍历路径而非单个节点/边,p.vertices存储路径上的所有节点,p.edges存储对应边序列。 - 路径有效性过滤:
- 先过滤终点节点无需跳过的路径,确保最终返回的节点都是需要保留的。
- 检查路径中间的所有节点是否都标记为
ShouldSkip=true,确保这条路径是需要跳过中间节点的间接连接。
- 推断边生成:从符合条件的路径中,提取起始节点和终点节点的
_id,构造模拟直接连接的边结构(无需创建真实边)。 - 去重处理:通过
UNIQUE确保节点和边不会重复返回。
效果验证
针对A→B→C且B.ShouldSkip=true的场景,查询会:
- 返回节点列表
[A, C] - 返回推断边
{_from: 'nodeCollectionName/A', _to: 'nodeCollectionName/C'}
内容的提问来源于stack exchange,提问作者Shahar Shokrani
相关产品推荐
相关产品推荐

