目录: [TOC]
MATCH
- MATCH 指定匹配模式,查询neo4j数据库
- MATCH经常和WHERE一块使用
- MATCH可以在查询的开头或者WITH的后面
下面图用作例子
// 创建节点
CREATE (oliver:Person {name: 'Oliver Stone'})
CREATE (michael:Person {name: 'Michael Douglas'})
CREATE (charlie:Person {name: 'Charlie Sheen'})
CREATE (marlin:Person {name: 'Martin Sheen'})
CREATE (rob:Person {name: 'Rob Reiner'})
CREATE (WallStreet:Movie {title: 'Wall Street'})
CREATE (AmericanPresident:Movie {title: 'The American President'})
// 创建关系
CREATE (oliver)-[:DIRECTED]->(WallStreet)
CREATE (rob)-[:DIRECTED]->(AmericanPresident)
CREATE (michael)-[:ACTED_IN{role:'Gordon Gekko'}]->(WallStreet)
CREATE (charlie)-[:ACTED_IN{role:'Bud Fux'}]->(WallStreet)
CREATE (michael)-[:ACTED_IN{role:'President Andrew Shepherd'}]->(AmericanPresident)
CREATE (marlin)-[:ACTED_IN{role:'Cart Fox'}]->(WallStreet)
CREATE (marlin)-[:ACTED_IN{role:'AJ Maclnemeny'}]->(AmericanPresident)
节点查询
// 获取所有节点
MATCH (n)
RETURN n
// 带标签节点查询
MATCH (movie:Movie)
RETURN movie.title
// 相关的节点查询 ,-- 表示相关,无论是什么类型和方向
MATCH (director { name: 'Oliver Stone' })--(movie)
RETURN movie.title
// "Wall Street"
// 带标签节点查询
MATCH (:Person { name: 'Oliver Stone' })--(movie:Movie)
RETURN movie.title
// "Wall Street"
//
//
//
关系查询
// 外出关系查询,使用 -> 和 <- 表示关系的方向
MATCH (:Person { name: 'Oiver Stone' })-->(movie)
RETURN movie.title
// "Wall Street"
// 需要关系可以赋值给变量
MATCH (:Person { name: 'Oliver Stone' })-[r]->(movie)
RETURN type(r)
// "DIRECTED"
// 指定关系类型
MATCH (wallstreet:Movie { title: 'Wall Street' })<-[:ACTED_IN]-(actor)
RETURN actor.name
// 多个关系类型
// 主演或者导演电影的所有人
MATCH (wallstreet { title: 'Wall Street' })<-[:ACTED_IN|:DIRECTED]-(person)
RETURN person.name
// 指定关系,并赋值给变量
MATCH (wallstreet { title: 'Wall Street' })<-[r:ACTED_IN]-(actor)
RETURN r.role
更多关系查询
//类型不是字母或者是空白字符,可以使用反引号 `
创建
MATCH (charlie:Person { name: 'Charlie Sheen' }),(rob:Person { name: 'Rob Reiner' })
CREATE (rob)-[:`TYPE INCLUDING A SPACE`]->(charlie)
查询
MATCH (n { name: 'Rob Reiner' })-[r:`TYPE INCLUDING A SPACE`]->()
RETURN type(r)
//多重关系,使用()--()
MATCH (charlie { name: 'Charlie Sheen' })-[:ACTED_IN]->(movie)<-[:DIRECTED]-(director)
RETURN movie.title, director.name
//可变长关系查询
// -[:TYPE*minHops..maxHops]→
// 默认是1到无穷, 无边际,可以忽略,可以指定固定的长度
MATCH (charlie { name: 'Charlie Sheen' })-[:ACTED_IN*1..3]-(movie:Movie)
RETURN movie.title
//结果
"Wall Street"2
"The American President"3
"The American President"
//多个关系类型且可变长关系
// *minHops..maxHops
MATCH (charlie { name: 'Charlie Sheen' })-[:ACTED_IN|DIRECTED*2]-(person:Person)
RETURN person.name
//结果
"Oliver Stone"2
"Michael Douglas"3
"Marlin Sheen"
//可变长关系并赋值给变量
MATCH p =(actor { name: 'Charlie Sheen' })-[:ACTED_IN*2]-(co_actor)
RETURN relationships(p)
//结果
[:ACTED_IN[0]{role:"Bud Fox"},:ACTED_IN[2]{role:"Gordon Gekko"}][:ACTED_IN[0]{role:"Bud Fox"},:ACTED_IN[1]{role:"Carl Fox"}]
//带属性的可变长路径
// 创建
MATCH (charlie:Person { name: 'Charlie Sheen' }),(martin:Person { name: 'Martin Sheen' })CREATE (charlie)-[:X { blocked: FALSE }]->(:UNBLOCKED)<-[:X { blocked: FALSE }]-(martin)CREATE (charlie)-[:X { blocked: TRUE }]->(:BLOCKED)<-[:X { blocked: FALSE }]-(martin)
//
MATCH p =(charlie:Person)-[* { blocked:false }]-(marlin:Person)
WHERE charlie.name = 'Charlie Sheen' AND marlin.name = 'Marlin Sheen'
RETURN p
//零长度的路径,当长度为零食其节点本身
MATCH (wallstreet:Movie { title: 'Wall Street' })-[*0..1]-(x)
RETURN x
// 命名路径
MATCH p =(michael { name: 'Michael Douglas' })-->()
RETURN p
//有界关系
MATCH (a)-[r]-(b)
WHERE id(r)= 0
RETURN a,b
最短路径
- 使用
shortestPath
函数,获取节点之间的最短路径 - 最大节点经常和最短路径一起使用
- 最短路径中可以使用条件约束
-
none() or all()
无某种关系,全是某种关系
MATCH (martin:Person { name: 'Marlin Sheen' }),(oliver:Person { name: 'Oliver Stone' }),
p = shortestPath((martin)-[*..15]-(oliver))
RETURN p
- 带约束的最短路径,使用WHERE
//Single shortest path with predicates
// 不考虑father/son 的关系
MATCH (charlie:Person { name: 'Charlie Sheen' }),(martin:Person { name: 'Marlin Sheen' }), p = shortestPath((charlie)-[*]-(martin))
WHERE NONE (r IN relationships(p) WHERE type(r)= 'FATHER')
RETURN p
- 所有最短路径
//
MATCH (martin:Person { name: 'Marlin Sheen' }),(michael:Person { name: 'Michael Douglas' }),
p = allShortestPaths((martin)-[*]-(michael))
RETURN p
通过id查询节点和关系
- id() function可以用于限定节点和关系
- 不推荐使用id约束节点和关系
//用id函数限定节点
MATCH (n)
WHERE id(n)= 0
RETURN n
//关系
MATCH ()-[r]->()
WHERE id(r)= 0
RETURN r
//多个节点
MATCH (n)
WHERE id(n) IN [0, 3, 5]
RETURN n
OPTIONAL MATCH
使用OPTIONAL MATCH 当查询无查询结果时候,返回null OPTIONAL MATCH等价于SQL中的外连接
//可选的关系
MATCH (a:Movie { title: 'Wall Street' })
OPTIONAL MATCH (a)-->(x)
RETURN x
//可选的属性
MATCH (a:Movie { title: 'Wall Street' })
OPTIONAL MATCH (a)-->(x)
RETURN x, x.name
MATCH (a:Movie { title: 'Wall Street' })
OPTIONAL MATCH (a)-[r:ACTS_IN]->()
RETURN a.title, r
本文使用 文章同步助手 同步
网友评论