ArangoDB:相关文档的遍历条件

问题描述

被这个问题困扰了好几天,试图做到这一点: 请参阅提供的图片。 黑色是起始顶点。试图获得:

1: OUTBOUND (from) 起始顶点的所有子部分

2:条件:子节点必须具有 INBOUND 边“types”,另一端是一个变量设置为“true”且类型为“type”的文档。

3:当类型为“part”的文档无法满足类型为“type”且属性为“true”的 INBOUND 文档的要求时,它会立即停止对该路径的扩展。

4:失败的文档也不包含在结果中。

5:应与任何深度兼容。

6:没有子查询(如果可能没有)。

Example of graph

解决方法

根据给定的信息,数据模型似乎有问题。为什么每个 partScrew 都有 truefalse 顶点而不是布尔边缘属性?有没有理由像这样建模?

使用这个数据模型,我看不出没有子查询怎么可能。可以使用 PRUNE 提前停止沿路径的遍历,但这不支持子查询。那只留下 FILTER 用于后过滤作为选项,但要小心,您需要检查路径上的所有顶点,而不仅仅是发射的顶点是否具有入站 false 类型。

不确定它是否在所有情况下都按预期工作,但这是我想出的结果和查询结果,对我来说看起来不错:

LET startScrew = FIRST(FOR doc IN screw LIMIT 1 RETURN doc) // Screw A
FOR v,e,p IN 1..2 OUTBOUND startScrew partScrew
  FILTER (
    FOR v_id IN SHIFT(p.vertices[*]._id) // ignore start vertex
      FOR v2 IN 1..1 INBOUND v_id types
      RETURN v2.value
  ) NONE == false
  RETURN {
    path: CONCAT_SEPARATOR(" -- ",p.vertices[*].value)
  }

Annotated graph

路径
螺丝 A -- D 部分
螺丝 A -- E 部分
螺丝 A -- E 部分 -- F 部分

转储测试数据:https://gist.github.com/Simran-B/6bd9b154d1d1e2e74638caceff42c44f