ArangoDB AQL:我可以从多个起始点遍历一个图,但确保所有遍历的顶点都是唯一的吗?
我有一个包含大量相对较小的不相交图的图数据集。我需要从一组匹配特定搜索条件的顶点中找到所有可到达的顶点。我使用以下查询:ArangoDB AQL:我可以从多个起始点遍历一个图,但确保所有遍历的顶点都是唯一的吗?,arangodb,aql,arangojs,Arangodb,Aql,Arangojs,我有一个包含大量相对较小的不相交图的图数据集。我需要从一组匹配特定搜索条件的顶点中找到所有可到达的顶点。我使用以下查询: FOR startnode IN nodes FILTER startnode._key IN [...set of values...] FOR node IN 0..100000 OUTBOUND startnode edges COLLECT k = node._key RETURN k 查询速度非常慢,即使它返回正确的
FOR startnode IN nodes
FILTER startnode._key IN [...set of values...]
FOR node IN 0..100000 OUTBOUND startnode edges
COLLECT k = node._key
RETURN k
查询速度非常慢,即使它返回正确的结果。这是因为Arango实际上多次遍历相同的子图。例如,假设有以下子图:
a -> b -> c -> d -> e
当过滤条件选择顶点a和c时,Arango将从a和c开始进行两次独立的遍历。它在这两次遍历期间访问顶点d和e,这会浪费时间。添加唯一顶点选项没有帮助,因为在不同的遍历中不会检查顶点唯一性
为了确认对性能的影响,我创建了一个额外的根文档,并添加了从它到我的筛选器找到的所有文档的链接:
FOR startnode IN nodes
FILTER startnode._key IN [...set of values...]
INSERT { _from: 'fakeVertices/0', _to: startnode._id } IN fakeEdges
现在,以下查询的运行速度比原始查询快4倍,同时生成相同的结果:
FOR node IN 1..1000000 OUTBOUND 'fakeVertices/0' edges, fakeEdges
OPTIONS { uniqueVertices: 'global', bfs: true }
COLLECT k = node._key
RETURN k
不幸的是,我无法为所有查询创建假顶点/边,因为创建它需要更多的时间
我的问题是:Arango是否提供了一种方法来确保给定查询中所有遍历中访问的顶点的唯一性?如果没有,是否有更好的方法来解决上述问题?据我所知,这就是
uniqueVertices
选项的作用,但是对于for…
语句的每次迭代,它都会认为对于从开始节点进行的遍历,顶点是唯一的。它不知道在FOR…
语句中的其他节点上发生的其他遍历。似乎每次都要遍历许多顶点,这是从每个新的开始节点开始的
只是把它扔到墙上看看它是否粘在一起,但是把这两个查询组合起来,在原来的查询中添加OPTIONS
节点中startnode的
筛选开始节点。\u输入[…值集…]
对于0..100000出站startnode边中的节点
选项{uniqueVertices:'global',bfs:true}
收集k=节点。\u键
返回k
另外,我强烈建议使用一个而不是指定边集合。它不仅更加灵活,还允许您使用最短路径计算,这可能会有所帮助