Neo4j图形性能:我应该在单独的数据库中缓存慢速查询吗?

问题描述

设置/简介

我的Neo4j图中有10k +个节点,需要在前端应用程序的2个开始/结束节点之间显示一个子图(100-500个节点),以及有关关键路径和所有依赖项的信息(上游) /每个节点的下游路径。

我有一个所有可能的开始/结束节点的列表,它很小(约10对)。

开始和结束节点是请求的参数。

我现在从中间件发送到UI的响应如下:

Nodes: [
{
  Id: 4,downstreamIds: [5,6,7],//all nodes on the paths leading to end node
  upstreamIds: [1,2,3],//all nodes on the paths coming from start node
  ...
},...
]

问题

问题在于,对于每个节点,我都有2个单独的查询来获取下游列表和上游列表...因此对于n个节点,我有1个节点查询+ 2n个下游+上游查询+ 1个关键路径查询(具有slack = 0的节点)。

需要502个查询才能获取其中包含500个节点的开始/结束子图。

关键路径查询很快,不是问题。

但是,在最坏的情况下,此请求总体上可能需要2分钟,即:每个节点都具有所有其他节点作为下游和上游依赖项。

可能的解决方案

  1. 返回2n²边的所有关系的列表(最坏情况为500 * 500 * 2),并使用Javascript计算UI中的下游/上游列表。我不太确定该如何使用Cypher。
    同时存储500,000个对象并在UI中对其进行过滤听起来也不对。

  2. 对每个节点的下游/上游查询进行预处理,并将其缓存在单独的快速键值存储中。我在想nosql mongoDB。
    因此,我从图请求节点,然后通过1个查询从键值存储中获取依赖项(快得多/没有图遍历)

哪个更好?还有其他解决方案吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)