从 AQL 中的遍历计算不同的节点
Count distinct nodes from traversal in AQL
我能够从查询中获取所有不同的节点,但不能获取计数:
FOR v in 2..2 OUTBOUND "starting_node" GRAPH "some_graph"
return DISTINCT v._key
我只想得到结果的计数。我尝试使用 LENGTH(DISTINCT v._key)
as suggested in the docs,但它不是 AQL 的正确语法:
syntax error, unexpected DISTINCT modifier near 'DISTINCT v._key)'
天真的解决方案是获取所有密钥并在客户端对其进行计数,但我很好奇如何在服务器端进行?
受这篇博文的启发 http://jsteemann.github.io/blog/2014/12/12/aql-improvements-for-24/ 我使用 LET
:
准备了解决方案
LET result = (FOR v in 2..2 OUTBOUND "starting_node" GRAPH "some_graph"
return DISTINCT v._key)
RETURN LENGTH(result)
这可能不是最佳解决方案,但它按我的预期工作。
RETURN DISTINCT
所做的是删除重复值,但只是在遍历之后。
您可以设置遍历选项以在遍历期间消除路径,这会更有效,特别是如果您有一个高度互连的图和高遍历深度:
RETURN LENGTH(
FOR v IN 2..2 OUTBOUND "starting_node" GRAPH "some_graph"
OPTIONS { uniqueVertices: "global", bfs: true }
RETURN v._key
)
遍历选项 uniqueVertices
可以设置为 "global"
这样您就不会从这次遍历中两次返回相同的顶点。需要启用 广度优先搜索 bfs
选项才能使用 uniqueVertices: "global"
。 深度优先搜索不支持这个唯一性选项的原因是结果不是确定性的,因此这个组合被禁用。
我能够从查询中获取所有不同的节点,但不能获取计数:
FOR v in 2..2 OUTBOUND "starting_node" GRAPH "some_graph"
return DISTINCT v._key
我只想得到结果的计数。我尝试使用 LENGTH(DISTINCT v._key)
as suggested in the docs,但它不是 AQL 的正确语法:
syntax error, unexpected DISTINCT modifier near 'DISTINCT v._key)'
天真的解决方案是获取所有密钥并在客户端对其进行计数,但我很好奇如何在服务器端进行?
受这篇博文的启发 http://jsteemann.github.io/blog/2014/12/12/aql-improvements-for-24/ 我使用 LET
:
LET result = (FOR v in 2..2 OUTBOUND "starting_node" GRAPH "some_graph"
return DISTINCT v._key)
RETURN LENGTH(result)
这可能不是最佳解决方案,但它按我的预期工作。
RETURN DISTINCT
所做的是删除重复值,但只是在遍历之后。
您可以设置遍历选项以在遍历期间消除路径,这会更有效,特别是如果您有一个高度互连的图和高遍历深度:
RETURN LENGTH(
FOR v IN 2..2 OUTBOUND "starting_node" GRAPH "some_graph"
OPTIONS { uniqueVertices: "global", bfs: true }
RETURN v._key
)
遍历选项 uniqueVertices
可以设置为 "global"
这样您就不会从这次遍历中两次返回相同的顶点。需要启用 广度优先搜索 bfs
选项才能使用 uniqueVertices: "global"
。 深度优先搜索不支持这个唯一性选项的原因是结果不是确定性的,因此这个组合被禁用。