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