MATCH 用于匹配节点和关系,可以理解为查询数据库记录
MATCH
(
<node-name>:<label-name>
)
MATCH必须和RETURN一起使用,否则报错
Neo4j CQL MATCH 命令用于
MATCH (n) RETURN n
备注:把两个n换成 其他任意字母比如p,效果一致
MATCH (p:Person) RETURN p.title
MATCH (p:Person{title: 'Developer'}) RETURN p
以下关系创建为霸王别姬和东成西就两部电影演员关系
人物电影关系图
创建霸王别姬,演员张国荣,导演陈凯歌关系
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
MATCH (director {name: '陈凯歌'})--(movie) RETURN movie.title
MATCH (:Person {name: '陈凯歌'})-->(movie) RETURN movie.title
MATCH (:Person {name: '陈凯歌'})-[r]->(movie) RETURN type(r)
MATCH (m:Movie {title: '霸王别姬'})<-[:ACTED_IN]-(actor) RETURN actor.name
MATCH (m {title: '霸王别姬'})<-[:ACTED_IN|DIRECTED]-(person) RETURN person.name
r具备属性roles 返回r.roles
MATCH (m {title: '霸王别姬'})<-[r:ACTED_IN]-(actor) RETURN r.roles
给演员创建一个关系张国荣认识张丰毅
MATCH (p1:Person{name:'张国荣'}),(p2:Person{name:'张丰毅'})
CREATE (p1)-[:KNOWS]->(p2)
返回关系
MATCH (n {name: '张国荣'})-[r:`KNOWS`]->() RETURN type(r)
匹配张国荣出演的电影和导演名字
MATCH (actor {name: '张国荣'})-[:ACTED_IN]->(movie)<-[:DIRECTED]-(director) RETURN movie.title, director.name
演员张丰毅出现的电影和具备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,最大为无穷
本来张丰毅和东成西就没有什么关系,但是因为他和张国荣都出演过霸王别姬,所以系统判断出他和东成西就有关系
演员张国荣出现的出演或者导演关系具备2个跳跃点的人物关系
MATCH (actor {name: '张国荣'})-[:ACTED_IN|DIRECTED*2]-(person:Person) RETURN person.name
返回
╒═════════════╕
│"person.name"│
╞═════════════╡
│"陈凯歌" │
├─────────────┤
│"张丰毅" │
├─────────────┤
│"张学友" │
└─────────────┘
返回张丰毅,陈凯歌,张学友,他自己的电影节点hops为1,通过电影关联到另外的演员和导演的hops为2(hops翻译为跳跃点)
当两个节点之间的连接是可变长度的,可以使用以下语法返回组成连接的关系列表:
MATCH p = (actor {name: '张国荣'})-[:ACTED_IN*2]-(co_actor)
RETURN relationships(p)
返回
"relationships(p)" │
╞═════════════════════════════════════╡
│[{"roles":["程蝶衣"]},{"roles":["段小楼"]}]│
├─────────────────────────────────────┤
│[{"roles":["黄药师"]},{"roles":["欧阳锋"]}]│
└─────────────────────────────────────┘
因为ACTED_IN*2所以会返回张丰毅和张学友的角色,如果把ACTED*2 改为1,那么将只返回张国荣自己的角色
增加关系
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
返回0度关系,表示和该节点直接相连的节点和自己0表示自己,1表示自己以外的节点
MATCH (m:Movie {title: '霸王别姬'})-[*0..1]-(x) RETURN x
如果希望返回或筛选模式图中的路径,可以引入命名路径。
返回一个演员的各种关系
MATCH p = (z {name: '张国荣'})-->() RETURN p
找到特定ID的关系,这个ID是系统自动生成的那个ID
MATCH (a)-[r]-(b)
WHERE id(r) =5
RETURN a, b
两个人物之间的最短路径
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
查询ID为20的节点
MATCH (n)
WHERE id(n) = 20
RETURN n
查询多个ID
MATCH (n) WHERE id(n) IN [0, 3, 5] RETURN n
查询ID为0的关系
MATCH ()-[r]->() WHERE id(r) = 0 RETURN r
You must be logged in to post a comment.
我想请问一下,可以将一个节点下的所有子项,复制到另外一个节点中。
可以的