[Neo4j系列十八]Cypher必知必会速查表二

neo4j 1年前 ⋅ 2082 阅读
       Neo4j已经更新到4.0版本了,本文Cypher的相关查询语言也是匹配最新的4.0版本,后续版本肯定会不断更新,基本的查询应该不会有太大变动,希望这个速查表系列对大家有帮助。
  1. Predicates 谓语断言
  • n.property <> $value
    使用比较符
  • exists(n.property) 
    使用函数
  • n.number >= 1 AND n.number <= 10
    使用布尔运算的联合断言
  • 1 <= n.number <= 10 
    使用运算符的联合断言
  • n:Person
    检查节点的label
  • variable IS NULL 
    检查是否为null
  • NOT exists(n.property) OR n.property = $value 
    使用或条件
  • n.property = $value 
    属性值判断
  • n["property"] = $value 
    动态的获取属性
  • n.property STARTS WITH 'Tim'
       OR n.property ENDS WITH 'n' 
       OR n.property CONTAINS 'goodie' 
       字符串的匹配
  • n.property =~ 'Tim.*'   
    字符串正则匹配
  • (n)-[:KNOWS]->(m)  
    n到m存在KNOWS关系
  • NOT (n)-[:KNOWS]->(m) 
    n到m不存在KNOWS关系
  • n.property IN [$value1, $value2] 
    检查属性值在列表中
  1. List Predicates 列表断言
  • all(x IN coll WHERE exists(x.property)) 
    当列表中所有元素的断言都为true时,返回true
  • any(x IN coll WHERE exists(x.property))  
    当列表中至少有一个元素的断言都为true时,返回true
  • none(x IN coll WHERE exists(x.property))  
    当列表中所有元素的断言都为false时,返回true
  • single(x IN coll WHERE exists(x.property))  
    当列表中所有元素仅有一个元素的断言都为true时,返回true
  1. CASE
  • CASE n.eyes
          WHEN 'blue' THEN 1
          WHEN 'brown' THEN 2
          ELSE 3
        END
        当匹配到when值之后,返回then
  • CASE
          WHEN n.eyes = 'blue' THEN 1
          WHEN n.age < 40 THEN 2
          ELSE 3
        END
        与上一种表达式类似,这种表达更加灵活
  1. List Expressions 列表表达式
  • size($list) 
    列表长度或列表元素数量
  • reverse($list) 
    反转列表顺序
  • head($list)last($list), tail($list)
    head()列表第一个元素, last()列表最后一个元素, tail() 列表除第一个元素外所有元素
  • [x IN list | x.prop] 
    以元素的某一属性值作为新元素的列表
  • [x IN list WHERE x.prop <> $value] 
    过滤列表元素,元素使断言为真
  • [x IN list WHERE x.prop <> $value | x.prop]  
    过滤列表元素,元素使断言为真,并以过滤后元素的某一属性值作为新元素的列表
  • reduce(s = "", x IN list | s + x.prop) 
    逐个拼接元素属性值
  1. MATCH 匹配
  • MATCH (n:Person)-[:KNOWS]->(m:Person)
        WHERE n.name = 'Alice'
        匹配包含标签及属性的节点
  • MATCH (n)-->(m)
    匹配n到m存在某种关系
  • MATCH p = (n)-->(m) 
    匹配n到m的路径
  • OPTIONAL MATCH (n)-[r]->(m)
    选择性匹配,null将会使用在丢失的部分
  1. WHERE 条件语句
  • WHERE n.property <> $value
    使用断言作为过滤
  • WHERE EXISTS {
             MATCH (n)-->(m) WHERE n.age = m.age
          }
        使用存在的子查询作为过滤条件
  1. RETURN 返回语句
  • RETURN * 
    返回所有变量
  • RETURN n AS columnName 
    返回结果别名
  • RETURN DISTINCT n 
    返回去重结果
  • ORDER BY n.property 
    返回结果按照属性值排序
  • ORDER BY n.property DESC 
    降序
  • SKIP $skipNumber 
    跳过数目
  • LIMIT $limitNumber 
    结果数限制范围
  • SKIP $skipNumber LIMIT $limitNumber 
    跳过一定数量返回一定范围数的结果
  • RETURN count(*) 
    返回结果的数量
  1. WITH 
  • MATCH (user)-[:FRIEND]-(friend) WHERE user.name = $name
        WITH user, count(friend) AS friends
        WHERE friends > 10
        RETURN user
        WITH的语法与RETURN有些相似,但是WITH只是拿到查询结果后当做中间          结果,并作为变量,用作后面的部分
  • MATCH (user)-[:FRIEND]-(friend)
        WITH user, count(friend) AS friends
            ORDER BY friends DESC
            SKIP 1
            LIMIT 3
            RETURN user
        其中ORDER BY、SKIP、LIMIT也可以用在WITH语句中。
        注:WITH语句非常重要,如果熟练使用,cypher使用会更上一层楼
  1. UNION 
  • MATCH (a)-[:KNOWS]->(b) RETURN b.name
        UNION 
        MATCH (a)-[:LOVES]->(b) RETURN b.name
        两个查询结果合并,并去重
  • MATCH (a)-[:KNOWS]->(b) RETURN b.name
        UNION ALL
        MATCH (a)-[:LOVES]->(b) RETURN b.name
        两个查询结果合并,不去重
  1. CREATE 创建
  • CREATE (n {name: $value}) 
    创建具有属性的节点
  • CREATE (n $map) 
    创建具有多个属性的节点
  • UNWIND $listOfMaps AS properties
        CREATE (n) SET n = properties
        创建一组具有属性的节点
  • CREATE (n)-[r:KNOWS]->(m) 
    创建给定方向关系
  • CREATE (n)-[:LOVES {since: $value}]->(m) 
    创建具有属性值的关系
  1. SET 设定或改
  • SET n.property1 = $value1,
               n.property2 = $value2
         设定或更改属性值
  • SET n = $map 
    重新设定n的属性值
  • SET n += $map 
    为n添加没有新的属性值,已有更新
  • SET n:Person 
    为节点添加label
  1. MERGE
  • MERGE (n:Person {name: $value})
        ON CREATE SET n.created = timestamp()
        ON MATCH SET
               n.counter = coalesce(n.counter, 0) + 1,
               n.accessTime = timestamp()
        如果存在某个姓名的n节点,则更改counter及accessTime属性值;
        如果不存在,则新建n节点,并设定created属性值
  • MATCH (a:Person {name: $value1}), (b:Person {name: $value2})
        MERGE (a)-[r:LOVES]->(b)
        先MATCH再MERGE
  1. DELETE 删除
  • DELETE n, r 
    删除节点、关系
  • DETACH DELETE n 
    删除节点及与节点相连接的关系
  • MATCH (n)  DETACH DELETE n 
    删除库里所有节点及关系
  1. REMOVE 删除
  • REMOVE n:Person 
    删除节点标签
  • REMOVE n.property 
    删除属性
  1. FOREACH 循环
  • FOREACH (r IN relationships(path) | SET r.marked = true) 
    循环路径中所有关系,并设定属性
  • FOREACH (value IN coll | CREATE (:Person {name: value}) 
    循环列表中元素并执行创建具有属性的节点

 

未完待续。。。

更多内容请访问:IT源点


相关文章推荐

全部评论: 0

    我有话说: