Neo4j 第三篇: Cypher 查询入门
转载:https://www.cnblogs.com/ljhdo/p/5516793.html
Neo4j 使用 Cypher 查询图形数据,Cypher 是描述性的图形查询语言,语法简单,功能强大,由于 Neo4j 在图形数据库家族中处于绝对领先的地位,拥有众多的用户基数,使得 Cypher 成为图形查询语言的事实上的标准。本文作为入门级的教程,我不会试图分析 Cypher 语言的全部内容,本文的目标是循序渐进地使用Cypher语言执行简单的 CRUD 操作,为了便于演示,本文在 Neo4j Browser 中执行 Cypher 示例代码。以下图形包含三个节点和两个关系,本文会一步一步讲解如何利用 Cypher 语言创建以下图形。
一 easy 热热身
和 SQL 很相似,Cypher 语言的关键字不区分大小写,但是属性值,标签,关系类型和变量是区分大小写的。
1 变量(Variable)
变量用于对搜索模式的部分进行命名,并在同一个查询中引用,在小括号()中命名变量,变量名是区分大小写的,示例代码创建了两个变量:n 和 b,通过 return 子句返回变量 b;
1 | MATCH (n)-->(b) |
在 Cypher 查询中,变量用于引用搜索模式(Pattern),但是变量不是必需的,如果不需要引用,那么可以忽略变量。
2 访问属性
在 Cypher 查询中,通过逗号来访问属性,格式是: Variable.PropertyKey,通过id函数来访问实体的 ID,格式是 id(Variable)。
1 | match (n)-->(b) |
二 创建节点
节点模式的构成: (Variable:Lable1:Lable2{Key1:Value1,Key2,Value2}),实际上,每个节点都有一个整数 ID,在创建新的节点时, Neo4j 自动为节点设置 ID 值,在整个数据库中,节点的 ID 值是递增的和唯一的。
下面的 Cypher 查询创建一个节点,标签是 Person,具有两个属性 name 和 born,通过 RETURN 子句,返回新建的节点:
1 | create (n:Person { name: 'Tom Hanks', born: 1956 }) return n; |
继续创建其他节点:
1 | create (n:Person { name: 'Robert Zemeckis', born: 1951 }) return n; |
三 查询节点
通过 match 子句查询数据库,match 子句用于指定搜索的模式(Pattern),where 子句为 match 模式增加谓词(Predicate),用于对 Pattern 进行约束;
1 查询整个图形数据库
1 | match (n) return n; |
在图形数据库中,有三个节点,Person 标签有连个节点,Movie 有 1 个节点
点击节点,查看节点的属性,如图,Neo4j 自动为节点设置 ID 值,本例中,Forrest Gump 节点的 ID 值是 5
2 查询 born 属性小于 1955 的节点
1 | match (n) |
3 查询具有指定 Lable 的节点
1 | match (n:Movie) |
4 查询具有指定属性的节点
1 | match(n{name:'Tom Hanks'}) |
四 创建关系
关系的构成: StartNode - [Variable:RelationshipType{Key1:Value1,Key2:Value2}] -> EndNode,在创建关系时,必须指定关系类型。
1 创建没有任何属性的关系
1 | MATCH (a:Person),(b:Movie) |
2 创建关系,并设置关系的属性
1 | MATCH (a:Person),(b:Movie) |
五 查询关系
在 Cypher 中,关系分为三种:符号 “–”,表示有关系,忽略关系的类型和方向;符号 “–>” 和 “<–”,表示有方向的关系;
1 查询整个数据图形
2 查询跟指定节点有关系的节点
示例脚本返回跟 Movie 标签有关系的所有节点
1 | match(n)--(m:Movie) |
2 查询有向关系的节点
1 | MATCH (:Person { name: 'Tom Hanks' })-->(movie) |
3 为关系命名
通过 [r] 为关系定义一个变量名,通过函数 type 获取关系的类型
1 | MATCH (:Person { name: 'Tom Hanks' })-[r]->(movie) |
4 查询特定的关系类型
通过 [Variable:RelationshipType{Key:Value}] 指定关系的类型和属性
1 | MATCH (:Person { name: 'Tom Hanks' })-[r:ACTED_IN{roles:'Forrest'}]->(movie) |
六 更新图形
set 子句, 用于对更新节点的标签和实体的属性;
remove 子句, 用于移除实体的属性和节点的标签;
1 创建一个完整的 Path
由于 Path 是由节点和关系构成的,当路径中的关系或节点不存在时,Neo4j 会自动创建;
1 | CREATE p =(vic:Worker:Person{ name:'vic',title:"Developer" })-[:WORKS_AT]->(neo)<-[:WORKS_AT]-(michael:Worker:Person { name: 'Michael',title:"Manager" }) |
变量 neo 代表的节点没有任何属性,但是,其有一个 ID 值,通过 ID 值为该节点设置属性和标签
2 为节点增加属性
通过节点的 ID 获取节点,Neo4j 推荐通过 where 子句和 ID 函数来实现。
1 | match (n) |
3 为节点增加标签
1 | match (n) |
4 为关系增加属性
1 | match (n)<-[r]-(m) |
七 跟实体相关的函数
跟实体相关的函数,主要是获取节点或关系的 ID,关系类型,标签和属性等函数。
1 通过 id 函数,返回节点或关系的 ID
1 | MATCH (:Person { name: 'Oliver Stone' })-[r]->(movie) |
2 通过 type 函数,查询关系的类型
1 | MATCH (:Person { name: 'Oliver Stone' })-[r]->(movie) |
3 通过 lables 函数,查询节点的标签
1 | MATCH (:Person { name: 'Oliver Stone' })-[r]->(movie) |
4 通过 keys 函数,查看节点或关系的属性键
1 | MATCH (a) |
5 通过 properties() 函数,查看节点或关系的属性
1 | CREATE (p:Person { name: 'Stefan', city: 'Berlin' }) |
八 模式
模式,用于描述如何搜索数据,模式的格式是:使用 () 标识节点,使用 [] 标识关系,为了更有效地使用 Cypher 查询,必须深入理解模式。
1 节点模式
节点具有标签和属性,Cypher 为了引用节点,需要给节点命名:
(n) : 该模式用于描述节点,节点的变量名是 n;匿名节点是 ();
(n:lable): 该模式用于描述节点,节点具有特定的标签 lable;也可以指定多个标签;
(n{name:"Vic"}): 该模式用于描述节点,节点具有name属性,并且name属性值是 “Vic”;也可以指定多个属性;
(n:lablle{name:"Vic"}): 该模式用于描述节点,节点具有特定的标签和 name 属性,并且name属性值是 “Vic”;
2 关系模式
在属性图中,节点之间存在关系,关系通过[]表示,节点之间的关系通过箭头 ()-[]->() 表示,例如:
[r]: 该模式用于描述关系,关系的变量名是 r;匿名关系是 []
[r:type]: 该模式用于描述关系,关系类型是 type;每一个关系必须有且仅有一个类型;
[r:type{name:"Friend"}]: 该模式用于描述关系,关系的类型是 type,关系具有属性 name,并且 name 属性值是 “Friend”;
3 关联节点模式
节点之间通过关系联系在一下,由于关系具有方向性,因此,–>表示存在有向的关系,– 表示存在关联,不指定关系的方向,例如:
(a)-[r]->(b) :该模式用于描述节点 a 和 b 之间存在有向的关系r,
(a)-->(b):该模式用于描述 a 和 b 之间存在有向关系;
4 变长路径的模式
从一个节点,通过直接关系,连接到另外一个节点,这个过程叫遍历,经过的节点和关系的组合叫做路径(Path),路径是由节点和关系的有序组合。
(a)-->(b):是步长为 1 的路径,节点 a 和 b 之间有关系直接关联;
(a)-->()-->(b):是步长为 2 的路径,从节点 a,经过两个关系和一个节点,到达节点 b;
Cypher 语言支持变长路径的模式,变长路径的表示方式是:[*N..M],N 和 M 表示路径长度的最小值和最大值。
(a)-[*2]->(b):表示路径长度为 2,起始节点是 a,终止节点是 b;
(a)-[*3..5]->(b):表示路径长度的最小值是 3,最大值是 5,起始节点是 a,终止节点是 b;
(a)-[*..5]->(b):表示路径长度的最大值是 5,起始节点是 a,终止节点是 b;
(a)-[*3..]->(b):表示路径长度的最小值是 3,起始节点是 a,终止节点是 b;
(a)-[*]->(b):表示不限制路径长度,起始节点是 a,终止节点是 b;
5 路径变量
路径可以指定(assign)给一个变量,该变量是路径变量,用于引用查询路径。
1 | p = (a)-[*3..5]->(b) |
6 示例
以下示例图有 6 个节点,每个节点都有一个属性 name,节点之间存在关系,关系类型是 KNOWS,如图:
查询模式是:查找跟 Filipa 有关系的人,路径长度为 1 或 2,查询的结果是:”Dilshad” 和 “Anders”
1 | MATCH (me)-[:KNOWS*1..2]-(remote_friend) |