根据需要在内存中加载Neo4J以进行繁重的计算

时间:2017-02-09 23:03:48

标签: java neo4j graph-databases in-memory-database

如何根据需要将Neo4J加载到内存中?

在我长期工作的不同阶段,我坚持节点和与Neo4J的关系。所以Neo4J应该在磁盘上,因为它可能消耗太多内存,我不知道什么时候会对它运行读取查询。

但是在某些时候(只有一次)我会想对我的Neo4J服务器运行非常繁重的读取查询,并且它的性能非常差(小时)。作为一种解决方案,我想将所有Neo4J加载到RAM以获得更好的性能。

它的最佳选择是什么?我应该使用运行磁盘还是有更好的解决方案?

P.S。

使用[r:LINK_REL_1*2]查询工作速度非常快,[r:LINK_REL_1*3]工作17秒,[r:LINK_REL_1*4]工作时间超过5分钟,甚至不知道多少,因为我有5分钟超时。但我需要[r:LINK_REL_1*2..4]查询才能在合理的时间内执行。

我的重要查询解释

PROFILE
MATCH path = (start:COLUMN)-[r:LINK_REL_1*2]->(col:COLUMN) 
WHERE start.ENTITY_ID = '385' 
WITH path UNWIND NODES(path) AS col
WITH path, 
COLLECT(DISTINCT col.DATABASE_ID) as distinctDBs
WHERE LENGTH(path) + 1 = SIZE(distinctDBs)
RETURN path

enter image description here

更新了查询并解释(在测试中获得了相同的性能)

PROFILE
MATCH (start:COLUMN)
WHERE start.ENTITY_ID = '385' 
MATCH path = (start)-[r:LINK_REL_1*2]->(col:COLUMN)
WITH path, REDUCE(dbs = [], col IN NODES(path) | 
  CASE WHEN col.DATABASE_ID in dbs 
       THEN dbs 
       ELSE dbs + col.DATABASE_ID END) as distinctDbs
WHERE LENGTH(path) + 1 = SIZE(distinctDbs)
RETURN path

enter image description here

2 个答案:

答案 0 :(得分:1)

APOC程序有apoc.warmup.run(),这可能会使Neo4j大部分进入缓存内存。看看这是否会产生影响。

答案 1 :(得分:1)

您似乎正在尝试创建路径仅包含以下内容的查询:来自不同国家/地区的人员。这是对的吗?

如果是这样,我认为我们可以找到一个更好的查询,可以做到这一点而不会挂起。

首先,让我们选择低调的果实,看看是否避免使用UNWIND会有所作为。

查询或解析查询,查看与原始查询相比是否有任何数字显着不同。

MATCH (start:PERSON)
WHERE start.ID = '385' 
MATCH path = (start)-[r:FRIENDSHIP_REL*2..5]->(person:PERSON)
WITH path, REDUCE(countries = [], person IN NODES(path) | 
  CASE WHEN person.country in countries 
       THEN countries 
       ELSE countries + person.COUNTRY_ID END) as distinctCountries
WHERE LENGTH(path) + 1 = SIZE(distinctCountries)
RETURN path