Neo4j -查询优化

neo4j

查询优化:

1, PROFILE 查看执行计划

关注指标:
    estimated rows: 需要被扫描行数的预估值
    dbhits: 实际运行结果的命中绩效
两个值都是越小越好

2,索引构建: 模式索引 、 全文索引

(1) 节点属性索引: 查找, 排序, 过滤

(2) 关系属性索引:

  直接找边  apoc.index.relationships('TYPE','prop:value*')

  CALL apoc.index.relationships('DESTINATION','taxi_time:11') YIELD rel, start AS flight, end AS airport
  RETURN flight_num.flight_num, airport.name;


  绑定入关系  关系指向node    apoc.index.in(node,'TYPE','prop:value*')

  绑定出关系  关系不指向node     apoc.index.out(node,'TYPE','prop:value*') 

  绑定两头   apoc.index.between(node1,'TYPE',node2,'prop:value*') 




  MATCH (f:Person {person_nk:"215")
  CALL apoc.index.out(f,'SUPERVISOR','current_flag:Y') YIELD rel, weight
  RETURN * limit 10;

3, 强制索引:

(1) 索引提示
MATCH后面加using提示索引, 可以多个索引提示, 查看执行计划, 充分利用索引
using index n:Scientist(name)
using index m:Scientist(name)
(2) 扫描提示:
如果查询匹配到索引的大部分数据, 那么可以不用索引, 走标签扫描
using scan s:Scientist
(3) join提示:
不是用于找到查询计划的开始点, 而是强制在特点的点进行连接, 查看执行计划的+NodeHashJoin
再找到前后两个索引节点后, 连接的时候, 注意看是用那一个节点连接的,选择关系多的那个节点作为join节点(换言之,尽量扫描更少的数量)
using JOIN ON wing
也可以提示在多个节点上的连接
USING JOIN ON liskov, cs

4, Index Sampling
Index Sampling就是我们经常对索引进行分析和取样,确保索引统计数据更新,以及在数据库增删改数据的并对相应索引进行更改的全部过程,
配置:
ndex_background_sampling_enabled:该布尔属性值默认被设置为False,将其改为True开启自动sampling。
index_sampling_update_percentage:定义了在触发sampling之前需要被改变索引的百分比阈值。

5, 当查询节点不是语句的第一个查询的时候(the queried nodes are not in the beginning of the pattern) 会默认不走索引

6, 一个精心设计的数据库模型可以大大加快你的查询速度,提供一个良好的用户体验, 尽可能的建立更多种类的关系标签, 而不是给关系加属性, 这样会很低效, 即使给关系加上手工索引, apoc.index.addRelationship()在复杂业务逻辑中也难以操作,

注意点
1, 遍历过的节点自动去掉

节点可以重复遍历, 但是关系不可以

MATCH (x:Department)<-[:WORKIN{current_flag:'Y'}]-(p:Person{person_nk:'465004'})-[:WORKIN{current_flag:'Y'}]->(x:Department) return p

如果想多重条件 加一行MATCH

2, 交集, 并集 List函数
apoc.coll.union
apoc.coll.intersection

3, 存储过程yield的结果 用with缓存一下, 性能会提高一些

4, 用collect合并数据的时候, 一定注意这种方式必须是OPTIONAL MATCH,否则只要有一个查询没有结果,就全部为空了

  OPTIONAL MATCH (n1:Company)
   WHERE n1.id='0afa4218343abd81efe4881917412222'
   WITH collect(n1) as c1
   OPTIONAL MATCH (n2:Person)
   WHERE n2.id='0afa4218343abd81efe4881917412222'
   WITH collect(n2) + c1 as c2
   return c2

5, 设置Max heap memory

6, 生产环境用neo4j-import加载数据很快,数据导入不到1min就能搞定 但是我得先构造很多个csv文档

如果对大量数据进行初始化加载,那么就用Neo4j-import;
增量数据的同步加载又不想暂停数据库服务,那就要用load csv 或者apoc

7, 预热: 遍历一遍所有的数据
MATCH (n)
OPTIONAL MATCH (n)-[r]->()
RETURN count(n.prop) + count(r.prop);

8, https://github.com/bigbai0210/Oracle2Neo4j/tree/master/ETL/src/inserter

9, 图数据库定位:

  适合做图存储和基于模式匹配的子图查询,并不适合做大量与搜索无关的数据存储工作

10, neo4j支持两种方式添加, online的索引才生效

     异步, 即执行完索引命令后, neo4j默默的去执行,直到此索引ONLINE

     同步, 可阻塞

11, 有权最短路径: http://neo4j.com.cn/topic/5b02c1899662eee704f31d00

你可能感兴趣的:(Neo4j -查询优化)