【问题标题】:Most optimal Neptune query for getting all related vertices with the shortest distances用于获取所有具有最短距离的相关顶点的最佳 Neptune 查询
【发布时间】:2025-12-23 05:35:17
【问题描述】:

我需要获取到给定顶点距离最短的所有相关顶点,这些距离不超过某个最大距离值。

我想出了以下最大距离为 4 的查询,但是否可以进一步优化此查询?也许在 Neptune 中有一些用于图距离搜索的算法?

g.V('XXX').repeat(both().dedup()).emit().times(4) .project('id', 'count').by(id()).by(path().count(local))

【问题讨论】:

  • 您发布的查询是否满足您的需求?如果不能,您能否多说一下您需要实现的目标?如果您知道数据的形状,还可以查看 Neptune 在重复直到类型查询时提供的新查询提示。详情在这里:docs.aws.amazon.com/neptune/latest/userguide/…
  • 我需要计算一个特定的顶点。为此,我需要这个特定顶点 P 和其他顶点之间的最短距离。而且我不需要超过指定长度的距离(此查询中为 4)。所以现在的查询就像 BFS 一样工作 - 循环数是顶点到顶点 P 的距离。
  • 我修改了原来的那个,把循环号放在 sack() 中,但我不确定它是否会通过 dedup() 检查已经访问过的顶点时表现最佳。 g.V('XXX').repeat(sack(assign).by(loops()).sack(sum).by(constant(1)).both().dedup()).emit().times(4).limit(10000).project('id', 'count').by(id()).by(sack()).timeLimit(100)
  • 在 CYPHER 中有一个最短路径函数 - neo4j.com/docs/cypher-manual/current/execution-plans/…

标签: amazon-web-services gremlin tinkerpop tinkerpop3 amazon-neptune


【解决方案1】:

我发现有两个问题会影响您的查询性能。

  1. 它使用路径跟踪(昂贵,因此很慢)
  2. 它会重新访问初始顶点,您可能不希望它出现在结果中

我会这样做:

g.V('XXX').as('x').
  repeat(both().dedup().sack(assign).by(loops())).
    emit().
    times(4).
  where(neq('x')).
  project('id', 'count').
    by(id).
    by(sack()) // distances start at 0; if you want the distance to
               // start at 1, use sack(sum).by(constant(1)).sack()

【讨论】:

  • 太棒了。谢谢!这也是我最近提出的问题(请参阅我对最初问题的回复)。很酷,我们得出了相同的解决方案。我在有 10.000.000 个顶点的图上运行了这个查询,带 sack 的那个的工作速度是带路径的那个的两倍。
  • 它们很相似,但并不完全相同。我的查询最后只添加了 1(如果您想从 1 开始,但这是您可以在应用程序中执行的操作以提高查询性能)并且我从结果中排除了起始顶点(不过,这也可能是你可以在你的应用程序中做)。