Neo4J Enterprise比社区还慢吗?

问题描述 投票:2回答:1

我一直在Neo4J Community 3.3.3,Enterprise 3.3.9和Enterprise 3.5.17之间进行一些测试。

令我惊讶的是,版本越新,处理请求的时间就越长。

是的,我在转移数据库时检查了所有索引(我用于搜索的所有参数的内部索引和APOC索引)都已到位。对于3.5版,我甚至建议将lucene索引更新为本地索引。

以下是我的以下查询的结果,每个查询产生约12000个结果(约500000个数据库命中)

PROFILE MATCH (u:User{uid:'16c01100-aa92-11e3-a3f6-35e25c9775ff'}), 
(u)<-[:BY]-(ctx:Context) 
WITH COLLECT (DISTINCT ctx.uid) as contexts 
WITH 'context:('+apoc.text.join(contexts,' ')+')' AS query 
CALL apoc.index.relationships('BY',query) 
YIELD start, rel 
WHERE 'Statement' IN LABELS(start) 
RETURN DISTINCT start, rel;

3.3.3社区:3500 ms(连续1000 ms的加载)

3.3.9企业:1850 ms(1350 ms)

3.5.17企业:3500毫秒(1500毫秒)

然后进行这种查询:

PROFILE MATCH (u:User{uid:'16c01100-aa92-11e3-a3f6-35e25c9775ff'}), 
(u)<-[rel:BY]-(s:Statement) 
RETURN distinct s, rel;

3.3.3社区:1500 ms(连续1000 ms的加载)

3.3.9企业:3100毫秒(1300毫秒)

3.5.17企业:4000毫秒(2800毫秒)

我还注意到本机关系索引比apoc索引慢得多。

例如,对于两个查询:

APOC:

CALL apoc.index.relationships('IN','user:16c01100-aa92-11e3-a3f6-35e25c9775ff') 
YIELD start,end RETURN DISTINCT start, end;

与新的本机Neo4J索引:

CALL db.index.fulltext.queryRelationships('IN','user:16c01100-aa92-11e3-a3f6-35e25c9775ff') YIELD relationship WITH DISTINCT relationship, startNode(relationship) AS start, endNode(relationship) AS end RETURN start, end;

本机关系索引慢两倍(!)。

为什么企业的速度低于社区版本?

以及如何提高速度?

neo4j database-performance neo4j-apoc
1个回答
0
投票

如果只查看返回的实体本身,则在DISTINCT时不需要CALL db.index.fulltext.queryRelationships,因为该过程始终返回不同的实体。如果您希望通过关系实体,起始节点和结束节点的组合获得不同的结果,那么除非您可以建模,否则我认为您需要这样做。

我创建了具有大约一百万个关系的数据集,并获得了这些结果(重复执行了几次查询,报告的结果最低:]

首先,直线式APOC:profile call apoc.index.relationships("R", "name:*") yield rel,weight return count(rel)用了6101毫秒。

直线模式FTS:profile call db.index.fulltext.queryRelationships("rels_r", "*") yield relationship return count(relationship)花费了1611毫秒。

模式FTS具有无用的区别:profile call db.index.fulltext.queryRelationships("rels_r", "*") yield relationship as r with distinct r return count(r)耗时2569毫秒。

具有解决关系开始节点的模式FTS:profile call db.index.fulltext.queryRelationships("rels_r", "*") yield relationship as r with startNode(r) as s return count(s)花费了1957毫秒。 (在末端节点中添加也使它稍微慢一些,但我将在此处跳过)

具有独立节点和起始节点的模式FTS:profile call db.index.fulltext.queryRelationships("rels_r", "*") yield relationship as r with distinct r, startNode(r) as s return count(s)花费了3040毫秒。

与上述相同,但也带有末端节点:profile call db.index.fulltext.queryRelationships("rels_r", "*") yield relationship as r with distinct r, startNode(r) as s, endNode(r) as e return count(s)耗时3580毫秒。

与上述相同,但使用APOC:profile call apoc.index.relationships("R", "name:*") yield rel,weight with distinct rel, startNode(rel) as s, endNode(rel) as e return count(s)花费了7137毫秒。

这是在Neo4j 3.5.17上发布的,与您在帖子中报告的内容相同。上面的查询会扫描索引的所有内容,但是当我也使用非常有选择的查询时,结果也是可重复的。

对不起,这是一种“为我工作”的答案。全文索引,但是在没有更好的方法来尝试重现此问题的情况下,这就是我所得到的。

© www.soinside.com 2019 - 2024. All rights reserved.