通过“包含”给出图表我有以下内容:
使用:
FOR v,e,p IN 1..50 INBOUND 'pmconfig/899018092734' pm_content RETURN p.vertices
我得到以下路径:
我想过滤出中间点,所以我得到了:
如果LibX元素是叶子,我可以添加像
这样的过滤器FILTER LENGTH(EDGES(pm_content,v._id,'inbound'))==0
但假设我有一条路径:A-> B-> C-> D-> B
在这种情况下,我会过滤掉所有内容。我想拥有的是什么 A-> B-> C-> D,因为步行应该在识别循环时停止。
如何构建一个删除中间点的过滤器?具体来说,只有以叶节点或所有内容链接结尾的那些指向已遍历的顶点。
答案 0 :(得分:1)
过滤"未完成的路径"我们需要预测遍历者是否能够沿着图表继续前进。
找出的唯一方法是尝试 - 所以我们在子查询中添加源自当前顶点(v
)的第二个遍历,最多只需要一步。
子查询将返回两个可能的结果:如果有更多节点,则[1]
,如果没有,则返回[]
。我们可以使用LENGTH()
函数对此进行测试。
然后我们将使用此信息从结果中过滤未完成的路径:
FOR v,e,p IN 1..50 INBOUND 'pmconfig/899018092734' pm_content
LET next = (FOR x IN 1 INBOUND v pm_content LIMIT 1 RETURN 1)
FILTER LENGTH(next) == 0
RETURN p.vertices
让我们尝试在Traversal Graph上测试一下;我们将方向更改为OUTBOUND
,因为我们可以轻松获得更多结果。我们将输出限制为仅提供_key
,因此我们可以毫无问题地重新验证结果。
var examples = require("org/arangodb/graph-examples/example-graph.js");
var graph = examples.loadGraph("traversalGraph");
db._query(`
FOR v,e,p IN 1..50 OUTBOUND 'circles/A' GRAPH 'traversalGraph'
LET next = (FOR x IN 1 OUTBOUND v GRAPH 'traversalGraph' LIMIT 1 RETURN 1)
FILTER LENGTH(next) == 0
RETURN p.vertices[*]._key
`).toArray()
[
[ "A", "B", "C", "D" ],
[ "A", "B", "E", "F" ],
[ "A", "G", "H", "I" ],
[ "A", "G", "J", "K" ]
]
正如我们所看到的,我们只获得了到端点的路径 - 正如预期的那样。