• Neo4j 第六篇:Cypher语法


    Cypher是图形数据库查询语言事实上的标准。

    一,Cypher类型系统

    Cypher支持的类型系统分为三类:属性类型,复合类型和结构类型。

    1,属性类型

    属性类型:Integer、Float、String和Boolean

    Boolean类型:truefalseTRUEFALSE

    String类型:'Hello'"World"

    2,复合类型

    复合类型:List和Map,List是有序的值的集合,Map是无序的Key/Value对的集合,通常用于存储节点和关系的属性。

    List类型:['a', 'b'][1, 2, 3]['a', 2, n.property, $param][ ]

    Map类型:n是节点,prop是节点的属性键,引用属性的值的格式:n.prop,

    3,结构类型

    结构类型:Node类型、关系类型、Path类型:

    • 其中Node类型表示一个节点,由Id、Label和Map构成;
    • 关系类型表示一个关系,由Id、Type、Map和 关系两端的两个节点的Id构成;
    • Path类型表示路径,是节点和关系的序列。Path模式:(a)-->()<--(b)

    3,List类型

    由标量类型构成的List,例如,['a', 'b'][1, 2, 3]

    由函数range函数生成的List对象,例如,range(0,10),从start到end的有序数字,Range函数包含两端。

    列表(List comprehension):[x IN range(0,10) WHERE x % 2 = 0 | x^3]

    4,Map类型

    列表的常量表示:{ key: 'Value', listKey: [{ inner: 'Map1' }, { inner: 'Map2' }]}

    Map投影,用于从节点、关系和其他Map对象中投影特定元素或变量的值,Map投影的格式是:

    map_variable {map_element, [, …​n]}

    参数注释:

    • map_variable:用于引用Map对象
    • map_element 有四种格式是:
      • 属性选择器:格式是 .Key,用于引用Map对象中的属性
      • 嵌入属性(Literal entry),是一个Key/Value对,例如,key: <expression>,表示嵌入到Map变量中的元素
      • 变量选择器:把一个变量的名称作为Key,变量的值作为Key的值,构建一个Key/Value对,作为Map变量中的元素
      • 属性全选符号: .*

    Map投影的示例,actor是Map变量,nrOfMovies是变量,从Map变量中获取name属性,并添加额外的属性nrOfMovies:

    MATCH (actor:Person)-[:ACTED_IN]->(movie:Movie)
    WITH actor, count(movie) AS nrOfMovies
    RETURN actor { .name, nrOfMovies }

    二,命名规则和作用域

    对变量进行命名,变量的命名要遵守一定的规则,并且变量具有特定的作用域。

    1,命名规则

    名称以英语字符开头,能够包含数字,但是数字不能作为首字符,除了下划线和$,不能包含其他符号,

    注意,下划线应用于名称的中间或结尾,例如,my_variable,$符号只能用于名称的开头,标示一个参数,例如$myParam。

    名称是大小写敏感的,:PERSON 和 :Person 是不同的。

    2,作用域

    节点的Lable、关系类型和属性键是不同的作用域(Scope),在相同的Scope下,名称是不允许重复的;但是,在不同的Scope中,名称是允许重复的,并且表示不同的含义。

    CREATE (a:a {a: 'a'})-[r:a]→(b:a {a: 'a'})

     三,CASE表达式

    case表达式根据条件对查询的结果进行处理:

    CASE
    WHEN predicate THEN result
      [WHEN ...]
      [ELSE default]
    END

    四,查询的参数

    参与的语法是$Param,参数的名称是Param,在传递参数时,必须保证传递的参数和Query中的参数名称相同。

    有Cypher的Query是,参数是$ids,

    MATCH (n)
    WHERE id(n) IN $ids
    RETURN n.name

    传递给Query的参数是:

    {
      "ids" : [ 0, 1, 2 ]
    }

    五,操作符

    操作符是对Cypher查询进行算术运算,逻辑运算等。

    1,通用操作符

    distinct 用于移除重复值, n.property 用于访问属性,[]是变量的列表

    CREATE (a:Person { name: 'Anne', eyeColor: 'blue' }),(b:Person { name: 'Bill', eyeColor: 'brown' }),(c:Person { name: 'Carol', eyeColor: 'blue' })
    WITH [a, b, c] AS ps
    UNWIND ps AS p
    RETURN DISTINCT p.eyeColor

    2,数学操作符

    • 加减乘除:+,-,*,/
    • 取模:%
    • 取幂:^

    3,比较运算符

    • 等于:=
    • 不等于:<>
    • 小于、大于、小于等于、大于等于:<、>、<=、>=
    • IS NULL和 IS NOT NULL

    4,逻辑运算符

    与(AND),或(OR),异或(XOR),非(NOT)

    WITH [2, 4, 7, 9, 12] AS numberlist
    UNWIND numberlist AS number
    WITH number
    WHERE number = 4 OR (number > 6 AND number < 10)
    RETURN number

    5,字符串

    字符串拼接:+

    匹配正则:=~

    WITH ['mouse', 'chair', 'door', 'house'] AS wordlist
    UNWIND wordlist AS word
    WITH word
    WHERE word =~ '.*ous.*'
    RETURN word

    对于字符串,使用 STARTS WITH、ENDS WITH和CONTAINS 过滤字符串:

    WITH ['John', 'Mark', 'Jonathan', 'Bill'] AS somenames
    UNWIND somenames AS names
    WITH names AS candidate
    WHERE candidate STARTS WITH 'Jo'
    RETURN candidate

    6,列表操作

    • +,列表追加
    • IN:检查成员
    • []:索引,特殊地,[start .. end],从start开始,递增1,但是不包括end
    RETURN [1,2,3,4,5]+[6,7] AS myList
    
    WITH [2, 3, 4, 5] AS numberlist
    UNWIND numberlist AS number
    WITH number
    WHERE number IN [2, 3, 8]
    RETURN number
    
    WITH ['Anne', 'John', 'Bill', 'Diane', 'Eve'] AS names
    RETURN names[1..3] AS result

    7,访问属性

    使用 . 号访问属性

    MATCH (n) WHERE 21 < n.age AND n.age <= 30 RETURN n

    参考文档:

    Cypher Syntax

  • 相关阅读:
    002-数据库命名开发规范
    006-多线程-基础-同步解决 概述【ReentrantLock、Semaphore、CyclicBarrier、CountDownLatch】
    005-多线程-基础-sleep、join、yield、wait、notify、notifyAll、run、start、synchronized
    004-多线程-基础-同步问题引出、同步问题解决、死锁、生产者与消费者
    003-多线程-基础-其他【命名和取得、休眠、优先级、线程状态、线程中断】
    002-多线程-基础-实现方式【thread、runnable、callale、thread和runnable对比】
    001-多线程-基础-进程线程、线程状态、优先级、用户线程和守护线程
    001-Spring在代码中获取bean的几种方式
    004-mysql explain详解
    java-序列化-001-原生介绍
  • 原文地址:https://www.cnblogs.com/ljhdo/p/10911426.html
Copyright © 2020-2023  润新知