【发布时间】:2017-02-09 23:03:47
【问题描述】:
如何按需将 Neo4J 加载到内存中?
在我长期运行的工作的不同阶段,我将节点和关系与 Neo4J 保持一致。所以 Neo4J 应该在磁盘上,因为它可能会消耗太多的内存,而且我不知道我什么时候会对它运行读取查询。
但在某些时候(仅一次)我会想对我的 Neo4J 服务器运行非常繁重的读取查询,它的性能非常差(小时)。作为一种解决方案,我想将所有 Neo4J 加载到 RAM 以获得更好的性能。
什么是最好的选择?我应该使用运行盘还是有更好的解决方案?
附言
使用[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
更新了带有解释的查询(在测试中获得了相同的性能)
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
【问题讨论】:
-
您能否解释一下“我想将所有 Neo4J 加载到 RAM”是什么意思?您需要在内存中按需存储整个 Neo4j 图吗?
-
您正在运行的查询是什么?没有一个应该运行几个小时。
-
APOC 中也有一些图算法实现,可以将图的(部分)加载到纯内存结构中以运行算法。
-
@AnwarShaikh 我认为如果我将图形加载到 JVM 中,Neo4J 的性能应该会更好
-
@MichaelHunger 我更新了我的问题。由于大量排列,它是如此缓慢 -
[r:FRIENDSHIP_REL*3]返回 50,000 多个路径。但我需要[r:FRIENDSHIP_REL*2..5]
标签: java neo4j graph-databases in-memory-database