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

时间:2016-09-15 07:19:17

标签: graph nodes arangodb directed-acyclic-graphs

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

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

DAG graph

我要做的是选择一个节点,找到所有未连接直接的所有其他节点到所选节点,仅在出站方向

例如:如果我选择“root step”,我的查询应该只返回“test step 3”,因为它是唯一一个没有直接连接到“root step”的。

然而,如果我选择“测试步骤2”,它应返回“测试步骤3”,而不是“测试步骤”,因为“测试步骤*与“测试步骤2”处于同一水平。

目前,我的工作方式如下:

我在每个“步骤”中存储它作为数组的父项列表。 (测试步骤有[“根步”]等)

我的查询如下(以测试步骤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 }

现在它返回一个空结果而不是预期结果(“测试步骤3”)。非常感谢任何帮助

2 个答案:

答案 0 :(得分:1)

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

首先,我在每个"步骤"中添加了两个字段。文件:

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

  • depth:根步骤等于0,但递增。当我向另一个步骤添加步骤时,如果结果大于实际存储的结果,则新步骤的深度等于(父+ 1)。

有了这个,我的查询如下:

情况:我想列出可以链接到的所有步骤"测试步骤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

成功返回"测试步骤3"

答案 1 :(得分:0)

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

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

这样你只能获得比一个边跳更长的路径,以及从2开始的顶点。