Java 根据需要在内存中加载Neo4J以进行繁重的计算
如何按需将Neo4J加载到内存中 在长时间运行的作业的不同阶段,我将节点和关系持久化到Neo4J。所以Neo4J应该在磁盘上,因为它可能会消耗太多内存,我不知道什么时候对它运行读取查询 但在某个时候(只有一次),我会想对我的Neo4J服务器运行非常繁重的读取查询,而它的性能非常差(小时)。作为一种解决方案,我希望将所有Neo4J加载到RAM中,以获得更好的性能 最好的选择是什么?我应该使用run disk还是有更好的解决方案 附笔。 使用Java 根据需要在内存中加载Neo4J以进行繁重的计算,java,neo4j,graph-databases,in-memory-database,Java,Neo4j,Graph Databases,In Memory Database,如何按需将Neo4J加载到内存中 在长时间运行的作业的不同阶段,我将节点和关系持久化到Neo4J。所以Neo4J应该在磁盘上,因为它可能会消耗太多内存,我不知道什么时候对它运行读取查询 但在某个时候(只有一次),我会想对我的Neo4J服务器运行非常繁重的读取查询,而它的性能非常差(小时)。作为一种解决方案,我希望将所有Neo4J加载到RAM中,以获得更好的性能 最好的选择是什么?我应该使用run disk还是有更好的解决方案 附笔。 使用[r:LINK\u REL\u 1*2]进行查询非常快,[
[r:LINK\u REL\u 1*2]
进行查询非常快,[r:LINK\u REL\u 1*3]
工作17秒,[r:LINK\u REL\u 1*4]
工作超过5分钟,甚至不知道有多少,因为我有5分钟的超时时间。但是我需要[r:LINK\u REL\u 1*2..4]
查询在合理的时间内执行
我沉重的疑问和解释
更新了查询并进行了解释(在测试中获得了相同的性能)
APOC过程已经完成,这可能会将Neo4j的大部分存储到缓存内存中。看看这是否会有所不同。看起来您正在尝试创建一个查询,其中路径仅包含:来自不同国家的人员。是这样吗 如果是这样的话,我认为我们可以找到一个更好的查询,它可以做到这一点而不必挂起 首先,让我们选择低垂的果实,看看避免放松是否会有所不同 分析或解释查询,查看与原始查询相比,是否有任何数字看起来明显不同
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
你能解释一下“我想把所有Neo4J都加载到RAM”是什么意思吗?您是否需要按需在内存中存储整个Neo4j图?您正在运行的查询是什么?没有一个可以运行数小时。在APOC中还有一些图形算法实现,可以将图形的(部分)加载到纯内存结构中运行算法。@AnwarShaikh我认为如果将图形加载到JVM@MichaelHunger我更新了我的问题。由于大量的排列,它的速度非常慢-
[r:Friendly\u REL*3]
返回50000多条路径。但是我需要[r:Friendly\u REL*2..5]
Neo4J 2.1.7支持APOC吗?我读过你们的答案,但下面的评论说APOC只在内存中加载了部分图表。我没有太大但非常密集的图形,也不确定部分加载是否会给我带来一个lotNo,我相信定制过程只在Neo4j 3.0中引入,所以您不能使用APOC。3.0之前的版本还有其他选项吗?另外,你们能想象一下,从将图形加载到JVM中,我能期望多快的速度吗?实际上,我要做一个概念证明。你能帮我弄清楚如何只加载:Person
节点和:Friendly\u REL
与apoc.warmup.run()
的关系吗?我不能将Neo4J加载到大页面的内存中吗?我在2012年看到了类似的问题,但它们没有描述如何将图表加载到RAMI see you更改查询中的数据。如果您想让我将此更改为您的列和数据库id模型,请告诉我。不,保留旧名称完全可以。非常感谢。我将在半个小时内测试你的查询,只看到更新的计划,看起来我们在取消展开时唯一避免的是将我们在中间的某个地方的行相乘,DB命中保持不变。我猜执行时间也差不多。是的,我刚刚完成测试-执行时间保持不变
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
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