目录
③ id 去除重复的关系起始点和终结点,且对任意两点间的关系,只记录1次a--b
一、图元素操作:查询、创建、删除
1、查询match
1.1 节点查询
1、只查有限数量的点
MATCH (n:Person) RETURN n LIMIT 25
2、查询所有点(包括无关系的孤立点)以及 点间的关系
MATCH (n)
OPTIONAL MATCH (n)-[r]->()
RETURN n, r
1.2 关系查询
1、无向查询(所有关系类型,包括a->b 和 b->a)
match (a:Company{name:"企业A"})-[r]-(b:Company{name:"企业C"}) return r
2、有向查询(只查a->b)
match (a:Company{name:"企业A"})-[r]->(b:Company{name:"企业C"}) return r
1.3 路径查询
(1) 指定关系类型
指定关系a-->b,就只能查询a-->b,不能查询b-->a
① 全量查询
MATCH (a:Company)-->(b:Company)
RETURN a.name AS 企业, b.name AS 关联企业, shortestPath((a)-[*]-(b)) AS 最短路径, length(shortestPath((a)-[*]-(b))) AS 最短路径长度
② 只针对特定的节点进行查询
可以在MATCH语句中添加更多的筛选条件,比如:
MATCH (a:企业 {name: '特定企业名'})-->(b:企业)
RETURN a.name AS 企业, b.name AS 关联企业, length(shortestPath((a)-[*]-(b))) AS 最短路径长度
如果点a在整个链路中与多个企业都有关系,那就会得到多条同一个a与不同b的数据。
只对节点a与其他企业节点之间的关系数量感兴趣,你可以通过计数这些记录来得到这个信息。例如:
MATCH (a:企业)-->(b:企业)
RETURN a.name AS 企业, count(b) AS 关联企业数量
(2)任意关系类型
`a-[*..3]-b`关系中没有带箭头,且关系用*号表示,则代表查找任何类型的关系, 包括a->b 和 b->a。
数字3:表示最多通过3级关系连接的节点。
① 全量数据
查询所有2级路径可达的节点、及相互关系。
MATCH path=(a:Company)-[*..2]-(b:Company)
RETURN a.name AS 企业, b.name AS 关联企业, path
这种查询方式会查出很多无意义的路径,比如三点关系类型是a->b,b->a,a->c,但这个查询会查出:a->b,b->a,a->c, a->b->a->c, 很明显a->b->a->c里出现了“回转到自身”。
② 只查看 通过指定层级 可相互关联的点:
DISTINCT 去除重复的关系起始点和终结点,分别保留a->b和b->a。
比如,查询通过2级关系 可关联起来的所有Company节点:
MATCH p=(a:Company)-[*..2]-(b:Company)
RETURN DISTINCT a, b
`COLLECT()`函数在Cypher查询语言中是一个聚合函数,它用于将多个值组合成一个列表。
MATCH (a:Company)-[:竞争]-(b:Company)
RETURN a.name, COLLECT(b.name) AS competitors
③ id 去除重复的关系起始点和终结点,且对任意两点间的关系,只记录1次a--b
查询a与b之间的层级关系,且只会统计一遍a与b之间的最短路径,不管是a到b 还是 b到a, 也不会统计绕一圈又回到自身的路径。
MATCH (a:Company), (b:Company)
WHERE id(a) < id(b)
MATCH p = shortestPath((a)-[*]-(b))
RETURN a, b, length(p) as Level
(a) 如果数据量过大导致查询效率慢,建议给关系层级设置最大值。比如只查最多15个层级的:
MATCH (a:Company), (b:Company)
WHERE id(a) < id(b)
MATCH p = shortestPath((a)-[*..15]-(b))
RETURN a, b, length(p) as Level
(b) MATCH (a:Company), (b:Company)会构建a、b的笛卡尔积。如果数据过大,可以逐条遍历:
MATCH (a:Company {name: '企业A'}), (b:Company)
WHERE id(a) < id(b)
MATCH p = shortestPath((a)-[*..15]-(b))
RETURN a, b, length(p) as Level
2、创建create、merge
create不会去判断节点中是否有重复数据,只是添加;
merge等于是create+match,如果节点中有重复数据,就不会添加进去。
2.1 创建节点
(1) create:允许重复数据
语法格式:
create(nodename:labelname { Property1name:Property1Value ……. Propertynname:PropertynValue })
例子:
create (a:Person{name:"学生小李",personId:"1"})
create (a:Course{name:"机器学习课程",courseId:"2"})
create (a:Course{name:"机器学习课程",courseId:"2"})
match (a:Course{name="机器学习课程"}) return a;
发现有2条重复的。
(2)merge:重复数据会合并
1、使用merge重复插入2条相同的数据
merge (a:Course{name:"机器学习课程2",courseId:"3"})
merge (a:Course{name:"机器学习课程2",courseId:"3"})
2、查询数据
match (a:Course{name="机器学习课程2"}) return a;
发现只有一条。
2.2 创建关系
(1)节点已存在,只创建关系
语法格式:
MATCH (nodename1:labelname { Property1name:Property1Value ……. Propertynname:PropertynValue }),(nodename2:labelname { Property1name:Property1Value ……. Propertynname:PropertynValue }) CREATE (nodename1)-[r:relationship]->(nodename2)
例子:
MATCH (a:Person{name:"学生小李"}),(b:Course{name:"机器学习课程"}) CREATE (a)-[r:学习]->(b)
(2)新增两个节点,同时新增关系
例子:
create (a:Course{name:"Java课程",courseId:"1"}),(b:Book{name:"Java教材",bookId:"1"}) with a,b create (a)-[r:引用]->(b);
3、删除图元素
delete 删除图元素(节点、关系、或路径);
如果节点存在关系,删除节点需要先删除关系,可以使用 detach delete。
3.1 delete:删除节点
1、仅删除无关系的节点
match (n : User) delete n
2、仅删除指定节点间的关系
MATCH (a:Company)-[r:竞争]->(b:Company)
WHERE a.name = '企业D' AND b.name = '企业A'
DELETE r;
3.2 detach delete:删除所有节点及关系
1、删除n节点及其关联的所有关系
match (n) detach delete n
2、删除1个重复节点及其关系
MATCH (n: User {name: 'xxx'})
WITH n LIMIT 1
DETACH DELETE n
3、删除指定节点和关系
MATCH (a:Course{name:"Java课程",courseId:"1"})-[r:引用]-(b:Book{name:"Java教材",bookId:"1"})
delete a,r,b
二、图元素属性操作
1、删除图元素的属性、标签:remove
1.1 删除指定属性
match (a{name:"tom"}) remove a.age return a
1.2 删除指定标签
(1)单标签
match (n {name:"peter"}) remove n:Chinese return n
(2)多标签
match (n {name:"peter"}) remove n:Chinese:Man return n
2、更改节点标签:set
MATCH (n)
WHERE ID(n) = 14
REMOVE n:Teacher
SET n:Student