Neo4j 是由图节点与关系连接而成的图数据库。若数据集高度互联,或查询包含大量连接, 可考虑使用图数据库。
| 节点 (Nodes) | 节点常用于表示数据中的 实体 或 事物。例如 Person 或 Movie |
| 关系 (Relationships) | 关系用于连接两个节点并组织数据结构。例如某人 出演 (acted in) 一部电影。关系有 类型 与 方向,查询时也可忽略方向。 |
| 标签 (Labels) | 标签用于将节点分组归类。例如一个人可同时有 Person 与 Actor 标签。 |
| 关系类型 (Relationship Type) | 每条关系都有类型。关系便于你探索图中的局部子图。 |
| 属性 (Properties) | 节点与关系都可设置属性。属性是 名称-值对。 |
[USE]
[MATCH WHERE]
[可选 MATCH WHERE]
[WITH [ORDER BY] [SKIP] [LIMIT]]
RETURN [ORDER BY] [SKIP] [LIMIT]
[USE]
(CREATE | MERGE)*
[SET|DELETE|REMOVE|FOREACH]*
[RETURN [ORDER BY] [SKIP] [LIMIT]]
[USE]
[MATCH WHERE]
[可选 MATCH WHERE]
[WITH [ORDER BY] [SKIP] [LIMIT]]
(CREATE | MERGE)*
[SET|DELETE|REMOVE|FOREACH]*
[RETURN [ORDER BY] [SKIP] [LIMIT]]
MATCH (n:Person)-[:KNOWS]->(m:Person)
WHERE n.name = 'Alice'
节点模式可包含标签与属性。
MATCH (n)-->(m)
任意模式都可用于 MATCH。
MATCH (n {name: 'Alice'})-->(m)
带节点属性的模式。
MATCH p = (n)-->(m)
将路径赋给变量 p。
可选 MATCH (n)-[r]->(m)
可选模式:缺失部分用 null 填充。
WHERE n.property <> $value
使用谓词过滤。注意 WHERE 始终属于 MATCH、可选 MATCH 或 WITH 子句。若放在其他 子句之后,语义会发生变化。
WHERE EXISTS {
MATCH (n)-->(m) WHERE n.age = m.age
}
使用存在性子查询进行过滤。
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(*)
匹配行数。更多见聚合函数。
MATCH (user)-[:FRIEND]-(friend)
WHERE user.name = $name
WITH user, count(friend) AS friends
WHERE friends > 10
RETURN user
WITH 语法类似 RETURN。它显式分隔查询各部分,声明哪些变量 传递到下一部分。
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 一起使用。
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
返回所有查询结果的并集,包含重复行。
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)
创建指定类型、方向与属性的关系。
SET n.property1 = $value1,
n.property2 = $value2
更新或创建属性。
SET n = $map
设置全部属性(会移除已有属性)。
SET n += $map
添加并更新属性,同时保留已有属性。
SET n:Person
为节点添加 Person 标签。
MERGE (n:Person {name: $value})
ON CREATE SET n.created = timestamp()
ON MATCH SET
n.counter = coalesce(n.counter, 0) + 1,
n.accessTime = timestamp()
匹配模式;若不存在则创建。可用 ON CREATE 与 ON MATCH 做条件更新。
MATCH (a:Person {name: $value1}),
(b:Person {name: $value2})
MERGE (a)-[r:LOVES]->(b)
MERGE 查找或创建节点之间的关系。
MATCH (a:Person {name: $value1})
MERGE
(a)-[r:KNOWS]->(b:Person {name: $value3})
MERGE 查找或创建附着在节点上的路径。
DELETE n, r
删除一个节点与一条关系。
DETACH DELETE n
删除节点及其所有相连关系。
MATCH (n)
DETACH DELETE n
删除数据库中的全部节点与关系。
REMOVE n:Person
从 n 移除标签。
REMOVE n.property
移除属性。
FOREACH (r IN relationships(path) |
SET r.marked = true)
对路径中每条关系执行变更操作。
FOREACH (value IN coll |
CREATE (:Person {name: value}))
对列表中每个元素执行变更操作。
CALL {
MATCH (p:Person)-[:FRIEND_OF]->(other:Person) RETURN p, other
UNION
MATCH (p:Child)-[:CHILD_OF]->(other:Parent) RETURN p, other
}
调用含两个 UNION 部分的子查询,随后可对子查询结果再处理。
CALL db.labels() YIELD label
独立调用内置过程 db.labels 列出库中全部标签。注意 必需的过程参数需写在过程名后的括号中。
CALL db.labels() YIELD *
独立调用可用 YIELD * 返回全部列。
CALL java.stored.procedureWithArgs
独立调用可省略 YIELD,并通过语句参数隐式传参,例如只需一个 input 参数的调用可传入参数映射 {input: 'foo'}。
CALL db.labels() YIELD label
RETURN count(label) AS count
在更大查询中调用内置过程 db.labels 统计标签数。查询内的调用 始终需要显式传参,并用 YIELD 命名结果。
LOAD CSV FROM
'https://neo4j.com/docs/cypher-refcard/4.3/csv/artists.csv' AS line
CREATE (:Artist {name: line[1], year: toInteger(line[2])})
从 CSV 文件加载数据并创建节点。
LOAD CSV WITH HEADERS FROM
'https://neo4j.com/docs/cypher-refcard/4.3/csv/artists-with-headers.csv' AS line
CREATE (:Artist {name: line.Name, year: toInteger(line.Year)})
加载带表头的 CSV 数据。
USING PERIODIC COMMIT 500
LOAD CSV WITH HEADERS FROM
'https://neo4j.com/docs/cypher-refcard/4.3/csv/artists-with-headers.csv' AS line
CREATE (:Artist {name: line.Name, year: toInteger(line.Year)})
导入大量数据时,每 500 行提交一次当前事务。
LOAD CSV FROM
'https://neo4j.com/docs/cypher-refcard/4.3/csv/artists-fieldterminator.csv'
AS line FIELDTERMINATOR ';'
CREATE (:Artist {name: line[1], year: toInteger(line[2])})
使用非默认字段分隔符(默认是逗号,两侧无空格)。
LOAD CSV FROM
'https://neo4j.com/docs/cypher-refcard/4.3/csv/artists.csv' AS line
RETURN DISTINCT file()
返回 LOAD CSV 正在处理的文件绝对路径;在 LOAD CSV 外调用则返回 null。
LOAD CSV FROM
'https://neo4j.com/docs/cypher-refcard/4.3/csv/artists.csv' AS line
RETURN linenumber()
返回 LOAD CSV 当前处理的行号;在 LOAD CSV 外调用则返回 null。
| 通用 (General) | DISTINCT, ., [] |
| 数学 (Mathematical) | +, -, *, /, %, ^ |
| 比较 (Comparison) | =, <>, <, >, <=, >=, IS NULL, IS NOT NULL |
| 布尔 (Boolean) | AND, OR, XOR, NOT |
| 字符串 (String) | + |
| 列表 (List) | +, IN, [x], [x .. y] |
| 正则表达式 (Regular Expression) | =~ |
| 字符串匹配 (String matching) | STARTS WITH, ENDS WITH, CONTAINS |
null 用于表示缺失/未定义的值。
null 不等于 null。不知道两个值并不意味着它们相同。因此表达式
null = null 结果为 null 而非 true。检查是否为 null 请用 IS NULL。
算术表达式、比较与函数调用(coalesce 除外)在任一参数为
null 时返回 null。
访问列表中不存在的元素或不存在的属性会得到 null。
在 可选 MATCH 子句中,模式缺失部分用 null 填充。
(n:Person)
带 Person 标签的节点。
(n:Person:Swedish)
同时带 Person 与 Swedish 标签的节点。
(n:Person {name: $value})
带声明属性的节点。
()-[r {name: $value}]-()
匹配带声明属性的关系。
(n)-->(m)
从 n 到 m 的关系。
(n)--(m)
n 与 m 之间任意方向的关系。
(n:Person)-->(m)
带 Person 标签的节点 n,并有指向 m 的关系。
(m)<-[:KNOWS]-(n)
从 n 到 m、类型为 KNOWS 的关系。
(n)-[:KNOWS|:LOVES]->(m)
从 n 到 m、类型为 KNOWS 或 LOVES 的关系。
(n)-[r]->(m)
将关系绑定到变量 r。
(n)-[*1..5]->(m)
从 n 到 m、长度在 1 到 5 条关系之间的可变长路径。
(n)-[*]->(m)
从 n 到 m、任意条数关系的可变长路径。(见性能建议。)
(n)-[:KNOWS]->(m {property: $value})
从节点 n 到节点 m、类型为 KNOWS 且带声明属性的关系。
shortestPath((n1:Person)-[*..6]-(n2:Person))
查找单条最短路径。
allShortestPaths((n1:Person)-[*..6]->(n2:Person))
查找所有最短路径。
size((n)-->()-->())
统计匹配该模式的路径数。
USE myDatabase
选择 myDatabase 执行查询或其一部分。
USE neo4j
MATCH (n:Person)-[:KNOWS]->(m:Person)
WHERE n.name = 'Alice'
针对 neo4j 数据库执行的 MATCH 查询。
SHOW FUNCTIONS
列出全部可用函数。
SHOW PROCEDURES EXECUTABLE YIELD name
列出当前用户可执行的全部过程,仅返回过程名。
CREATE (n:Person {name: $value})
创建带标签与属性的节点。
MERGE (n:Person {name: $value})
匹配或创建带该标签与属性的唯一节点。
SET n:Spouse:Parent:Employee
为节点添加标签。
MATCH (n:Person)
匹配带 Person 标签的节点。
MATCH (n:Person)
WHERE n.name = $value
匹配带 Person 标签且具有给定 name 的节点。
WHERE (n:Person)
检查节点上是否存在该标签。
labels(n)
节点的标签。
REMOVE n:Person
从节点移除标签。
['a', 'b', 'c'] AS list
字面量列表用方括号声明。
size($list) AS len, $list[0] AS value
列表可作为参数传入。
range($firstNum, $lastNum, $step) AS list
range() 创建数字列表(步长可选);其他返回列表的函数还有:labels()、nodes()、 relationships()。
MATCH p = (a)-[:KNOWS*]->()
RETURN relationships(p) AS r
可变长路径中的关系列表可通过命名路径与 relationships() 返回。
RETURN matchedNode.list[0] AS value,
size(matchedNode.list) AS len
属性可以是字符串、数字或布尔值的列表。
list[$idx] AS value,
list[$startIdx..$endIdx] AS slice
列表元素可用方括号中的 idx 下标访问。无效索引返回 null。切片可用 从 start_idx 到 end_idx 的区间获取,两端都可省略或为负。越界元素 会被忽略。
UNWIND $names AS name
MATCH (n {name: name})
RETURN avg(n.age)
用 UNWIND 可将任意列表展开为多行。示例从姓名列表匹配全部姓名。
MATCH (a)
RETURN [(a)-->(b) WHERE b.name = 'Bob' | b.age]
模式推导可将匹配结果直接投影为列表。
MATCH (person)
RETURN person { .name, .age}
可从节点、关系及其他映射方便地构造映射投影。
{name: 'Alice', age: 38,
address: {city: 'London', residential: true}}
字面量映射用花括号声明,类似属性映射,并支持列表。
WITH {person: {name: 'Anne', age: 25}} AS p
RETURN p.person.name
访问嵌套映射的属性。
MERGE (p:Person {name: $map.name})
ON CREATE SET p = $map
映射可作为参数传入,既可整体使用也可按键访问。
MATCH (matchedNode:Person)
RETURN matchedNode
节点与关系以其数据映射形式返回。
map.name, map.age, map.children[0]
映射项可按键访问;无效键会报错。
n.property <> $value
使用比较运算符。
toString(n.property) = $value
使用函数。
n.number >= 1 AND n.number <= 10
用布尔运算符组合谓词。
1 <= n.number <= 10
用链式运算符组合谓词。
n:Person
检查节点标签。
variable IS NOT NULL
检查某值非 null,例如属性是否存在。
n.property IS NULL OR n.property = $value
属性不存在,或谓词为真。
n.property = $value
不存在的属性返回 null,且不等于任何值。
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)
确保模式至少有一次匹配。
NOT (n)-[:KNOWS]->(m)
从结果中排除匹配 (n)-[:KNOWS]->(m) 的内容。
n.property IN [$value1, $value2]
检查元素是否在列表中。
all(x IN coll WHERE x.property IS NOT NULL)
若谓词对列表全部元素为真则返回 true。
any(x IN coll WHERE x.property IS NOT NULL)
若谓词对列表至少一个元素为真则返回 true。
none(x IN coll WHERE x.property IS NOT NULL)
若谓词对列表全部元素为假则返回 true。
single(x IN coll WHERE x.property IS NOT NULL)
若谓词恰好对一个元素为真则返回 true。
CASE n.eyes
WHEN 'blue' THEN 1
WHEN 'brown' THEN 2
ELSE 3
END
返回匹配 WHEN 值对应的 THEN;ELSE 可选,缺失时视为 null。
CASE
WHEN n.eyes = 'blue' THEN 1
WHEN n.age < 40 THEN 2
ELSE 3
END
返回第一个为真的 WHEN 谓词对应的 THEN;谓词按顺序求值。
size($list)
列表元素个数。
reverse($list)
反转列表元素顺序。
head($list), last($list), tail($list)
head() 返回首元素,last() 返回末元素,tail() 返回除首元素外的其余部分。 空列表时上述函数均返回 null。
[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)
对列表每个元素求表达式并累加结果。
coalesce(n.property, $defaultValue)
第一个非 null 表达式。
timestamp()
自 1970-01-01 00:00:00 UTC 起的毫秒数。
id(nodeOrRelationship)
关系或节点的内部 id。
toInteger($expr)
尽可能将输入转为整数,否则返回 null。
toFloat($expr)
尽可能将输入转为浮点数,否则返回 null。
toBoolean($expr)
尽可能将输入转为布尔值,否则返回 null。
keys($expr)
返回节点、关系或映射的属性名字符串列表。
properties($expr)
返回包含节点或关系全部属性的映射。
length(path)
路径中的关系数量。
nodes(path)
路径中的节点列表。
relationships(path)
路径中的关系列表。
[x IN nodes(path) | x.prop]
从路径节点中提取属性。
point({x: $x, y: $y})
返回二维笛卡尔坐标系中的点。
point({latitude: $y, longitude: $x})
返回二维地理坐标系中的点,坐标以十进制度表示。
point({x: $x, y: $y, z: $z})
返回三维笛卡尔坐标系中的点。
point({latitude: $y, longitude: $x, height: $z})
返回三维地理坐标系中的点,经纬度为十进制度,高度单位为 米。
distance(point({x: $x1, y: $y1}), point({x: $x2, y: $y2}))
返回两点间直线距离的浮点数。单位与点坐标相同, 适用于二维与三维笛卡尔点。
distance(point({latitude: $y1, longitude: $x1}), point({latitude: $y2, longitude: $x2}))
返回两点间大地线距离(米),也可用于三维地理点。
date("2018-04-05")
从字符串解析并返回 date。
localtime("12:45:30.25")
返回无时区的 time。
time("12:45:30.25+01:00")
返回指定时区的 time。
localdatetime("2018-04-05T12:34:00")
返回无时区的 datetime。
datetime("2018-04-05T12:34:00[Europe/Berlin]")
返回指定时区的 datetime。
datetime({epochMillis: 3360000})
将 UNIX Epoch 时间 3360000 转为普通 datetime。
date({year: $year, month: $month, day: $day})
所有时间函数也可传入命名组件映射。本例由年、 月、日组件得到 date。各函数支持的组件集合不同。
datetime({date: $date, time: $time})
时间类型可由其他类型组合创建。本例由 date 与 time 创建 datetime。
date({date: $datetime, day: 5})
也可从更复杂类型中选取并覆盖个别组件来创建时间类型。本例 从 datetime 选取并覆盖 day 组件来创建 date。
WITH date("2018-04-05") AS d
RETURN d.year, d.month, d.day, d.week, d.dayOfWeek
访问器用于提取时间类型的各个组件。
duration("P1Y2M10DT12H45M30.25S")
返回时长:1 年 2 月 10 天 12 小时 45 分 30.25 秒。
duration.between($date1,$date2)
返回两个时间实例之间的时长。
WITH duration("P1Y2M10DT12H45M") AS d
RETURN d.years, d.months, d.days, d.hours, d.minutes
返回 1 年 14 月 10 天 12 小时 765 分钟。
WITH duration("P1Y2M10DT12H45M") AS d
RETURN d.years, d.monthsOfYear, d.days, d.hours, d.minutesOfHour
返回 1 年 2 月 10 天 12 小时 45 分钟。
date("2015-01-01") + duration("P1Y1M1D")
返回日期 2016-02-02。也可从时间实例减去时长。
duration("PT30S") * 10
返回 5 分钟时长。也可将时长除以一个数。
abs($expr)
绝对值。
rand()
返回 [0,1) 区间的随机数,每次调用得到新值。也适用于 选取子集或随机排序。
round($expr)
四舍五入到最近整数;ceil()/floor() 向上/向下取整。
sqrt($expr)
平方根。
sign($expr)
为零返回 0,为负返回 -1,为正返回 1。
sin($expr)
三角函数还包括 cos()、tan()、cot()、asin()、acos()、atan()、atan2()、haversin()。除非另有说明, 参数均应为弧度。
degrees($expr), radians($expr), pi()
弧度转角度;反向用 radians(),π 用 pi()。
log10($expr), log($expr), exp($expr), e()
常用对数、自然对数、e 的幂,以及 e 的值。
toString($expression)
表达式的字符串表示。
replace($original, $search, $replacement)
将所有 search 替换为 replacement。参数都必须是表达式。
substring($original, $begin, $subLength)
截取字符串的一部分。subLength 参数可选。
left($original, $subLength),
right($original, $subLength)
字符串前缀;字符串后缀。
trim($original), lTrim($original),
rTrim($original)
去除全部空白,或仅左/右侧空白。
toUpper($original), toLower($original)
转大写与转小写。
split($original, $delimiter)
将字符串拆分为字符串列表。
reverse($original)
反转字符串。
size($string)
计算字符串字符数。
type(a_relationship)
关系类型的字符串表示。
startNode(a_relationship)
关系的起始节点。
endNode(a_relationship)
关系的结束节点。
id(a_relationship)
关系的内部 id。
count(*)
匹配行数。
count(variable)
非 null 值的数量。
count(DISTINCT variable)
所有聚合函数也可配合 DISTINCT,去除重复值。
collect(n.property)
由各值组成列表,忽略 null。
sum(n.property)
对数值求和。类似函数还有 avg()、min()、max()。
percentileDisc(n.property, $percentile)
离散百分位。连续百分位用 percentileCont()。百分位参数范围 0.0–1.0。
stDev(n.property)
样本标准差。总体标准差用 stDevP()。
CREATE INDEX FOR (p:Person) ON (p.name)
在带 Person 标签、属性 name 的节点上创建索引。
CREATE INDEX index_name FOR ()-[k:KNOWS]-() ON (k.since)
在类型为 KNOWS、属性 since 的关系上创建名为 index_name 的索引。
CREATE INDEX FOR (p:Person) ON (p.surname)
OPTIONS {indexProvider: 'native-btree-1.0', indexConfig: {`spatial.cartesian.min`: [-100.0, -100.0], `spatial.cartesian.max`: [100.0, 100.0]}}
在带 Person 标签、属性 surname 的节点上,用 native-btree-1.0 提供者与给定的 spatial.cartesian 设置创建索引。其余索引设置使用默认值。
CREATE INDEX FOR (p:Person) ON (p.name, p.age)
在带 Person 标签、属性 name 与 age 的节点上创建复合索引; 若索引已存在则报错。
CREATE INDEX IF NOT EXISTS FOR (p:Person) ON (p.name, p.age)
若尚不存在,则在带 Person 标签、属性 name 与 age 的节点上创建复合索引; 若已存在则不做任何事。
CREATE LOOKUP INDEX lookup_index_name FOR (n) ON EACH labels(n)
在任意标签的节点上创建名为 lookup_index_name 的令牌查找索引。
CREATE LOOKUP INDEX FOR ()-[r]-() ON EACH type(r)
在任意关系类型上创建令牌查找索引。
CREATE FULLTEXT INDEX node_fulltext_index_name FOR (n:Friend) ON EACH [n.name]
OPTIONS {indexConfig: {`fulltext.analyzer`: 'swedish'}}
在节点上创建名为 node_fulltext_index_name、分析器为 swedish 的全文索引。节点全文索引 只能通过过程 db.index.fulltext.queryNodes 使用。 其余索引设置使用默认值。
CREATE FULLTEXT INDEX rel_fulltext_index_name FOR ()-[r:HAS_PET|BROUGHT_PET]-() ON EACH [r.since, r.price]
在关系上创建名为 rel_fulltext_index_name 的全文索引。关系全文索引 只能通过过程 db.index.fulltext.queryRelationships 使用。
SHOW INDEXES
列出全部索引。
MATCH (n:Person) WHERE n.name = $value
等值比较可自动使用索引。注意如 toLower(n.name) = $value 不会 使用索引。
MATCH (n:Person)
WHERE n.name IN [$value]
IN 列表检查可自动使用索引。
MATCH (n:Person)
WHERE n.name = $value and n.age = $value2
复合索引可自动用于两个属性的等值比较。注意需要 对复合索引的全部属性都有谓词才会使用该索引。
MATCH (n:Person)
USING INDEX n:Person(name)
WHERE n.name = $value
当 Cypher 选用了次优索引,或需要使用多个索引时,可强制指定索引。
DROP INDEX index_name
删除名为 index_name 的索引;若不存在则报错。
DROP INDEX index_name IF EXISTS
若存在则删除名为 index_name 的索引;不存在则不做任何事。
CREATE CONSTRAINT ON (p:Person)
ASSERT p.name IS UNIQUE
在 Person 标签与 name 属性上创建唯一属性约束。若其他同标签节点被更新 或创建时使用了已存在的 name,写操作会失败。该约束会同时创建配套 索引。
CREATE CONSTRAINT uniqueness ON (p:Person)
ASSERT p.age IS UNIQUE
在 Person 标签与 age 属性上创建名为 uniqueness 的唯一属性约束。若其他节点 带该标签被更新或创建时使用了已存在的 age,写操作会失败。该约束 会同时创建配套索引。
CREATE CONSTRAINT ON (p:Person)
ASSERT p.surname IS UNIQUE
OPTIONS {indexProvider: 'native-btree-1.0'}
在 Person 标签与 surname 属性上创建唯一属性约束,配套索引使用 native-btree-1.0 提供者。
CREATE CONSTRAINT ON (p:Person)
ASSERT p.name IS NOT NULL
(★) 在 Person 标签与 name 属性上创建节点属性存在性约束;若约束已存在则报错。 若创建该标签节点时缺少 name,或从已有 Person 节点移除 name 属性, 写操作会失败。
CREATE CONSTRAINT node_exists IF NOT EXISTS ON (p:Person)
ASSERT p.name IS NOT NULL
(★) 若 Person+name 的节点属性存在性约束,或名为 node_exists 的约束已存在则无操作;否则创建该约束。
CREATE CONSTRAINT ON ()-[l:LIKED]-()
ASSERT l.when IS NOT NULL
(★) 在 LIKED 类型与 when 属性上创建关系属性存在性约束。若创建该类型关系时 缺少 when,或从已有 LIKED 关系移除 when 属性, 写操作会失败。
CREATE CONSTRAINT relationship_exists ON ()-[l:LIKED]-()
ASSERT l.since IS NOT NULL
(★) 在 LIKED 类型与 since 属性上创建名为 relationship_exists 的关系属性存在性约束。若创建时缺少 since,或从已有 LIKED 关系移除 since,写操作会失败。
SHOW UNIQUE CONSTRAINTS YIELD *
列出全部唯一约束。
CREATE CONSTRAINT ON (p:Person)
ASSERT (p.firstname, p.surname) IS NODE KEY
(★) 在 Person 标签与 firstname、surname 属性上创建节点键约束。若该标签节点 创建时缺少二者之一,或二者组合不唯一,或已有 Person 节点的 firstname 和/或 surname 被修改而违反约束,写操作 会失败。
CREATE CONSTRAINT node_key ON (p:Person)
ASSERT (p.name, p.surname) IS NODE KEY
(★) 在 Person 标签与 name、surname 属性上创建名为 node_key 的节点键约束。若节点 创建时缺少二者之一,或组合不唯一,或已有 Person 节点的 name 和/或 surname 被修改而违反约束,写 操作会失败。
CREATE CONSTRAINT node_key_with_config ON (p:Person)
ASSERT (p.name, p.age) IS NODE KEY
OPTIONS {indexConfig: {`spatial.wgs-84.min`: [-100.0, -100.0], `spatial.wgs-84.max`: [100.0, 100.0]}}
(★) 在 Person 标签与 name、age 属性上创建名为 node_key_with_config 的节点键约束,并为配套索引指定 spatial.wgs-84 设置。其余索引设置使用默认值。
DROP CONSTRAINT uniqueness
删除名为 uniqueness 的约束;若不存在则报错。
DROP CONSTRAINT uniqueness IF EXISTS
若存在则删除名为 uniqueness 的约束;不存在则不做任何事。
CREATE OR REPLACE DATABASE myDatabase
(★) 创建名为 myDatabase 的数据库。若同名库已存在,则先删除再 创建新库。
STOP DATABASE myDatabase
(★) 停止数据库 myDatabase。
START DATABASE myDatabase
(★) 启动数据库 myDatabase。
SHOW DATABASES
列出系统中全部数据库及其信息。
SHOW DATABASES
YIELD name, currentStatus
WHERE name CONTAINS 'my' AND currentStatus = 'online'
按名称与在线状态过滤数据库信息,并可用条件进一步细化。
SHOW DATABASE myDatabase
列出数据库 myDatabase 的信息。
SHOW DEFAULT DATABASE
列出默认数据库的信息。
SHOW HOME DATABASE
列出当前用户主数据库的信息。
DROP DATABASE myDatabase IF EXISTS
(★) 若存在则删除数据库 myDatabase。
CREATE USER alice SET PASSWORD $password
创建新用户与密码。首次登录必须修改该密码。
ALTER USER alice SET PASSWORD $password CHANGE NOT 必填
为用户设置新密码。下次登录无需强制修改该密码。
ALTER USER alice IF EXISTS SET PASSWORD CHANGE 必填
若指定用户存在,则强制其下次登录时修改密码。
ALTER USER alice SET STATUS SUSPENDED
(★) 将用户状态改为 suspended。用 SET STATUS ACTIVE 可重新激活。
ALTER USER alice SET HOME DATABASE otherDb
(★) 将用户主数据库改为 otherDb。用 REMOVE HOME DATABASE 可取消主数据库并 回退到默认数据库。
ALTER CURRENT USER SET PASSWORD FROM $old TO $new
修改当前登录用户的密码。下次登录无需强制再改密码。
SHOW CURRENT USER
列出当前登录用户、状态、角色及是否需要改密。(★) 状态与 角色仅企业版可用。
SHOW USERS
列出系统全部用户、状态、角色及是否需要改密。(★) 状态与角色 仅企业版可用。
SHOW USERS
YIELD user, suspended
WHERE suspended = true
按名称与状态过滤系统用户,并可按是否 suspended 进一步细化。(★) 状态仅企业版可用。
RENAME USER alice TO alice_delete
将用户 alice 重命名为 alice_delete。
DROP USER alice_delete
删除用户。
CREATE ROLE my_role
创建角色。
CREATE ROLE my_second_role IF NOT EXISTS AS COPY OF my_role
创建名为 my_second_role 的角色(若不存在),作为现有 my_role 的副本。
RENAME ROLE my_second_role TO my_other_role
将角色 my_second_role 重命名为 my_other_role。
GRANT ROLE my_role, my_other_role TO alice
为用户分配角色。
REVOKE ROLE my_other_role FROM alice
从用户移除指定角色。
SHOW ROLES
列出系统中全部角色。
SHOW ROLES
YIELD role
WHERE role CONTAINS 'my'
按角色名过滤角色,并可按名称是否包含 'my' 进一步细化。
SHOW POPULATED ROLES WITH USERS
列出至少分配给一名用户的全部角色,以及这些角色下的用户。
DROP ROLE my_role
删除角色。
GRANT TRAVERSE ON GRAPH * NODES * TO my_role
授予某角色在所有图上遍历全部节点的权限。
DENY READ {prop} ON GRAPH foo RELATIONSHIP Type TO my_role
拒绝某角色在指定图中、指定类型关系上读取指定属性的权限。
GRANT MATCH {*} ON HOME GRAPH ELEMENTS Label TO my_role
授予某角色在主图上读取全部属性与遍历的权限。此处两项权限均适用于 图中带指定标签/类型的全部节点与关系。
GRANT CREATE ON GRAPH * NODES Label TO my_role
授予某角色在所有图上创建带指定标签节点的权限。
DENY DELETE ON GRAPH neo4j TO my_role
拒绝某角色在指定图上删除全部节点与关系的权限。
REVOKE SET LABEL Label ON GRAPH * FROM my_role
撤销某角色在所有图上设置指定标签的权限。
GRANT REMOVE LABEL * ON GRAPH foo TO my_role
授予某角色在指定图上移除全部标签的权限。
DENY SET PROPERTY {prop} ON GRAPH foo RELATIONSHIPS Type TO my_role
拒绝某角色在指定图中、指定类型关系上设置指定属性的 权限。
GRANT MERGE {*} ON GRAPH * NODES Label TO my_role
授予某角色在所有图上对指定标签节点合并全部属性的权限。
REVOKE WRITE ON GRAPH * FROM my_role
撤销某角色在所有图上的写权限。
DENY ALL GRAPH PRIVILEGES ON GRAPH foo TO my_role
拒绝某角色在指定图上的全部图权限。
SHOW PRIVILEGES AS COMMANDS
以 Cypher 命令形式列出系统全部权限。
SHOW PRIVILEGES
列出系统全部权限及其所属角色。
SHOW PRIVILEGES
YIELD role, action, access
WHERE role = 'my_role'
按角色、操作与访问方式过滤权限信息,并可按角色名进一步细化。
SHOW ROLE my_role PRIVILEGES AS COMMANDS
以 Cypher 命令形式列出分配给某角色的全部权限。
SHOW ROLE my_role, my_second_role PRIVILEGES AS COMMANDS
以 Cypher 命令形式列出多个角色各自的全部权限。
SHOW USER alice PRIVILEGES AS COMMANDS
以 Cypher 命令形式列出用户全部权限及其所属角色。
SHOW USER PRIVILEGES AS COMMANDS
以 Cypher 命令形式列出当前登录用户的全部权限及其所属角色。
GRANT ACCESS ON DATABASE * TO my_role
授予某角色访问并查询全部数据库的权限。
GRANT START ON DATABASE * TO my_role
授予某角色启动全部数据库的权限。
GRANT STOP ON DATABASE * TO my_role
授予某角色停止全部数据库的权限。
GRANT CREATE INDEX ON DATABASE foo TO my_role
授予某角色在指定数据库创建索引的权限。
GRANT DROP INDEX ON DATABASE foo TO my_role
授予某角色在指定数据库删除索引的权限。
GRANT SHOW INDEX ON DATABASE * TO my_role
授予某角色在全部数据库查看索引的权限。
DENY INDEX MANAGEMENT ON DATABASE bar TO my_role
拒绝某角色在指定数据库创建与删除索引的权限。
GRANT CREATE CONSTRAINT ON DATABASE * TO my_role
授予某角色在全部数据库创建约束的权限。
DENY DROP CONSTRAINT ON DATABASE * TO my_role
拒绝某角色在全部数据库删除约束的权限。
DENY SHOW CONSTRAINT ON DATABASE foo TO my_role
拒绝某角色在指定数据库查看约束的权限。
REVOKE CONSTRAINT ON DATABASE * FROM my_role
撤销某角色在全部数据库上创建/删除约束的授予与拒绝权限。
GRANT CREATE NEW LABELS ON DATABASE * TO my_role
授予某角色在全部数据库创建新标签的权限。
DENY CREATE NEW TYPES ON DATABASE foo TO my_role
拒绝某角色在指定数据库创建新关系类型的权限。
REVOKE GRANT CREATE NEW PROPERTY NAMES ON DATABASE bar FROM my_role
撤销某角色在指定数据库创建新属性名的授予权限。
GRANT NAME MANAGEMENT ON HOME DATABASE TO my_role
授予某角色在主数据库创建标签、关系类型与属性名的权限。
GRANT ALL ON DATABASE baz TO my_role
授予某角色在指定数据库上访问、创建/删除索引与约束,以及创建新标签、类型与属性名的 权限。
GRANT SHOW TRANSACTION (*) ON DATABASE foo TO my_role
授予某角色在指定数据库列出全部用户事务与查询的权限。
DENY TERMINATE TRANSACTION (user1, user2) ON DATABASES * TO my_role
拒绝某角色在全部数据库终止 user1 与 user2 事务/查询的权限。
REVOKE GRANT TRANSACTION MANAGEMENT ON HOME DATABASE FROM my_role
撤销某角色在主数据库列出并终止全部用户事务/查询的授予权限。
GRANT CREATE ROLE ON DBMS TO my_role
授予某角色创建角色的权限。
GRANT RENAME ROLE ON DBMS TO my_role
授予某角色重命名角色的权限。
GRANT DROP ROLE ON DBMS TO my_role
授予某角色删除角色的权限。
DENY ASSIGN ROLE ON DBMS TO my_role
拒绝某角色为用户分配角色的权限。
DENY REMOVE ROLE ON DBMS TO my_role
拒绝某角色从用户移除角色的权限。
REVOKE DENY SHOW ROLE ON DBMS FROM my_role
撤销某角色查看角色的拒绝权限。
GRANT ROLE MANAGEMENT ON DBMS TO my_role
授予某角色管理角色的全部权限。
GRANT CREATE USER ON DBMS TO my_role
授予某角色创建用户的权限。
GRANT RENAME USER ON DBMS TO my_role
授予某角色重命名用户的权限。
DENY ALTER USER ON DBMS TO my_role
拒绝某角色修改用户的权限。
REVOKE SET PASSWORDS ON DBMS FROM my_role
撤销某角色修改用户密码的授予与拒绝权限。
REVOKE GRANT SET USER STATUS ON DBMS FROM my_role
撤销某角色修改用户账户状态的授予权限。
GRANT SET USER HOME DATABASE ON DBMS TO my_role
授予某角色修改用户主数据库的权限。
GRANT DROP USER ON DBMS TO my_role
授予某角色删除用户的权限。
REVOKE DENY SHOW USER ON DBMS FROM my_role
撤销某角色查看用户的拒绝权限。
GRANT USER MANAGEMENT ON DBMS TO my_role
授予某角色管理用户的全部权限。
GRANT CREATE DATABASE ON DBMS TO my_role
授予某角色创建数据库的权限。
REVOKE DENY DROP DATABASE ON DBMS FROM my_role
撤销某角色删除数据库的拒绝权限。
DENY DATABASE MANAGEMENT ON DBMS TO my_role
拒绝某角色管理数据库的全部权限。
GRANT SHOW PRIVILEGE ON DBMS TO my_role
授予某角色查看权限的权限。
DENY ASSIGN PRIVILEGE ON DBMS TO my_role
拒绝某角色向角色分配权限的权限。
REVOKE GRANT REMOVE PRIVILEGE ON DBMS FROM my_role
撤销某角色从角色移除权限的授予权限。
REVOKE PRIVILEGE MANAGEMENT ON DBMS FROM my_role
撤销某角色管理权限相关的全部授予与拒绝权限。
GRANT ALL ON DBMS TO my_role
授予某角色执行全部角色/用户/数据库/权限管理的权限。
(★) 该功能仅在 Neo4j 企业版中可用。