Neo4j 3.x入门经典读后整理

(说明:下文指的Neo4j全部指代的是3.x版本。)

一、摘要

本文主要记录Neo4j的相关基本知识,包括:

1、Neo4j的基本数据模型;

2、图数据库的使用场景;

3、Cypher的基本语法和部分函数;

4、Neo4j的扩展包APOC和Cypher扩展;

5、查询性能优化基本介绍;

6、Neo4j结合实例分析;

通过以上几点可以得出本文主要是记录neo4j的一些功能,方便后面进行查询。对于环境搭建以及数据导入等不做描述。

二、Neo4j的基本数据模型

2.1、基本数据结构

我们先介绍下Neo4j中的数据模型。主要包括四种数据结构:

1、节点:通常用于存储实体信息。比如一个人可以作为一个节点,一辆车作为一个节点;

2、关系:用来连接节点的实体。比如一个人A和另一个人B是夫妻关系、朋友关系等。每个关系实体必须有起始节点和结束节点,所以关系是有指向的。还需要强调一点,关系只能是一个类型,比如A和B之间的不同关系要用两种关系描述;

3、属性:节点和关系都是属性的容器,属性由键值对组成,类似于java对象中的成员属性;

4、标签:对一类节点的统称,更加方便查询和neo4j本身的维护,同一标签的节点属性尽量一致(neo4j未做硬性限制)。

属性支持的数据类型包括(懒得打了,官网复制的https://neo4j.com/docs/cypher-manual/current/syntax/values/):

  • Number, an abstract type, which has the subtypes Integer and Float
  • String
  • Boolean
  • The spatial type Point (空间)
  • Temporal types: Date, Time, LocalTime, DateTime, LocalDateTime and Duration (时间)

2.2、图建模

2.2.1图建模的Try

1、查询性能设计:查询驱动模型,一定要根据用户的需求来设计模型,从用户需求中脱离出节点和关系;

2、用例关系匹配:在neo4j中,新增节点之间的不同类型关系,代价是很低的。有时关系的划分有时候可以尽量细,但是要注意命名,尽量不要使用通用命名,例:HAS_A,而要使用能具体描述这个关系的名字;

3、查找n元关系:例如一首歌《梯田》,它的词曲是由歌曲作者创作,它的出版是由一个公司执行的,它的MV是由一个艺术家表演,那么就可以组成下面的关系:

关系示例.png

4、节点粒度:在图数据库建模时,倾向于使用比我们习惯的关系模型具有更高粒度、更精细的数据模型。当你在考虑一个属性是否成为一个节点的时候(比如用这个属性进行某种筛选),以实际查询速度为准;

5、适当使用图内索引:使用索引可以很方便的进行范围查询、时间序列、邻近搜索,但是不能 ALL IN INDEX,类似于MySQL创建索引的考虑点;

2.2.2图建模的Avoid

1、使用丰富的属性:粒化模式的反模式;

2、多概念节点:一个节点有多重身份,考虑是否将部分属性移除当成另外的label;

3、未连接的图:既没有关系的节点;

4、密集的节点模式:尽量避免超级节点的产生,即一个节点有很多关系,比如周杰伦的粉丝;

二、图数据库的使用场景

上面介绍了图数据的基本数据模型,本章主要介绍图数据库的特点和使用场景。

图数据库提供了一种全新的解决问题的模型:图,注意不是照片对应的图片。在关系型数据库中关系查询是一个很耗性能的操作,相当于笛卡尔积查询。但是在图数据库,关系是被显示存储,这样只需要直接遍历即可。在上面也介绍到,关系上面是可以有属性的,这一点相对于RDBMS是完全不同的。

适合图数据库的使用场景:

1、复杂查询:本质上包含大量的复杂连接操作。在图数据库中,连接操作将不复存在,而只是需要从一个节点开始指定一级或者多级关系,然后再指定到另一个节点;

2、实时数据的点击流查询:图数据库能快速处理更多种类的复杂查询,数据可以是重复的或近实时的更新;

3、路径查询:类似于第一条,优化了关联查询;

不建议使用图数据库的场景:

1、大集合查询:面向集合的数据库,关系数据库的性能更高;

2、图的全局操作:查找节点集群、发现节点间位置的关系模式、确定特定图的中心等问题都是从全局上研究图,这类操作需要另外一套更专业,性能更高的IT架构去完成,并且时间往往是需要几个小时,甚至于几周;

3、简单聚合查询:简单查询中,读写聚合数据使用图处理非常低效,更适合采用面向聚合操作的键值存储或文档存储。如果复杂性较低,使用图数据库的又是也会较低。

三、Cypher的基本语法和部分函数

3.1、基本查询关键词和基本查询语法

本节会先列出一个查询语句,然后对其进行拆分,介绍相关的关键词和基本语法。(对于增删改、以及CSV导入未涉及)

语句:MATCH(u:User)-[r1:FRIEND]->(someone:User)<-[r2:FRIEND]-(u1:User) WHERE u.userId = "..." and u1.userId = "..." RETURN someone ORDER BY someone.userId DESC(User是一个标签,FRIEND是一个关系,userId是User标签节点的一个属性)

上面语句是对于指定的两个用户,查询他们共同的朋友的所有信息。

MATCH:用于描述数据库应该匹配的模式。总是作为结构化查询组件的开头,类似于 SELECT ... FROM ...;

WHERE:对于MATCH的结果集进行筛选,对于节点、关系相关信息都可以进行判断;

RETURN:返回结果集,可以是节点、节点属性、关系、关系属性以及各种聚合结果或者汇总结果以及三角函数等数学计算;

基本语法:MATCH(n1:Node1)-[r:RELATIONSHIP]->(n2:Node2) WHERE condition RETURN result;

结合上面的例子,总结下Cypher 的关键特性:

  • 声明式的(Declarative):类似于Mysql,告诉数据库我们要什么,而不是告诉数据库怎么去取数据;
  • 具有表现力的(Expressive):使用了圆括号、方括号以及连接各个部分的箭头的这种风格,很容易让人理解查询语句想要干嘛;
  • 模式匹配的;
  • 幂等的。

3.2、扩充点

  • 分页查询:SKIP startIndex LIMIT pageSize;

  • 串联查询:MATCH Cypher1 WITH result1 OPTIONAL MATCH Cypher2 RETURN result2;

  • WITH:获取上个查询语句中的结果,但是不返回,而是传递给下一个查询;

  • OPTIONAL MATCH:相当于MATCH,但是是对于缺失的部分会返回null,类似于Mysql 的 outer join;

  • RETURN:串联查询中也只能出现一个;

  • 索引:创建索引-CREATE INDEX ON :LabelName(propertyName),查看索引和约束-:schema或者单独查看索引CALL db.indexes;

  • 约束:CREATE CONSTRAINT ON (nodeName:LabelName) ASSERT nodeName.propertyName IS UNIQUUE,创建约束同时会为这个属性创建索引;

  • 查询多级关系:-[:TYPEminHops..maxHops]->,TYPE是指的关系类型,也可以不指定,只需要添加即可,例如 -[*1..3]->,查了三级关系;

3.3、语法约定

  • 节点别名用小写驼峰(以小写字母开头)。
  • 标签用大写驼峰(以大写字母开头)。
  • 关系用蛇形大写(类似IS_A)。
  • 属性名用小写驼峰。
  • 关键词全部用大写。

四、Neo4j的扩展包APOC和Cypher扩展

4.1、APOC介绍(安装注意版本一致)

从2009年开始,APOC作为一个函数和过程的集合,可以在Cypher中使用。它包括以下类别:

  • 集合操作(排序、最小值、最大值等)。
  • 图操作(索引和重构)。
  • 文本搜索。
  • 转换。
  • 排序。
  • 地理空间操作。
  • 数据集成。
  • 报表。
  • 获取表示图的元图。

4.2、函数和过程

从复杂性对于两者进行区分:

函数:相对简单。其设计的目的是通过读取数据库数据并计算返回一个结果,可以直接在Cypher语句中使用;

过程:可以对数据进行修改并返回多个结果,调用必须使用关键词 CALL。

4.3、常用用法

1、通过关键词搜索函数和过程:CALL apoc.help('meta')

函数示例.jpeg

2、图概述:CALL apoc.meta.graph (V3.1及以下)或 CALL db.schema() (V3.2及以上)

3、Cypher 语句限时执行:CALL spoc.cypher.runTimeboxed(CypherStatement, params, timeoutInMs)

例:CALL spoc.cypher.runTimeboxed('MATCH(n) return n limit 10',NULL,2)。

有需求推荐直接阅读官网:https://neo4j.com/docs/labs/apoc/3.5/

4.4、Cypher扩展

这一部分只进行了功能记录。

1、构建扩展工程:包括创建函数和创建过程,主要是使用的注解会不同。

2、定制聚合器。

3、非托管扩展:HTTP 和 JAX-RS refreshers、JSON响应流式化。

五、查询性能优化基本介绍

本章主要介绍性能关键词、常用优化手段以及相关注意事项。

5.1、Explain 和 Profile 关键词

这两个关键的主要作用都是用来查看执行计划。两者区别在于,Explain 不会将结果查询出来,这样每个执行计划关联的 Rows 不准确;Profile 会将结果查询出来的执行计划展示出来。下面在解释下两个概念:

  • 查询计划:从上往下看。
执行计划.jpeg
  • 运算符:上面截图中的每个方框相当于一个运算符。

5.2、常用优化手段

主要有两条:查询命中索引和强制使用标签。对于强制使用标签,在对于一个节点有多个标签的时候,特别有用。

强制使用标签举例:MATCH(u:User:Teacher) USING SCAN u:Teacher WHERE u.subject = 'Math' RETURN u (USING SCAN nodeName:labelName )

5.3、注意事项

1、Explain所有查询:注意在合适的数据集上进行测试,确定好性能瓶颈,一般就是看数据库hits 最多的运算符。

2、行:在我们的查询计划中,如果行数不是从上向下快速递减的话,需要考虑是否使用了足够的标签、创建了足够多的索引以及是否在使用的属性上创建了索引。

3、不要过度消耗资源:只返回需要的数据。

4、返回笛卡尔积级别的数据:这个是很明显的,例如

MATCH (n),(m) RETURN n,m

5、简单:使用WITH 关键词将查询切成几块,方便阅读。

六、Neo4j结合实例分析

还没有开发Demo,后续补充。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,001评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,210评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,874评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,001评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,022评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,005评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,929评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,742评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,193评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,427评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,583评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,305评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,911评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,564评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,731评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,581评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,478评论 2 352

推荐阅读更多精彩内容