作为previous question of mine的后续,我想找到深度为4的两个给定节点之间存在的所有30条路径。这样做的结果:
start startnode = node(1), endnode(1000)
match startnode-[r:rel_Type*1..4]->endnode
return r
limit 30;
我的数据库包含~50k节点和2M关系。
预计此查询的计算时间非常非常大;我甚至在message.log
文件中结束了以下GC消息:GC Monitor: Application threads blocked for an additional 14813ms [total block time: 182.589s]
。此错误不断发生,并且无限期地阻止所有线程。因此,我正在寻找一种方法,通过优化查询来降低服务器上此查询的计算压力。
我可以使用任何扩展来帮助优化此查询吗?
答案 0 :(得分:1)
试试这个:
https://github.com/wfreeman/findpaths
您可以像这样查询扩展程序:
... / findpathslen /千分之一/30分之4
它会给你一个json响应,找到路径。希望这能帮到你。
它的核心在于,使用内置的图算法来查找一定长度的路径:
@GET
@Path("/findpathslen/{id1}/{id2}/{len}/{count}")
@Produces(Array("application/json"))
def fof(@PathParam("id1") id1:Long, @PathParam("id2") id2:Long, @PathParam("len") len:Int, @PathParam("count") count:Int, @Context db:GraphDatabaseService) = {
val node1 = db.getNodeById(id1)
val node2 = db.getNodeById(id2)
val pathFinder = GraphAlgoFactory.pathsWithLength(Traversal.pathExpanderForAllTypes(Direction.OUTGOING), len)
val pathIterator = pathFinder.findAllPaths(node1,node2).asScala
val jsonMap = pathIterator.take(count).map(p => obj(p))
Response.ok(compact(render(decompose(jsonMap))), MediaType.APPLICATION_JSON).build()
}