在大型Neo4J数据库中查找特定长度的路径:Memory Performan

2024-04-25 10:17:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Neo4J实例运行Neo4J空间插件。在这个图中,我有一个大约3.5千个节点,每个节点都有相同的标签,我们称之为篮子。每个篮子都与同一城市的一个物理位置有关,这些篮子的密度是非常可变的。我计算了每个篮子和600米范围内的所有邻居之间的步行时间,并将这些存储为节点之间的非空间(定向)关系。因此,有些篮子似乎是一个大集群的一部分,而另一些篮子则几乎独立存在,与其他篮子只有一个或几乎没有关系。在

我的用户有一个问题:他们希望从一个地方开始,在另一个地方结束,沿途访问任意数量的用户定义的篮子。我的程序旨在为用户提供一些路由选项(作为一个节点序列,我将在后面对实际如何走到那里进行排序),计算出n个最短路径数。在

我在下面写了一个cypher查询来完成这个任务。在

start a = node(5955), b=node(6497) 
WITH a,b 
    MATCH p=((a)-[r:IS_WALKABLE_TO*4..5]->(b)) 
RETURN p

N.B.-节点5955和{}是我挑选的两个相隔约2英里的节点,在这个例子中,我决定沿途选择4到5个篮子。在

但是,我一直遇到内存不足异常,因此希望得到关于如何减少此问题的内存需求的建议,以使其在可接受的1到6秒的时间内在一个负担得起的服务器上执行。在

我的理解是Neo4j不会执行笛卡尔积来找到解决方案,而是“从每个节点中选择每个节点并四处嗅探,直到找到合适大小的连接”(请原谅我的措辞!),所以我对堆内存错误感到困惑。在

我的想法是:

  1. 以某种方式将查询的路径查找部分限制到边界框内的节点,这取决于起始节点和结束节点的位置(即,在每个方向上增加500米,然后将查询限制到这些节点)。但是,我找不到任何关于如何做到这一点的文档-是否可以不必为每个查询创建另一个空间层?

  2. 以一种不会产生内存错误的方式重新编写查询-这很容易实现吗?

  3. 完全停止使用Neo4J,使用另一种语言编写一个算法来手动完成。如果是,你会推荐哪种语言?C呢?C++/C语言?或者我可以继续使用Python/Ruby/Java/Go吗?(或者,我甚至在想我可以用PHP非常有效地完成这项工作,但我不确定这是否是一时的疯狂)。

任何关于如何解决这个问题的帮助和建议都非常感谢!在


Tags: 内存用户路径语言node节点关系地方
2条回答

您最好将这个Cypher查询重构为Java代码并转换为unmanaged extension。然后java代码可以使用遍历API或^{}

我认为,由于你的图形密集连接的形状,你很容易结束了数以亿计的可能路径由于重复的中间节点。在

您应该在查询中添加LIMIT 100,然后它将停止搜索路径。在

另一个想法是重写查询,首先在a(可能是b)周围找到不同的起点。在

start a = node(5955), b=node(6497) 
MATCH (a)-[:IS_WALKABLE_TO]->(a1)-[:IS_WALKABLE_TO]->(a2)
WITH a, b, a2, collect(a1) as first
MATCH p = shortestPath((a2)-[:IS_WALKABLE_TO*..2]->(b)) 
RETURN count(*)

// or
UNWIND first as a1
RETURN [a,a1] + nodes(p) as path

相关问题 更多 >