Neo4j:Index索引
Posted jpfss
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Neo4j:Index索引相关的知识,希望对你有一定的参考价值。
Indexing in Neo4j: An Overview
by Stefan Armbruster · Jan. 06, 14 · Java Zone
Neo4j是一个图数据库,在做图的检索时,用index确定图检索graph travesal的起始节点start point。过去的数次版本更迭,index索引的实现方式发生了多次变化。这个Overview的主要目的是解释一下各种index方式的由来和概念,以使neo4j的新用户不产生概念上的混淆。
No Indexes in the Beginning
一开始,neo4j是没有Index索引的。在做graph的遍历的时候,需要从Reference Node开始。只有通过给Node绑定一些标志来获得Reference Node。Reference Node或者”Node 0”被当作一个全局的变量使用。直到neo4j 1.9.x 版本,GraphDatabaseService类有了getReferenceNode()方法,来获取Reference Node。当然,getReferenceNode()方法在neo4j 2.0版本以后已经被废弃了。
Manual Indexes
Manual Index(手动索引,先这么翻译吧~)在neo4j 1.0版本之前已经开始筹备了,那时候neo4j还没有Cypher和server模式,只能使用java API操作Graph。Manual Index是通过java API添加的。
建manual Index的方法:
IndexManager index = graphDb.index();
Index<Node> nodeIndex = index.forNodes( "nodes" );
Node node = graphDb.createNode();
nodeIndex.add( node, "name", "Thomas Anderson" );
如果有manual index,可以用cypher查询:
START n=node:Person(name=‘abc‘) RETURN n
manual index的缺点:
1、建manual索引比较麻烦。
2、程序员会滥用index,index应该只用于检索,而不应该存储多余的信息。
manual index的优点:
可以自己控制建索引是使用什么分词器(Analyzer)
参考: http://docs.neo4j.org/chunked/stable/indexing-create-advanced.html.
35.10. Configuration and fulltext indexes
At the time of creation extra configuration can be specified to control the behavior of the index and which backend to use. For example to create a Lucene fulltext index:
IndexManager index = graphDb.index();
Index<Node> fulltextMovies = index.forNodes( "movies-fulltext", MapUtil.stringMap( IndexManager.PROVIDER, "lucene", "type", "fulltext"));
fulltextMovies.add( theMatrix, "title", "The Matrix" );
fulltextMovies.add( theMatrixReloaded, "title", "The Matrix Reloaded" );
// search in the fulltext index
Node found = fulltextMovies.query( "title", "reloAdEd" ).getSingle();
Here’s an example of how to create an exact index which is case-insensitive:
Index<Node> index = graphDb.index().forNodes( "exact-case-insensitive", stringMap( "type", "exact", "to_lower_case", "true" ) );
Node node = graphDb.createNode();
index.add( node, "name", "Thomas Anderson" );
assertContains( index.query( "name", "\\"Thomas Anderson\\"" ), node );
assertContains( index.query( "name", "\\"thoMas ANDerson\\"" ), node );
Automatic Indexes
Neo4j 1.4引入了自动索引(automatic index),使用自动建索引,在config/neo4j.properties中配置。
参考:http://www.cnblogs.com/nyzhai/p/4515102.html
# Enable auto-indexing for nodes, default is false.
node_auto_indexing=true
# The node property keys to be auto-indexed, if enabled.
node_keys_indexable=name,ki
# Enable auto-indexing for relationships, default is false.
relationship_auto_indexing=true
# The relationship property keys to be auto-indexed, if enabled.
relationship_keys_indexable=name,ki
cypher使用自动索引
START n=node:node_auto_index(name=‘abc‘) RETURN n
Schema Indexes
cypher建schema Index:
CREATE INDEX ON :Person(name);
使用schema Index:
MATCH (p:Person name: ‘Stefan‘) RETURN p
cypher查询时,如果有schema Index会使用索引;如果没有,会逐条扫描。schema Index索引是透明的。
Reference:
https://dzone.com/articles/indexing-neo4j-overview
以上是关于Neo4j:Index索引的主要内容,如果未能解决你的问题,请参考以下文章
名词解释与区分聚集索引非聚集索引主键索引唯一索引普通索引前缀索引单列索引组合索引全文索引覆盖索引
MySQL 进阶 索引 -- 索引概述索引结构(B+TreeHash)索引分类(聚集索引 二级索引 主键索引唯一索引常规索引全文索引)
数据库表索引:普通索引唯一性索引全文索引多列索引隐藏索引删除索引
MySQL 进阶 索引 -- 索引使用原则(验证索引效率最左前缀法则范围查询索引失效情况SQL提示覆盖索引前缀索引单列索引与联合索引)索引设计原则