美文网首页
Nosql-neo4j-Cypher 语法

Nosql-neo4j-Cypher 语法

作者: Viterbi | 来源:发表于2022-09-12 10:37 被阅读0次

    目录: [TOC]

    值和类型 Values and types

    • 属性类型 Property types
    • 结构类型 Structural types
    • 组合类型 Composite types

    属性类型

    • 可以用于返回
    • 可以用于参数
    • 可以存储为属性
    • 可以和常量组合

    属性类型有:

    • 数值类型 Nmubei
    • 字符串 String
    • 布尔类型 Boolean
    • 点的空间类型spatial type
    • 时间类型 temporal

    结构类型

    • 能够被Cypher query
    • 不能作为参数
    • 不能被存储为属性
    • 不能和常量组合

    结构类型有:

    • Nodes:
      • id
      • Labal
      • Map
    • Relationships:
      • id
      • Type
      • Map
      • Id of the start and end nodes
    • Paths:
      • An alternating sequence of nodes and relationships

    组合类型

    • 能被Cypher返回
    • 能作为参数
    • 不能被存储为属性
    • 可以和常量组合

    组合类型有:

    • List
    • Map
      • the key is a String
      • the value has any property, structural or composite type
    • Composite values can also contain null

    命名规则和建议命名规范 Naming rules and recommendations

    命名规范

    • 字母
    • 数字:开头不应该是数字
    • 长度:小于65535个字符
    • 命名要有意义
    • 大小写敏感
    • 空白字符:空白字符将被移除

    推荐命名规范

    • 节点和标签:驼峰格式 Camel-case,例如::VehicleOwner rather than :vehicle_owner etc.
    • 关系类型:大写并使用下划线分割,例如::OWNS_VEHICLE rather than :ownsVehicle etc.

    表达式 Expressions

    一般表达式

    • 小数:例如:13, -40000, 3.14, 6.022E23
    • 十六进制整数:0x13af, 0xFC3A9, -0x66eff
    • 八进制整数:01372, 02127, -05671
    • 字符串:‘Hello’, “World”
    • 布尔常量:true, false, TRUE, FALSE
    • 变量:n, x, rel, myFancyVariable, `A name with weird stuff in it[]!
    • 属性:n.prop, x.prop, rel.thisProperty, myFancyVariable.(weird property name)
    • 动态属性:n[“prop”], rel[n.city + n.zip], map[coll[0]]
    • 参数:$param, $0
    • 表达式列表:['a', 'b'], [1, 2, 3], ['a', 2, n.property, $param], [ ].
    • 调用函数:length§, nodes§
    • 聚合函数:avg(x.prop), count(*)
    • 路径模式path-pattern: (a)-->()<--(b)
    • 算子:1 + 2 and 3 < 4
    • 判断表达式:a.prop = 'Hello', length(p) > 10, exists(a.name)
    • 是否存在的子查询:EXISTS { MATCH (n)-[r]→(p) WHERE p.name = 'Sven' }
    • 正则表达式:a.name =~ 'Tim.*'
    • 大小写敏感:a.surname STARTS WITH 'Sven', a.surname ENDS WITH 'son' or a.surname CONTAINS 'son'
    • case expression

    case expression

    case结构的条件表达式

    简单的case形式,一个表达式多个变量

    语法

    CASE test
     WHEN value THEN result
      [WHEN ...]
      [ELSE default]END
    

    例如:

    MATCH (n)
    RETURN
    CASE n.eyes
    WHEN 'blue'
    THEN 1
    WHEN 'brown'
    THEN 2
    ELSE 3 END AS resul
    
    结果tresult
    5 rows
    2
    1
    3
    2
    1
    

    一般的case形式,多个表达式多个变量

    语法:

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

    例如

    MATCH (n)
    RETURN
    CASE
    WHEN n.eyes = 'blue'
    THEN 1
    WHEN n.age < 40
    THEN 2
    ELSE 3 END AS result
    
    
    result
    5 rows
    2
    1
    3
    3
    1
    

    区分简单case和一般的case形式

    例如:

    MATCH (n)
    RETURN n.name,
    CASE n.age
    WHEN n.age IS NULL THEN -1
    ELSE n.age - 10 END AS age_10_years_ago
    

    结果:

    Daniel 的结果并不是-1,
    作为简单case 形式,Daniel应该事-1,
    实际上, n.age是整形,而n.age IS NULL是布尔类型,所以n.age IS NULL THEN -1根本不会执行

    正确写法:

    MATCH (n)
    RETURN n.name,
    CASE
    WHEN n.age IS NULL THEN -1
    ELSE n.age - 10 END AS age_10_years_ago
    

    参数 Parameters

    Cypher支持参数查询,开发者就不用在在一个query中重新存储字符串,由于参数做了缓存,所以执行效率更高。 参数能够用于:

    • 常量和表达式
    • 节点关系的id

    参数不能用于结构:

    • 属性的key:如MATCH (n) WHERE n.$param = 'something’是无效的
    • 关系的类型
    • 标签

    字符串常量

    参数:
    {
      "name" : "Johan"
    }
    
    
    查询:
    MATCH (n:Person)
    WHERE n.name = $name
    RETURN n
    
    
    MATCH (n:Person { name: $name })
    RETURN n
    

    正则表达式

    参数:
    {
      "regex" : ".*h.*"
    }
    
    查询:
    MATCH (n:Person)
    WHERE n.name =~ $regex
    RETURN n.name
    

    大小写敏感字符串匹配

    参数:
    
    {
      "name" : "Michael"
    }
    
    查询:
    MATCH (n:Person)
    WHERE n.name STARTS WITH $name
    RETURN n.name
    
    

    创建带属性的节点

    参数:
    {
      "props" : {
        "name" : "Andy",
        "position" : "Developer"
      }
    }
    
    查询:
    
    CREATE ($props)
    

    创建多个带属性的节点

    参数:
    {
      "props" : [ {
        "awesome" : true,
        "name" : "Andy",
        "position" : "Developer"
      }, {
        "children" : 3,
        "name" : "Michael",
        "position" : "Developer"
      } ]
    }
    
    查询:
    UNWIND $props AS properties
    CREATE (n:Person)
    SET n = properties
    RETURN n
    

    设置节点的属性

    参数
    {
      "props" : {
        "name" : "Andy",
        "position" : "Developer"
      }
    }
    
    查询:
    MATCH (n:Person)
    WHERE n.name='Michaela'
    SET n = $props
    
    • 这个操作会替换原有的属性

    SKIP and LIMIT

    参数:
    {
      "s" : 1,
      "l" : 1
    }
    
    查询:
    MATCH (n:Person)
    RETURN n.name
    SKIP $s
    LIMIT $l
    

    Node id

    参数
    {
      "id" : 0
    }
    
    查询:
    MATCH (n)
    WHERE id(n)= $id
    RETURN n.name
    

    多个节点id

    参数:
    {
      "ids" : [ 0, 1, 2 ]
    }
    
    查询:
    MATCH (n)
    WHERE id(n) IN $ids
    RETURN n.name
    

    调用程序

    参数
    {
      "indexname" : "My index"
    }
    
    查询:
    
    CALL db.resampleIndex($indexname)
    

    本文使用 文章同步助手 同步

    相关文章

      网友评论

          本文标题:Nosql-neo4j-Cypher 语法

          本文链接:https://www.haomeiwen.com/subject/uqonnrtx.html