2016-06-10 50 views
2

我运行下面的查询:为什么我的Neo4j索引不适用?

CREATE INDEX ON :Role(id) 
+-------------------+ 
| No data returned. | 
+-------------------+ 
Indexes added: 1 


CREATE (:Role {id:'abc'}) 
+-------------------+ 
| No data returned. | 
+-------------------+ 
Nodes created: 1 
Properties set: 1 
Labels added: 1 

而接下来,出于某种原因,该指数是不是当我尝试获取我刚刚创建的Role使用。你能解释为什么吗?

neo4j-sh (?)$ PROFILE MATCH (role:Role {id:'abc'}) 
> RETURN role.id; 
+---------+ 
| role.id | 
+---------+ 
| "abc" | 
+---------+ 
1 row 
7 ms 

Compiler CYPHER 2.2 

Planner COST 

Projection 
    | 
    +Filter 
    | 
    +NodeByLabelScan 

+-----------------+---------------+------+--------+---------------+----------------------------+ 
|  Operator | EstimatedRows | Rows | DbHits | Identifiers |      Other | 
+-----------------+---------------+------+--------+---------------+----------------------------+ 
|  Projection |    1 | 1 |  1 | role, role.id |     role.id | 
|   Filter |    1 | 1 |  5 |   role | role.id == { AUTOSTRING0} | 
| NodeByLabelScan |    6 | 5 |  6 |   role |      :Role | 
+-----------------+---------------+------+--------+---------------+----------------------------+ 

Total database accesses: 12 

回答

1

你忘了使用索引。

试试这个:

MATCH (role:Role) 
USING INDEX role:Role(id) 
WHERE role.id='abc' 
RETURN role.id 

Projection 
    | 
    +Expand(All) 
    | 
    +NodeIndexSeek 
Total database accesses: 4 
+0

我完全忘了该选项,谢谢! –

+2

根本不需要,当您的节点很少时,查询计划程序就无法使用索引或标签扫描。 2.3索引扫描在标签的701个节点处开始使用 –

相关问题