Neo4j-3-Cypher-Query

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
2
MATCH (n)-->(b)
RETURN b

在 Cypher 查询中,变量用于引用搜索模式(Pattern),但是变量不是必需的,如果不需要引用,那么可以忽略变量。

2 访问属性

在 Cypher 查询中,通过逗号来访问属性,格式是: Variable.PropertyKey,通过id函数来访问实体的 ID,格式是 id(Variable)。

1
2
3
match (n)-->(b)
where id(n)=5 and b.age=18
return 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
2
create (n:Person { name: 'Robert Zemeckis', born: 1951 }) return n;
create (n:Movie { title: 'Forrest Gump', released: 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
2
3
match (n) 
where n.born<1955
return n;

3 查询具有指定 Lable 的节点

1
2
match (n:Movie) 
return n;

4 查询具有指定属性的节点

1
2
match(n{name:'Tom Hanks'}) 
return n;

四 创建关系

关系的构成: StartNode - [Variable:RelationshipType{Key1:Value1,Key2:Value2}] -> EndNode,在创建关系时,必须指定关系类型。

1 创建没有任何属性的关系

1
2
3
4
MATCH (a:Person),(b:Movie)
WHERE a.name = 'Robert Zemeckis' AND b.title = 'Forrest Gump'
CREATE (a)-[r:DIRECTED]->(b)
RETURN r;

2 创建关系,并设置关系的属性

1
2
3
4
MATCH (a:Person),(b:Movie)
WHERE a.name = 'Tom Hanks' AND b.title = 'Forrest Gump'
CREATE (a)-[r:ACTED_IN { roles:['Forrest'] }]->(b)
RETURN r;

五 查询关系

在 Cypher 中,关系分为三种:符号 “–”,表示有关系,忽略关系的类型和方向;符号 “–>” 和 “<–”,表示有方向的关系;

1 查询整个数据图形

2 查询跟指定节点有关系的节点

示例脚本返回跟 Movie 标签有关系的所有节点

1
2
match(n)--(m:Movie) 
return n;

2 查询有向关系的节点

1
2
MATCH (:Person { name: 'Tom Hanks' })-->(movie)
RETURN movie;

3 为关系命名

通过 [r] 为关系定义一个变量名,通过函数 type 获取关系的类型

1
2
MATCH (:Person { name: 'Tom Hanks' })-[r]->(movie)
RETURN r,type(r);

4 查询特定的关系类型

通过 [Variable:RelationshipType{Key:Value}] 指定关系的类型和属性

1
2
MATCH (:Person { name: 'Tom Hanks' })-[r:ACTED_IN{roles:'Forrest'}]->(movie)
RETURN r,type(r);

六 更新图形

set 子句, 用于对更新节点的标签和实体的属性;
remove 子句, 用于移除实体的属性和节点的标签;

1 创建一个完整的 Path

由于 Path 是由节点和关系构成的,当路径中的关系或节点不存在时,Neo4j 会自动创建;

1
2
CREATE p =(vic:Worker:Person{ name:'vic',title:"Developer" })-[:WORKS_AT]->(neo)<-[:WORKS_AT]-(michael:Worker:Person { name: 'Michael',title:"Manager" })
RETURN p

变量 neo 代表的节点没有任何属性,但是,其有一个 ID 值,通过 ID 值为该节点设置属性和标签

2 为节点增加属性

通过节点的 ID 获取节点,Neo4j 推荐通过 where 子句和 ID 函数来实现。

1
2
3
4
match (n)
where id(n)=7
set n.name = 'neo'
return n;

3 为节点增加标签

1
2
3
4
match (n)
where id(n)=7
set n:Company
return n;

4 为关系增加属性

1
2
3
4
match (n)<-[r]-(m)
where id(n)=7 and id(m)=8
set r.team='Azure'
return n;

七 跟实体相关的函数

跟实体相关的函数,主要是获取节点或关系的 ID,关系类型,标签和属性等函数。

1 通过 id 函数,返回节点或关系的 ID

1
2
MATCH (:Person { name: 'Oliver Stone' })-[r]->(movie)
RETURN id(r);

2 通过 type 函数,查询关系的类型

1
2
MATCH (:Person { name: 'Oliver Stone' })-[r]->(movie)
RETURN type(r);

3 通过 lables 函数,查询节点的标签

1
2
MATCH (:Person { name: 'Oliver Stone' })-[r]->(movie)
RETURN lables(movie);

4 通过 keys 函数,查看节点或关系的属性键

1
2
3
MATCH (a)
WHERE a.name = 'Alice'
RETURN keys(a)

5 通过 properties() 函数,查看节点或关系的属性

1
2
CREATE (p:Person { name: 'Stefan', city: 'Berlin' })
RETURN properties(p)

八 模式

模式,用于描述如何搜索数据,模式的格式是:使用 () 标识节点,使用 [] 标识关系,为了更有效地使用 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
2
3
MATCH (me)-[:KNOWS*1..2]-(remote_friend)
WHERE me.name = 'Filipa'
RETURN remote_friend.name
Contents
  1. 1. Neo4j 第三篇: Cypher 查询入门
    1. 1.1. 一 easy 热热身
      1. 1.1.1. 1 变量(Variable)
      2. 1.1.2. 2 访问属性
    2. 1.2. 二 创建节点
    3. 1.3. 三 查询节点
      1. 1.3.1. 1 查询整个图形数据库
      2. 1.3.2. 2 查询 born 属性小于 1955 的节点
      3. 1.3.3. 3 查询具有指定 Lable 的节点
      4. 1.3.4. 4 查询具有指定属性的节点
    4. 1.4. 四 创建关系
      1. 1.4.1. 1 创建没有任何属性的关系
      2. 1.4.2. 2 创建关系,并设置关系的属性
    5. 1.5. 五 查询关系
      1. 1.5.1. 1 查询整个数据图形
      2. 1.5.2. 2 查询跟指定节点有关系的节点
      3. 1.5.3. 2 查询有向关系的节点
      4. 1.5.4. 3 为关系命名
      5. 1.5.5. 4 查询特定的关系类型
    6. 1.6. 六 更新图形
      1. 1.6.1. 1 创建一个完整的 Path
      2. 1.6.2. 2 为节点增加属性
      3. 1.6.3. 3 为节点增加标签
      4. 1.6.4. 4 为关系增加属性
    7. 1.7. 七 跟实体相关的函数
      1. 1.7.1. 1 通过 id 函数,返回节点或关系的 ID
      2. 1.7.2. 2 通过 type 函数,查询关系的类型
      3. 1.7.3. 3 通过 lables 函数,查询节点的标签
      4. 1.7.4. 4 通过 keys 函数,查看节点或关系的属性键
      5. 1.7.5. 5 通过 properties() 函数,查看节点或关系的属性
    8. 1.8. 八 模式
      1. 1.8.1. 1 节点模式
      2. 1.8.2. 2 关系模式
      3. 1.8.3. 3 关联节点模式
      4. 1.8.4. 4 变长路径的模式
      5. 1.8.5. 5 路径变量
    9. 1.9. 6 示例
|