Neo4j索引比关系更快

时间:2017-08-29 08:46:47

标签: neo4j cypher

在Docker实例中使用Neo4j 3.2.3。需要帮助解释分析器。

将关系数据导入Neo4j。最初将状态列导入为与Respondent节点的关系(即(r:Respondent)-[:FROM]->(s:Status),其中status具有与flat文件中的status列对应的唯一ID。响应者节点具有属性visit_date,它是整数YYYYMMDD。使用状态作为关系:

MATCH (s:Status {id: 1})<-[:FROM]-(r:Respondent)
WHERE r.visit_date >= 20160101 and r.visit_date <= 20161231
RETURN COUNT(r)

首先在Respondent节点的visit_date属性上按范围搜索节点(产生101,057个数据库命中,其数量与状态等于1的响应者数量相同)。 &#39; visit_date&#39;有一个索引。属性。接下来Neo4j扩展所有对抗状态。此扩展会使303,168 db命中数等于所有受访者的数量,并对每个应用程序应用过滤器。本来可以预期,点击次数将低于第一次搜索范围而不是Neo4j粉丝。

如果我将状态作为属性放在Respondent中并查询:

MATCH (r:Respondent)
WHERE r.visit_date >= 20160101 and r.visit_date <= 20161231 and r.status =1
RETURN COUNT(r);

范围搜索首先在visit_date上完成,然后是过滤器应用状态(仅在101,057个受访者的范围内)。查询速度更快,db命中总数更少。

对于分析器中的结果感到惊讶(特别是在受访者已经远程完成后的扩展中的扇出)。有一点需要注意的是,我在我的笔记本电脑上进行性能分析,DDR3内存限制为8GB,因此只有4G专用于Docker容器,3072M专用于堆栈,不会留下太多的页面缓存(500 M)。查询中的速度差异可能是由于配置不良,但是分析(即扩展与否)不应受Neo4j配置的影响。问题是当范围搜索已经减少了结果集时,当状态是关系时扇出的原因是什么?

更新1(带解释图像)

添加解释图像(注意:无法弄清楚人们如何将解释/配置文件转储为文本)。奇怪的是,尽管实际命中率较高,但当状态为关系时,状态指数提示同样快。

匹配状态关系Matching Status relationship

索引状态作为回复者Indexing status property of Respondent的财产

使用索引提示匹配状态关系,这与将状态索引为属性Matching Status relationship with index Hint

一样快

0 个答案:

没有答案