美文网首页
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