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
            删除所有属性
                    使用REMOVE语法无法删除所有的点属性或者边属性,但是可以使用 SET with = and an empty map as the right operand 可以实现
                    
            删除点的一个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  
        
 
 
 
 
 
 
                
 
 
 
 
 
 
 
 
 
 
 
                
 
                
 
                
 
        
        
 
 
 
 
 
 
 
        
 
 
 
 
 
 
 
 
 
posted @ 2021-03-07 23:15  dos_hello_world  阅读(1001)  评论(0)    收藏  举报