java多线程    Java入门    vsftp    ftp    linux配置    centos    FRP教程    HBase    Html5缓存    webp    zabbix    分布式    neo4j图数据库    

05. Neo4j CQL MATCH 语法

NEO4j CQL MATCH 语法使用简介

MATCH 用于匹配节点和关系,可以理解为查询数据库记录

MATCH 
(
   <node-name>:<label-name>
)

MATCH必须和RETURN一起使用,否则报错

Neo4j CQL MATCH 命令用于

  • 从数据库获取有关节点和属性的数据
  • 从数据库获取有关节点,关系和属性的数据

1. NEO4j CQL MATCH 读取全部节点

MATCH (n) RETURN n

备注:把两个n换成 其他任意字母比如p,效果一致

2. NEO4j CQL MATCH 根据标签读取节点

MATCH (p:Person) RETURN p.title

3. NEO4j CQL MATCH 根据属性读取节点

MATCH (p:Person{title: 'Developer'}) RETURN p

为了演示MATCH的关系创造演员和电影关系

以下关系创建为霸王别姬和东成西就两部电影演员关系

人物电影关系图

image-20221019154817470

创建霸王别姬,演员张国荣,导演陈凯歌关系

CREATE (:Person:Actor {name: '张国荣', born: 1956})-[:ACTED_IN {roles: ['程蝶衣']}]->(:Movie {title: '霸王别姬'})<-[:DIRECTED]-(:Person {name: '陈凯歌', born: 1952})                                                                                                                

给电影增加一个演员张丰毅,演段小楼

MATCH (m:Movie) where m.title='霸王别姬'
CREATE (:Person:Actor {name: '张丰毅', born: 1956})-[r:ACTED_IN{roles:['段小楼']}]->(m) return r

张国荣演东成西就黄药师

MATCH(p:Actor{name:'张国荣'})
CREATE (p)-[r:ACTED_IN{roles:['黄药师']}]->(:Movie {title: '东成西就'}) return p

张学友演东成西就欧阳锋

MATCH (m:Movie) where m.title='东成西就'
CREATE (:Person:Actor {name: '张学友', born: 1961})-[r:ACTED_IN{roles:['欧阳锋']}]->(m) return r

两部电影的人物关系

MATCH (m:Movie {title: '霸王别姬'})-[*0..1]-(x), (n:Movie {title: '东成西就'})-[*0..1]-(y) RETURN x,y

4. NEO4j CQL MATCH 关联的节点和关系, 不管方向

MATCH (director {name: '陈凯歌'})--(movie) RETURN movie.title

5. NEO4j CQL MATCH 匹配 具备方向的节点用--> 或者<--

MATCH (:Person {name: '陈凯歌'})-->(movie) RETURN movie.title

6. NEO4j CQL MATCH 匹配关系,并返回关系类型type(r)

MATCH (:Person {name: '陈凯歌'})-[r]->(movie) RETURN type(r)

7. NEO4j CQL MATCH 匹配知道了关系类型的数据

MATCH (m:Movie {title: '霸王别姬'})<-[:ACTED_IN]-(actor) RETURN actor.name

8. NEO4j CQL MATCH 同时匹配多种关系

MATCH (m {title: '霸王别姬'})<-[:ACTED_IN|DIRECTED]-(person) RETURN person.name

9. NEO4j CQL MATCH 匹配返回关系的变量

r具备属性roles 返回r.roles

MATCH (m {title: '霸王别姬'})<-[r:ACTED_IN]-(actor) RETURN r.roles

10. NEO4j CQL MATCH 返回关系

给演员创建一个关系张国荣认识张丰毅

MATCH (p1:Person{name:'张国荣'}),(p2:Person{name:'张丰毅'}) 
CREATE (p1)-[:KNOWS]->(p2)

返回关系

 MATCH (n {name: '张国荣'})-[r:`KNOWS`]->() RETURN type(r)

11. NEO4j CQL MATCH 匹配复合关系

匹配张国荣出演的电影和导演名字

MATCH (actor {name: '张国荣'})-[:ACTED_IN]->(movie)<-[:DIRECTED]-(director) RETURN movie.title, director.name

12. NEO4j CQL MATCH 跳跃点关系

演员张丰毅出现的电影和具备1到3个跳跃点的电影

MATCH (actor {name: '张丰毅'})-[:ACTED_IN*1..3]-(movie:Movie) RETURN movie.title
返回
╒═════════════╕
│"movie.title"│
╞═════════════╡
│"霸王别姬"       │
├─────────────┤
│"东成西就"       │

节点 -[:TYPE*minHops..maxHops]-> hops翻译为跳跃点

1..3 表示关系数为1到3之间的minHops为1,MaxHops为无穷大,可以省略比如..3 和 1..3 相等 2.. 表示最小为2,最大为无穷

本来张丰毅和东成西就没有什么关系,但是因为他和张国荣都出演过霸王别姬,所以系统判断出他和东成西就有关系

13. NEO4j CQL MATCH 多重复合关系且带着跳跃点

演员张国荣出现的出演或者导演关系具备2个跳跃点的人物关系

MATCH (actor {name: '张国荣'})-[:ACTED_IN|DIRECTED*2]-(person:Person) RETURN person.name
返回
╒═════════════╕
│"person.name"│
╞═════════════╡
│"陈凯歌"        │
├─────────────┤
│"张丰毅"        │
├─────────────┤
│"张学友"        │
└─────────────┘

返回张丰毅,陈凯歌,张学友,他自己的电影节点hops为1,通过电影关联到另外的演员和导演的hops为2(hops翻译为跳跃点)

14. NEO4j CQL MATCH 返回关系组成

当两个节点之间的连接是可变长度的,可以使用以下语法返回组成连接的关系列表:

MATCH p = (actor {name: '张国荣'})-[:ACTED_IN*2]-(co_actor)
RETURN relationships(p)
返回
"relationships(p)"                   │
╞═════════════════════════════════════╡
│[{"roles":["程蝶衣"]},{"roles":["段小楼"]}]│
├─────────────────────────────────────┤
│[{"roles":["黄药师"]},{"roles":["欧阳锋"]}]│
└─────────────────────────────────────┘

因为ACTED_IN*2所以会返回张丰毅和张学友的角色,如果把ACTED*2 改为1,那么将只返回张国荣自己的角色

15. NEO4j CQL MATCH 与可变长度路径上的属性匹配

增加关系

MATCH  (zxy:Person {name: '张学友'}),  (zgr:Person {name: '张国荣'}) 
CREATE (zxy)-[:X {blocked: false}]->(:UNBLOCKED)<-[:X {blocked: false}]-(zgr)
CREATE (zxy)-[:X {blocked: true}]->(:BLOCKED)<-[:X {blocked: false}]-(zgr)

返回属性为blocked:false的关系

MATCH p = (p1:Person)-[* {blocked:false}]-(p2:Person) RETURN p

16. NEO4j CQL MATCH 匹配0度关系

返回0度关系,表示和该节点直接相连的节点和自己0表示自己,1表示自己以外的节点

MATCH (m:Movie {title: '霸王别姬'})-[*0..1]-(x) RETURN x

image-20221018165710752

17. NEO4j CQL MATCH 匹配命名路径

如果希望返回或筛选模式图中的路径,可以引入命名路径。

返回一个演员的各种关系

MATCH p = (z {name: '张国荣'})-->() RETURN p

18. NEO4j CQL MATCH 绑定关系匹配

找到特定ID的关系,这个ID是系统自动生成的那个ID

MATCH (a)-[r]-(b)

WHERE id(r) =5

RETURN a, b

image-20221018170241739

19. NEO4j CQL MATCH 最短路径匹配

两个人物之间的最短路径

MATCH

  (p1:Person {name: '张丰毅'}),

  (p2:Person {name: '张国荣'}),

  p = shortestPath((p1)-[*..15]-(p2))

RETURN p

带着where语句的匹配

MATCH  (p1:Person {name: '张丰毅'}),  (p2:Person {name: '张国荣'}),  p = shortestPath((p1)-[*]-(p2)) WHERE none(r IN relationships(p) WHERE type(r) = 'KNOWS') RETURN p

不能是KNOWS的关系

查询两个演员的全部最短路径

MATCH  (p1:Person {name: '张丰毅'} ),  (p2:Person {name: '张学友'}),  p = allShortestPaths((p1)-[*]-(p2)) RETURN p

20.NEO4j CQL MATCH ID 匹配节点

查询ID为20的节点

MATCH (n)
WHERE id(n) = 20
RETURN n

查询多个ID

MATCH (n) WHERE id(n) IN [0, 3, 5] RETURN n

21. NEO4j CQL MATCH ID 匹配关系

查询ID为0的关系

MATCH ()-[r]->() WHERE id(r) = 0 RETURN r


This entry was posted in 数据库 and tagged . Bookmark the permalink.
月小升QQ 2651044202, 技术交流QQ群 178491360
首发地址:月小升博客https://java-er.com/blog/neo4j-cql-match-usage/
无特殊说明,文章均为月小升原创,欢迎转载,转载请注明本文地址,谢谢
您的评论是我写作的动力.

2 Responses to 05. Neo4j CQL MATCH 语法

  1. 李雨薇 says:

    我想请问一下,可以将一个节点下的所有子项,复制到另外一个节点中。

Leave a Reply