为清晰起见,步骤名称用作标识符
我有以下有向无环图(DAG):
我要做的是选择一个节点,找到所有未连接直接的所有其他节点到所选节点,仅在出站方向
例如:如果我选择“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”)。非常感谢任何帮助
答案 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开始的顶点。