Arangodb AQL查询非常慢(约20秒)
执行以下查询大约需要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
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是否有更快更好的方法来完成此操作?提前感谢。我已经创建了另一个带有此新要求的问题,以便其他具有相同问题的人更容易找到: