我一直在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;
本机关系索引慢两倍(!)。
为什么企业的速度低于社区版本?
以及如何提高速度?
如果只查看返回的实体本身,则在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上发布的,与您在帖子中报告的内容相同。上面的查询会扫描索引的所有内容,但是当我也使用非常有选择的查询时,结果也是可重复的。
对不起,这是一种“为我工作”的答案。全文索引,但是在没有更好的方法来尝试重现此问题的情况下,这就是我所得到的。