Arangodb AQL查询非常慢(约20秒)

Arangodb AQL查询非常慢(约20秒),arangodb,aql,Arangodb,Aql,执行以下查询大约需要20秒: FOR p IN PATHS(locations, connections, "outbound", { maxLength: 1 }) FILTER p.source._key == "26094" RETURN p.vertices[*].name 我相信这是一个简单的查询,数据库并没有那么大,它应该执行得相当快。。。我一定是做错了什么。。。以下是查询结果: ==> [object ArangoQueryCursor - count: 286, hasM

执行以下查询大约需要20秒:

FOR p IN PATHS(locations, connections, "outbound", { maxLength: 1 }) FILTER p.source._key == "26094" RETURN p.vertices[*].name
我相信这是一个简单的查询,数据库并没有那么大,它应该执行得相当快。。。我一定是做错了什么。。。以下是查询结果:

==> [object ArangoQueryCursor - count: 286, hasMore: false]
“位置顶点”集合有23753个文档,“连接边”集合有123414个文档

我也尝试过按_id进行过滤,但性能有些相同

我能做些什么来获得更好的表现吗

以下是查询的。解释报告:

路径将构建图形的所有路径,然后使用_key属性上的过滤器对结果进行后期过滤。这可能会首先为所有路径创建一个巨大的结果集,然后过滤掉所有不匹配的路径

如果只需要在深度1上找到连接的顶点,我认为这样做会更有效:

使用遍历进行查询:

这更有效,因为它将构建图形中的所有路径,但仅构建从指定起始顶点开始的路径:

FOR p IN TRAVERSAL(locations, connections, "1", "outbound", { minDepth: 1, maxDepth: 1, paths: true }) 
  RETURN p.path.vertices[*].name
使用邻居查询直接邻居:

这可能会稍微更有效,因为它将构造更小的中间结果。 此外,它不会返回起始顶点26094,而是直接连接到它的所有顶点:

FOR p IN NEIGHBORS(locations, connections, "26094", "outbound") 
  RETURN p.vertex.name
FOR edge IN connections
  FILTER edge._from == "locations/26094"
  FOR vertex IN locations
    FILTER vertex._id == edge._to
    RETURN vertex.name
不使用图函数直接查询边

最后,您可以直接查询边缘集合。 同样,这不会返回起始顶点26094,而是返回直接连接到它的所有顶点:

FOR p IN NEIGHBORS(locations, connections, "26094", "outbound") 
  RETURN p.vertex.name
FOR edge IN connections
  FILTER edge._from == "locations/26094"
  FOR vertex IN locations
    FILTER vertex._id == edge._to
    RETURN vertex.name
路径将构建图形的所有路径,然后使用_key属性上的过滤器对结果进行后期过滤。这可能会首先为所有路径创建一个巨大的结果集,然后过滤掉所有不匹配的路径

如果只需要在深度1上找到连接的顶点,我认为这样做会更有效:

使用遍历进行查询:

这更有效,因为它将构建图形中的所有路径,但仅构建从指定起始顶点开始的路径:

FOR p IN TRAVERSAL(locations, connections, "1", "outbound", { minDepth: 1, maxDepth: 1, paths: true }) 
  RETURN p.path.vertices[*].name
使用邻居查询直接邻居:

这可能会稍微更有效,因为它将构造更小的中间结果。 此外,它不会返回起始顶点26094,而是直接连接到它的所有顶点:

FOR p IN NEIGHBORS(locations, connections, "26094", "outbound") 
  RETURN p.vertex.name
FOR edge IN connections
  FILTER edge._from == "locations/26094"
  FOR vertex IN locations
    FILTER vertex._id == edge._to
    RETURN vertex.name
不使用图函数直接查询边

最后,您可以直接查询边缘集合。 同样,这不会返回起始顶点26094,而是返回直接连接到它的所有顶点:

FOR p IN NEIGHBORS(locations, connections, "26094", "outbound") 
  RETURN p.vertex.name
FOR edge IN connections
  FILTER edge._from == "locations/26094"
  FOR vertex IN locations
    FILTER vertex._id == edge._to
    RETURN vertex.name

谢谢你的回答。我所需要的就是得到maxDepth=2的2个顶点之间的所有可能路径,例如X和Y。我尝试了遍历,但仍然需要大约10秒来执行。以下是查询:对于TRAVERSALlocations、connections、X、outbound中的p,{minDepth:1,maxDepth:2,paths:true}FILTER p.destination.\u key==Y RETURN p.path.vertices[*]。name是否有更快更好的方法来完成此操作?提前谢谢。我用这个新的要求创建了另一个问题,以便其他有同样问题的人更容易找到:谢谢你的回答。我所需要的就是得到maxDepth=2的2个顶点之间的所有可能路径,例如X和Y。我尝试了遍历,但仍然需要大约10秒来执行。以下是查询:对于TRAVERSALlocations、connections、X、outbound中的p,{minDepth:1,maxDepth:2,paths:true}FILTER p.destination.\u key==Y RETURN p.path.vertices[*]。name是否有更快更好的方法来完成此操作?提前感谢。我已经创建了另一个带有此新要求的问题,以便其他具有相同问题的人更容易找到: