neo4j - Cypher 常用语句的基本语法 1
开始说明:
以下的使用的语句如:
MATCH (n) RETURN n
CREATE (a) -[r:RELTYPE]-> (b)
其中第一个的n , a , b, r 代表变量,象征结点集,或者结点,关系等。a,b,r并非结点的ID或者关系的ID,但是可以在RETURN时,使用neo4j的内置函数id获取自动分配的id
以下使用的语句中:
结点,顶点,点,节点都标识图中的node
边,关系,连线都表示图中连接两个点的relationship
CREATE
创建nodes方式
创建单个结点
create (1)
创建结点1
创建多个结点
create (m),(n)
创建结点m和结点n
创建一个节点和一个标签
create(m:person)
创建结点m,并指定标签为person
创建一个节点和多个标签
create(m:person:china)
创建结点m,并指定标签为person和china
创建一个节点并且添加标签和属性
create(m:person {name:"lsl", company:"jm"})
创建结点m,并指定标签为person,指定属性name和company的值
返回创建的结点
match (n) return n limit 50
创建关系:
创建两个结点之间的关系(也就是官网的full path方式,在创建点的同时,添加关系)
CREATE (a) -[r:RELTYPE]-> (b)
在a,b两个结点间创建关系 r,type为RELTYPE
创建关系,并设置属性
CREATE (a) -[r:RELTYPE {name: 'A' + '<->' + 'B'}]-> (b)
在a,b两个结点间创建关系 r,type为RELTYPE
点创建后,添加关系:
创建一个点
CREATE (:Registry {description:"本机注册表"})
创建一个点
CREATE (:Virus {name:"Trojan.Miner.gbq", time:"2015"})
为两个已经存在的点添加关系
MATCH (a:Virus),(b:Registry) WHERE a.name="Trojan.Miner.gbq" AND b.description="本机注册表" CREATE (a)-[:开机启动]->(b)
创建GRAPH举例
CREATE (windos7:OperatingSystem {system:"windows 7", time:"2015"})-[InstallSoftware_id:InstallSoftware]->(驱动人生:ThirdPartySoftware {system:"驱动人生", time:"2015"})
id不展示,图上显示的是名字,id可以让系统自动生成。因此上下这两句,除了id不一样以外,在图上展示效果一致
CREATE (:OperatingSystem {system:"windows 7", time:"2015"})-[:InstallSoftware]->(:ThirdPartySoftware {system:"驱动人生", time:"2015"})
注意在neo4j中,要想在图中展示如windows7或者驱动人生这样的字段,需要单机标签顶部(图像的顶部),然后选择标题属性(图像的底部)
DELETE
用于删除点和边(关系)
删除单个结点
MATCH (n:Person {name:'UNKNOWN'})
RELETE n
删除所有的结点和所有结点关系
MATCH (n)
DETACH DELETE n
删除一个节点,以及它所有的关系
MATCH(n {name: 'Andy'})
DETACH DELETE n
仅仅删除关系
MATCH (n {name:"Andy"})-[r:KNOWS]->()
DELETE r
REMOVE
用于删除点和边的属性,以及点的label
删除属性
MATCH (a {name: 'Andy'})
REMOVE a.age
RETURN a.name, a.age
neo4j不允许null属性,但是属性删除后,查找该属性值,会返回一个null
删除所有属性
删除点的一个label
MATCH (n {name: 'Peter'})
REMOVE n:German
RETURN n.name, labels(n)
删除一个节点的多个标签
MATCH (n {name: 'Peter'})
REMOVE n:German:Swdish
RETURN n.name, labels(n)
可以将所有标签删除
LIMIT
可用于限制输出内容的多少
LIMIT可以与表达式一起使用, 但是表达式里不能直接使用点和关系
限制返回的内容大小
MATCH (n)
RETURN n.name
ORDER BY n.name
LIMIT 3
使用表达式限制返回的内容大小
MATCH (n)
RETURN n.name
ORDER BY n.name
LIMIT toInteger(3 * rand()) + 1
ORDER BY
是RETURN语句与WITH语句的子语句,用于指定数据的输出样式和格式
注意:无法直接使用结点和关系排序,但是可以使用它们的属性排序
禁止在ORDER BY中使用聚合,ORDER BY不能用于改变输出结果集,只能影响它们的顺序
使用属性排序
MATCH (n)
RETURN n.name, n.age
ORDER BY n.name
使用多个属性排序
MATCH (n)
RETURN n.name, n.age
ORDER BY n.name , n.age
使用减序排序
MATCH (n)
RETURN n.name, n.age
ORDER BY n.name DESC
默认使用字段升序排序,这里指定为降序排序
排序字段中存在null值时,值为null的排在最后面
与WITH子句一起执行
MATCH (n)
WITH n
ORDER BY n.age
RETURN collect(n.age) AS names
ORDER BY出现在WITH子句后,后面子句会按照排序后的顺序执行。
SKIP
指定输出结果从哪里开始输出(对于一个有序的结果集,如果同时使用skip和limit。相当于skip从结果集里指定了从哪个其实位置开始输出,limit指定了最后一个数据的结束位置)
这里假定先后创建了5个点,分别为A,B,C,D,E
跳过前面三个点的输出
MATCH (n)
RETURN n.name
ORDER BY n.name
SKIP 3
则输出结果为DE,因为按照顺序排列后,前三个被跳过了
选取结果集中间的两个数据
MATCH (n)
RETURN n.name
ORDER BY n.name
SKIP 1
LIMIT 2
skip与表达式一起使用
MATCH (n)
RETURN n.name
ORDER BY n.name
SKIP toInteger(3*rand())+ 1
SET
给结点或者边(关系)添加属性,更改属性,删除属性
设置属性
MATCH (n {name:'Andy'})
SET n.suiname = 'Taylor'
RETURN n.name, n.surname
删除属性
MATCH ( n {name: 'Andy'})
SET n.name = NULL
RETURN n.name, n.age
效果同remove删除属性
使用map和 =替换全部属性
MATCH ( p {name: 'Peter'} )
SET p = { name: 'Peter Smith', position: 'Entrepreneur'}
RETURN p.name, p.age, p.position
执行该命令后,结点P只有字典里的name属性和position属性,如果之前创建时添加了其它属性,执行该命令后,全部丢失。
删除全部属性
MATCH ( p {name: 'Peter'} )
SET p = { }
RETURN p.name, p.age, p.position
正如上面的指令,执行该命令后,结点P只有字典里的属性,但是字典为空,也就是没有属性
使用+=与map更改属性
MATCH (p {name:''Peter})
SET p += {age: 38, hungry:TRUE, position:'Entrepreneur' }
RETURN p.name, p.age, p.hungry, p.position
+=与map的操作中,会使用map中的属性,更新结点原来的属性。若结点存在该属性,则更新为map中的值,不存在则新增。结点原来的属性(不在map中)依然保留
同时设置多个属性
MATCH ( n {name: 'Andy'})
SET n.position = 'Developer' , n.surname='Taylor'
为结点设置标签(label)
MATCH (n {name: 'Stefan'})
SET n:German
RETURN n.name, labels(n) AS labels
为结点n添加lable,并返回label列表
为节点添加多个标签(label)
MATCH (n {name: 'George'})
SET n:Swedish:Bossman
RETURN n.name, labels(n) AS labels
MATCH
配置复合要求的所有内容
2 结点查询:
返回所有结点
MATCH (n)
RETURN n
n代表变量,这里指代所有匹配到的结点
返回指定label的结点信息
MATCH (movie: Movie)
RETURN movie.title
movie代表匹配到的所有标签为Movie的结点
找出所有关联的结点
MATCH (director {name: 'Oliver Stone'})--(movie)
RETURN movie.title
这里director代表变量, name: 'Oliver Stone'是结点属性,movie是节点变量,--表示在图中两个结点方向随意。结合在一起就是与属性名为Oliver Stone结点 连接的所有结点(该结点的label随意)
director代表变量,movie是变量,--标识关系随意
找出两个标签之间的关联的所有结点
MATCH (:Person {name: 'Oliver Stone'})--(movie:Movie)
RETURN movie.title
返回所有 Oliver Stone 有关联的电影,没有指定关系,也就是比如导演,演出都包括。
在图上也就是与前面Person结点 {name: 'Oliver Stone'}由关系的所有电影
3关系查询
关系指向查询
MATCH (:Person {name: 'Oliver Stone'}) -->(movie)
RETURN movie.title
查询标签为Person,name为Oliver Stone,并从该结点出发(有向图),连接的结点。返回其title属性
查询结点关系
MATCH (:Person {name: 'Oliver Stone'}) -[r]->(movie)
RETURN type(r)
查询标签为Person,属性name为Oliver Stone,并从该点出发(有向图),连接结点。返回这两个点之间的关系类型
关系的type,必须使用type函数才能返回
根据结点关系查询
MATCH (wallstreet:Movie {title: 'Wall Street'}) <-[:ACTED_IN]-(actor)
RETURN actor.name
查询从任意结点actor出发(有向图),关系为ACTED_IN,终点标签是Movie,属性title是Wall Street的任意结点。返回actor的name属性
wallstreet是变量,actor是变量
根据多个结点关系查询
MATCH (wallstreet:Movie {title: 'Wall Street'}) <-[:ACTED_IN| :DIRECTED]-(person)
RETURN person.name
查询从任意结点person出发(有向图),关系为ACTED_IN或者DIRECTED,终点标签是Movie,属性title是Wall Street的任意结点。返回actor的name属性
wallstreet是变量,person是变量
根据多个结点关系查询关系属性
MATCH (wallstreet:Movie {title: 'Wall Street'}) <-[r:ACTED_IN]-(actor)
RETURN r.role
查询从任意结点actor出发(有向图),关系为ACTED_IN,终点标签是Movie,属性title是Wall Street的任意结点。返回r的role属性
wallstreet是变量,r是关系变量,actor是结点变量
4关系深度
字符串属性,字符串关系之间的关联创建
MATCH (charlie:Person {name: 'Charlie Sheen'}), (rob:Person {name: 'Rob Reiner'})
CREATE (rob)-[:'TYPE INCLUDING A SPACE']->(charlie)
多关系查询
MATCH (charlie {name: 'Charlie Sheen'})-[:ACTED_IN]->(movie)<-[:DIRECTED]-(director)
RETURN movie.title, director.name
返回Charlie Sheen参演的电影,并返回它的导演。
关系范围深度查询
MATCH (charlie {name: 'Charlie Sheen'})-[:ACTED_IN*1..3]-(movie)
RETURN movie.title
查询从name属性为Charlie Sheen的结点开始(无向图,方向随意),经过1到3次ACTED_IN关系,可以连接到变量movie,并返回movie的title属性
直观理解从name属性为Charlie Sheen的结点出发,经过三次边(关系)type为ACTED_IN的movie,并返回movie的title属性
:ACTED_IN1..3符合:ACTED_INmin..max格式,标识最少1次,最少3次;如果没有max标识至少一次
多关系的指定深度查询
MATCH (charlie {name: 'Charlie Sheen'})-[:ACTED_IN|DIRECTED*2]-(person:Person)
RETURN person.name
查询从name属性为Charlie Sheen的结点开始(无向图,方向随意),经过2次关系(2个ACTED_IN,或者2个DIRECTED,或者一样一个),可以连接到的Person类型的label变量,并返回变量的name属性
多关系与深度查询中,获取查询到的关系
MATCH p = (actor { name: 'Charlie Sheen' })-[:ACTED_IN*2]-(co_actor)
RETURN relationships(p)
此处的p标识path,而relationships表示获取path中的所有关系,path为符合从属性名为 Charlie Sheen开始(无向图),经过2次ACTED_IN关系,所形成的路径
使用关系属性,不限定关系深度查询
首先使用属性匹配穿件测试关系
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 }]-(martin:Person)
WHERE charlie.name = 'Charlie Sheen' AND martin.name = 'Martin Sheen'
RETURN p
无向图查询,不限制两个指定person之间经过的边次数,但要求边的属性为blocked=false,返回内容为path
零关系与单位关系
MATCH (wallstreet:Movie { title: 'Wall Street' })-[*0..1]-(x)
RETURN x
如下所示,对于关系没有做任何限定,返回任何关系与title属性为'Wall Street的点距离为1的点。同时返回点本身(关系距离为0的意义)
命名Path的获取
MATCH p =(michael { name: 'Michael Douglas' })-->()
RETURN p
有界匹配
MATCH (a)-[r]-(b)
WHERE id(r)= 0
RETURN a,b
5最短路径获取:
获取两个节点之间的最短路径,并限制两节点之间的边最大值
MATCH (martin:Person { name: 'Martin Sheen' }),(oliver:Person { name: 'Oliver Stone' }), p = shortestPath((martin)-[*..15]-(oliver))
RETURN p
[*..15]限制两点之间的边最多为15
获取两个节点间的最短路径,并做关系限定
MATCH (charlie:Person { name: 'Charlie Sheen' }),(martin:Person { name: 'Martin Sheen' }), p = shortestPath((charlie)-[*]-(martin))
WHERE NONE (r IN relationships(p) WHERE type(r)= 'FATHER')
RETURN p
[*]表示两个指定结点间不论有多少条边都可以,但是WHERE对边做了删选,不能选择边的type为FATHER的
查询两个节点间的所有最短路径
MATCH (martin:Person { name: 'Martin Sheen' }),(michael:Person { name: 'Michael Douglas' }), p = allShortestPaths((martin)-[*]-(michael))
RETURN p
[*]表示两个指定结点间不论有多少条边都可以
6通过ID获取结点或者关系
通过id获取结点
MATCH (n)
WHERE id(n) = 0
RETURN n
返回结点id为0的结点
通过id获取关系
MATCH ()-[r]->()
WHERE id(r) = 0
RETURN r
返回结点id为0的关系,此处是有向图关系
使用id获取多个结点id
MATCH (n)
WHERE id(n) IN [0, 3, 5]
RETURN n
OPTIONAL MATCH
功能与MATCH相似,当找不到要匹配的内容时,返回null
RETURN
返回nodes
MATCH (n {'name:'B''})
RETURN n
返回节点name=B的结点
返回relationship
MATCH (n { name: 'A' })-[r:KNOWS]->(c)
RETURN r
返回节点name=A的结点n的全部关系(从结点n出发的直接有向关系)
返回节点的属性
MATCH (n { name: 'A' })
RETURN n.name
返回所有变量
MATCH p =(a { name: 'A' })-[r]->(b)
RETURN *
此指定会返回路径p,结点a,关系r,结点b
用as给属性重定义名字
MATCH (a { name: 'A' })
RETURN a.age AS SomethingTotallyDifferent
可选的属性
MATCH (n)
RETURN n.age
当结点存在age属性就返回该值,不存在时返回null
表达式使用
MATCH (a { name: 'A' })
RETURN a.age > 30, "I'm a literal",(a)-->()
在返回内容中包含常量,属性,函数
返回唯一的结果
MATCH (a { name: 'A' })-->(b)
RETURN DISTINCT b
返回结点a出发(有向)的,有关系的结点,得到的结点只输出一次
WITH

浙公网安备 33010602011771号