ArangoDB - 如何查找与特定节点无关的节点?

ArangoDB - How to find nodes not related to a specific one?

为清楚起见,步骤名称用作标识符

我有以下有向无环图 (DAG):

我想做的是 select 一个节点,然后找到所有其他未 直接 连接到 selected 的节点一个,仅在 出站 方向。

例如:如果我 select "root step",我的查询应该只有 return "test step 3",因为它是唯一没有直接连接到 "root step" ].

但是,如果我select"test step 2",应该return"test step 3",而不是 "test step",因为“测试步骤* 与 "test step 2" 处于同一级别。

现在,我是这样做的:

我在每个 "step" 中存储它作为数组的 parents 列表。 (测试步骤有["root step"],等等)

我的查询如下(以测试步骤2为例):

FOR v, e IN 0..10 OUTBOUND "steps/test step 2" steps_relations
    FILTER e._from != "steps/test step 2"
    FILTER e._to != "steps/test step 2"
    FILTER v._id != "steps/test step 2"
    FILTER ["root step"] NONE IN v.parents
RETURN {id: v._key, name: v.name }

现在 return 是一个空结果,而不是预期的结果 ("test step 3")。非常感谢任何帮助

我终于设法解决了这个问题。这是我的做法:

首先,我在每个 "steps" 文档中添加了两个字段:

  • root:当它是树的根时等于true(如"root step")。否则它只是引用根步骤的内部 ID

  • 深度:对于根步骤等于 0,但会递增。当我将一个步骤添加到另一个步骤时,只有当结果大于实际存储的结果时,新步骤的深度才等于 (parent + 1)。

有了这个之后,我的查询如下所示:

情况:我想列出所有可以链接的步骤"test step 2"

FOR step, relation IN 0..10 ANY "steps/root step" steps_relations
    FILTER step.depth > 1 /* THE DEPTH OF test step 2 WICH IS 1 */
    FILTER relation._from != "steps/test step 2" 
RETURN item

这returns成功"test step 3"

您应该使用 the min attribute 来抑制直接连接的边:

FOR v, e IN 2..10 OUTBOUND "steps/test step 2" steps_relations
  RETURN {id: v._key, name: v.name }

这样你只会得到长于一个边跳的路径,以及从 2 开始的顶点。