为路径搜索优化 Neo4j 查询

Optimizing Neo4j Query for Path search

大家好,

我正在尝试优化密码查询以检索可变长度路径。

每次数据到达时都会创建图表,并且 startNode 和 endNode 固定在它们的名称上 属性。创建图形后,我有一个 startNode 和一个 endNode,corolllary/objective 是:

"From all the possible paths with a minimum length of X and a maximum length of Y, I want to find the shortest path that yields the highest aggregated relationship value"。

我实际做到的是:"get the path of length between X and Y that yields the highest aggregated relationship value" 使用以下 cyper 查询:

MATCH path = (startN:Batch { name: $startNode })-[:CHANGES_TO*4..7]->(endN:Batch { name: $endNode })
RETURN path,
REDUCE (s = 1, r IN RELATIONSHIPS(path) | s * r.rateValue) AS finalBatchValue
ORDER BY finalBatchValue DESC 
LIMIT 1

然而,运行需要一些时间。 ¿有人可以提供有关如何优化它的想法,既要实现最短路径的目标,又要尽可能优化 运行ning 更快的查询吗?

我试图让它与 APOC 方法一起工作,如 allShortestPaths 或 Dijkstra,但没有成功;它最终返回了最短路径,但我无法确定要考虑的最小节点数。

非常感谢任何帮助。

因为你基本上是在寻找长度最短的最强者。您可以使用技巧解决性能问题。 您可以查询固定长度而不是可变长度的图形。但是你必须查询 n2-n1+1 次,在你的情况下,4 次,首先长度为 4,然后是 5,依此类推。 如果您在任何时候找到一条路径,您可以停止查询。 这种方法将极大地减少每次加载的数据。但是你必须多次点击图表 times.Its 很可能四次点击方法所花费的平均时间将少于可变长度的单次点击。 原因是如果您找到长度较短的解决方案,则不会计算所有长度较长的路径。 因为,路径越长,所花费的时间将呈指数增长。

仅使用 cypher 是不可能的。一种方法是在 java 中编写 neo4j 过程并在 cypher query 中使用它。 第二种方式是:使用不同的查询访问 neo4j。 我正在为您的案例编写 python 代码,

query = 'MATCH path = (startN:Batch { name: $startNode })-[:CHANGES_TO*LENGTH_PARAM]->(endN:Batch { name: $endNode })
RETURN path,
REDUCE (s = 1, r IN RELATIONSHIPS(path) | s * r.rateValue) AS finalBatchValue
ORDER BY finalBatchValue DESC 
LIMIT 1'
for length in range(4,8):
      query  = query.replace('LENGTH_PARAM',str(x))
      result = graph.run(query)
      #if result size > 0 
      #your implementation 
      #final_result= result['path'] 
      #return final_result

这就是它的工作原理,在最坏的情况下,您需要为每个开始、结束节点对点击图形四次。网络调用增加,但平均花费的时间应该减少。

使用 java 插件,它可以像以前的查询一样减少到一次命中,因为您可以在 java 代码中执行循环部分。