0

作为我上一个问题的后续行动,我想找到两个给定节点之间存在的所有 30 条路径,深度为 4。效果如下:

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]. 此错误不断发生,并无限期地阻塞所有线程。因此,我正在寻找一种通过优化查询来降低服务器上此查询的计算压力的方法。

我可以使用任何扩展来帮助优化此查询吗?

4

1 回答 1

1

试试这个:

https://github.com/wfreeman/findpaths

您可以像这样查询扩展名:

.../findpathslen/1/1000/4/30

它会给你一个包含找到的路径的 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()
}
于 2013-07-12T06:44:41.700 回答