为路径搜索优化 Neo4j 查询
Optimizing Neo4j Query for Path search
Neo4j 版本:3.5.16
您使用哪种 API / 驱动程序:Python API with py2neo to 运行 the query with graph.run ()
Py2neo 版本:4.3.0.
大家好,
我正在尝试优化密码查询以检索可变长度路径。
每次数据到达时都会创建图表,并且 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 代码中执行循环部分。
Neo4j 版本:3.5.16
您使用哪种 API / 驱动程序:Python API with py2neo to 运行 the query with graph.run ()
Py2neo 版本:4.3.0.
大家好,
我正在尝试优化密码查询以检索可变长度路径。
每次数据到达时都会创建图表,并且 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 代码中执行循环部分。