Neo4j 节点索引NodeIndex

1.优点

对于实体来说,它的每个属性都可以做为索引来使用,从而是检索效率大大提高;

 

2.原理

在杨使用批量导入的时候,是没有建立索引的,所以我们从此入手,分析NodeIndex(节点索引)的原理:

 

使用restapi手动创建索引:

Neo4j <wbr>节点索引NodeIndex

 

对于上图中,第2行中的链接:

http://202.196.37.110:7474/db/data/index/node/addr

addr表示索引名,

在SDN中,默认是属性名,但可以用注解@Indexed(indexName=”XXX”)指定

(这样也就可以使多个属性公用一个索引名,但还不确定是否有价值);

 

对于第3行:

{"value":"World","uri":"http://localhost:7474/db/data/node/3","key":"addr"}

这是一个json数据,key和value作为索引的唯一标识,在SDN中,key是属性名,value就是该属性的值;

 

3.SDN使用节点索引的分析

这也就可以说明使用SDN为什么会占用大部分内存的缘故:

 

由于我们定义的实体中属性较多,想为大部分属性建立节点索引(使用注解@Indexed创建索引),所以必然会占用大量物理内存;

并且这些索引本质上是为了标识节点,我们表面上看是根据属性查询,但返回的结果却是节点所有属性及值,相当于返回了节点,所以针对一个节点会有多个索引存在;值得说明的是:节点的标签并没有返回,所以SDN在查询之后,还要执行一次查询label的语句,从而把值装配到实体的属性上;

 

4.还是举例说明吧:

 

实体:User

属性及值(省略了其它标识):

 

User1:

@Indexed(indexName=“i_name”)name:张三

@Indexed(indexName=”i_addr”)addr:郑州

Tel:15200

 

User2:

@Indexed(indexName=“i_name”)name:李四

@Indexed(indexName=”i_addr”)addr:周口

Tel:15831

 

在使用SDN创建该实体后,neo4j中是这样存储实体的,

索引i_name,存在键值对(name:张三)对应User1

索引i_name,存在键值对(name:李四)对应User2

 

索引i_addr,存在键值对(addr:郑州)对应User1

索引i_addr,存在键值对(addr:周口)对应User2

 

索引i_name,利用键值对(name:*),可以匹配到User1,User2两个节点(不要说成是实体,原因参见第3条);

相关文章
相关标签/搜索