[英]Efficient path traversal using AQL on a large bipartite graph in ArangoDB
我有一个使用两个集合和一个边缘列表存储在ArangoDB中的大型二部图(300M +节点)。 我正在尝试使用AQL进行有效遍历,该AQL从具有特定标签的一种类型的节点开始,以查找具有相同标签的相同类型的所有其他连接节点。 遍历的结果可能会发现2到15万个节点之间的任何地方,尽管平均而言大约是10到20个节点。 重要的是,a)我指定一个较大的默认最大遍历深度(即0..50)以确保找到所有内容,但是b)AQL修剪路径,以便在大多数情况下它永远不会达到该最大深度。
我有一个查询,可以得到正确的结果,但是它似乎没有修剪路径,因为即使增加了最大深度,它也会变慢,即使结果没有变化。
这是缩影的问题( 图片在这里 ):
var cir = db._create("circles");
var dia = db._create("diamonds");
var owns = db._createEdgeCollection("owns");
var A = cir.save({_key: "A", color:'blue'});
var B = cir.save({_key: "B", color:'blue'});
var C = cir.save({_key: "C", color:'blue'});
var D = cir.save({_key: "D", color:'yellow'});
var E = cir.save({_key: "E", color:'yellow'});
var F = cir.save({_key: "F", color:'yellow'});
var G = cir.save({_key: "G", color:'red'});
var H = cir.save({_key: "H", color:'red'});
var d1 = dia.save({_key: "1"})_id;
var d2 = dia.save({_key: "2"})_id;
var d3 = dia.save({_key: "3"})_id;
var d4 = dia.save({_key: "4"})_id;
var d5 = dia.save({_key: "5"})_id;
var d6 = dia.save({_key: "6"})_id;
owns.save(A, d2, {});
owns.save(A, d5, {});
owns.save(A, d4, {});
owns.save(B, d4, {});
owns.save(C, d5, {});
owns.save(C, d6, {});
owns.save(D, d1, {});
owns.save(D, d2, {});
owns.save(E, d1, {});
owns.save(E, d3, {});
owns.save(F, d3, {});
owns.save(F, d4, {});
owns.save(G, d6, {});
owns.save(H, d6, {});
owns.save(H, d2, {});
从Node circle/A
开始,我想找到所有连接的顶点,只有在遇到非blue
的圆时才停止。
以下AQL可以满足我的要求:
FOR v, e, p IN 0..5 ANY "circles/A" owns
FILTER p.vertices[* filter has(CURRENT, 'color')].color ALL == 'blue'
return v._id
但是FILTER子句不会引起任何修剪。 至少如上所述,在我拥有的大型数据库中,增加最大深度会使它非常缓慢,而不会更改结果。
那么,如何确保路径过滤导致算法修剪路径呢? 该文档对此有点薄。 我只能找到使用确切路径长度的示例(例如p.vertices[1]
)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.