繁体   English   中英

在ArangoDB中的大型二部图上使用AQL进行有效的路径遍历

[英]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] )。

据我所知,优化器目前只有一种模式可以识别修剪路径而不是后过滤,这是结合ALL运算符对路径变量进行的简单过滤。

您添加的嵌入式过滤器可能会阻止应用此优化。 我不明白您为什么首先添加它。 没有color属性的顶点的隐含值null ,它不等于'blue' ,因此是不必要的。

该查询是否产生相同的结果,但是随着遍历深度的增加而更快?

FOR v, e, p IN 0..5 ANY "circles/A" owns 
    FILTER p.vertices[*].color ALL == 'blue'
    return v._id

有一个开放功能请求要求提供一种明确的修剪路径的方法。 随时添加您的用例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM