问题描述
我对 arangodb 比较陌生,因此以下问题可能非常容易回答,但我还无法从文档中挖掘出解决方案。
我有什么:
1.问题: 我已经对通过边 (isChildOf) 链接的项目(节点)的父子层次结构建模。单个分支的深度是不平衡的,可以从 1.1 到 1.1.1 和 1.1.1.1 达到 1。每个层次结构都有一个根节点。现在我想找出给定的孩子,例如一个是 1.1.1.1 它离根节点 1 的边有多少条。因此,我不想将边数设置为查询过滤器参数,而是反其道而行之,并计算来自例如的“跳数”数1 至 1.1.1.1 或 1.1.1.1 至 1.1.1.1.5.2。我怎样才能在 AQL 中实现这一点?
2.问题: 我仍在寻找有关如何检索先前定义的层次结构的最低节点(不是子节点的父节点的节点)的方法。例如。如果层次结构在 1.1.1.1 和 1.1.1.2.1 结束,我如何在 AQL 单个查询中检索所有这些最低节点?
解决方法
有几种方法可以实现这一点,具体取决于您想要返回的内容(或查询的嵌套方式),但无论哪种方式,SHORTEST_PATH
或 K_SHORTEST_PATHS
都将成为您的朋友。下面是一个例子:
FOR v,e IN INBOUND SHORTEST_PATH start_node to root_node
GRAPH 'named_graph'
RETURN e
参考 SHORTEST_PATH 文档,我们可以开始分解。
- 我们正在寻找从“开始”节点到“结束”节点的路径(按跳数或“权重”计算的最短路径)。
- 使用
INBOUND
或OUTBOUND
将取决于您的图形/数据模型的构建方式。 -
v,e
变量表示沿路径找到的“顶点”和“边”(分别为v
和e
)。
然后可以使用此查询模式来计算顶点或边的数量,如下所示:
FOR start_node in child_collection
FOR root_node IN root_collection
LET edges = (
FOR v,e IN INBOUND SHORTEST_PATH start_node to root_node
GRAPH 'named_graph'
RETURN e._id
)
RETURN {
root: root_node._id,child: start_node._id,pathLen: LENGTH(paths)
}
这可能有点基础(可能有优化方法),但它展示了如何使用变量来保存子查询,使用这些结果来计算路径长度。
或者,您可以使用 K_SHORTEST_PATHS 为您进行计算。例如,之前的查询可以简化为:
FOR p IN INBOUND K_SHORTEST_PATHS start_node to root_node
GRAPH 'named_graph'
OPTIONS { weightAttribute: 'weight' }
LIMIT 1
RETURN p
找到两点之间的第一条最短路径。在这里,我们使用 LIMIT 1
来确保我们只返回一个路径。结果将类似于:
[
{
edges: [ ... ],vertices: [ ... ],weight: <number>
}
]
或者您可以自定义退货以更好地满足您的需求。不要返回您不需要或不会使用的数据。