eo4j 备忘单
STARTS WITH, ENDS WITH, CONTAINS
Neo4j 备忘单,包含入门资源和有关如何使用 Cypher 查询数据库的信息。
开始
Neo4j 入门
Neo4j 是一个图数据库,由通过关系连接在一起的节点组成。如果您有一个高度连接的数据集或有许多连接的查询,您可能会考虑使用 Graph 数据库。
- 下载 Neo4j 桌面版 下载 Neo4j 桌面版或服务器版
- Neo4j Sandbox 选择数据集 - 无需安装
- 云端的 Neo4j Aura免费 Neo4j 实例
- Neo4j GraphAcademy 免费、自定进度、动手在线培训
- GraphGists 使用 ase 和行业特定的示例图
图数据库概念
| 节点 | 节点通常用于表示数据中的实体 或事物 。例如,一个人 或电影 |
| 关系 | 关系用于将两个节点连接在一起并将数据组织成结构。例如,一个人演了 一部电影。关系具有类型 和方向,尽管在查询时可以忽略方向。 |
| 标签 | 标签用于将节点分组。例如,一个人可能有Person和Actor标签。 |
| 关系类型 | 每个关系都有一个类型。关系允许您探索图形的较小部分。 |
| 特性 | 节点和关系都可以针对它们设置属性。属性是名称-值对。 |
Neo4j 语法
读取查询结构
`[USE]
[MATCH WHERE]
[OPTIONAL 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]
[OPTIONAL MATCH WHERE]
[WITH [ORDER BY] [SKIP] [LIMIT]]
(CREATE | MERGE)*
[SET|DELETE|REMOVE|FOREACH]*
[RETURN [ORDER BY] [SKIP] [LIMIT]]
`
Neo4j 读取数据
Match 匹配
`MATCH (n:Person)-[:KNOWS]->(m:Person)
WHERE n.name = 'Alice'
`
节点模式可以包含标签和属性。
`MATCH (n)-->(m)
`
在 MATCH 中可以使用任何模式。
`MATCH (n {name: 'Alice'})-->(m)
`
具有节点属性的模式。
`MATCH p = (n)-->(m)
`
为 p 分配路径。
`OPTIONAL MATCH (n)-[r]->(m)
`
可选模式:空值将用于缺失的部分。
Where 查询
`WHERE n.property <> $value
`
使用谓语进行过滤。请注意,WHERE 始终是 MATCH、OPTIONAL MATCH 或 WITH 子句的一部分。将它放在查询中的不同子句之后会改变它的作用。
`WHERE EXISTS {
MATCH (n)-->(m) WHERE n.age = m.age
}
`
使用存在子查询进行过滤。
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(*)
`
匹配行数。有关更多信息,请参阅聚合函数。
With 和
`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 一起使用。
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
`
返回所有查询结果的并集,包括重复的行。
Neo4j 写入数据
创建
`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
`FOREACH (r IN relationships(path) |
SET r.marked = true)
`
对路径中的每个关系执行变异操作。
`FOREACH (value IN coll |
CREATE (:Person {name: value}))
`
对列表中的每个元素执行变异操作。
CALL 子查询
`CALL {
MATCH (p:Person)-[:FRIEND_OF]->(other:Person) RETURN p, other
UNION
MATCH (p:Child)-[:CHILD_OF]->(other:Parent) RETURN p, other
}
`
这将调用具有两个联合部分的子查询。之后可以对子查询的结果进行后处理。
调用程序
`CALL db.labels() YIELD label
`
这显示了对内置过程 db.labels 的独立调用,以列出数据库中使用的所有标签。请注意,必需的过程参数在过程名称后的方括号中明确给出。
`CALL db.labels() YIELD *
`
独立调用可以使用 YIELD * 返回所有列。
`CALL java.stored.procedureWithArgs
`
独立调用可以省略 YIELD 并且还通过语句参数隐式提供参数,例如,需要一个参数输入的独立调用可以通过传递参数映射 {input: 'foo'} 来运行。
`CALL db.labels() YIELD label
RETURN count(label) AS count
`
在较大的查询中调用内置过程 db.labels 以计算数据库中使用的所有标签。在更大的查询中调用总是需要使用 YIELD 显式传递参数和命名结果。
Import 导入
`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 = nullyieldnull而 nottrue。要检查表达式是否为null,请使用IS NULL. -
如果任何参数是 ,则算术表达式、比较和函数调用(除了
coalesce)将返回。nullnull -
尝试访问列表中缺失的元素或不存在的属性会产生
null。 -
在
OPTIONAL MATCH子句中,nulls将用于模式的缺失部分。
方式
`(n:Person)
`
带有 Person 标签的节点。
`(n:Person:Swedish)
`
带有人名和瑞典语标签的节点。
`(n:Person {name: $value})
`
具有声明属性的节点。
`()-[r {name: $value}]-()
`
将关系与声明的属性匹配。
`(n)-->(m)
`
从 n 到 m 的关系。
`(n)--(m)
`
n 和 m 之间任意方向的关系。
`(n:Person)-->(m)
`
节点 n 标记为与 m 有关系的人。
`(m)<-[:KNOWS]-(n)
`
类型 KNOWS 从 n 到 m 的关系。
`(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 的节点。
`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()、relationship()。
`MATCH p = (a)-[:KNOWS*]->()
RETURN relationships(p) AS r
`
可以使用命名路径和关系()返回包含可变长度路径的关系列表。
`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
`
检查某些内容是否不为空,例如属性是否存在。
`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)
`
如果谓语对于列表中的所有元素都为真,则返回真。
`any(x IN coll WHERE x.property IS NOT NULL)
`
如果谓语对于列表中的至少一个元素为真,则返回真。
`none(x IN coll WHERE x.property IS NOT NULL)
`
如果列表中所有元素的谓语都为假,则返回真。
`single(x IN coll WHERE x.property IS NOT NULL)
`
如果谓语对于列表中的一个元素为真,则返回真。
案例
`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)
`
第一个非空表达式。
`timestamp()
`
自 UTC 1970 年 1 月 1 日午夜以来的毫秒数。
`id(nodeOrRelationship)
`
关系或节点的内部 ID。
`toInteger($expr)
`
如果可能,将给定的输入转换为整数;否则返回空值。
`toFloat($expr)
`
如果可能,将给定的输入转换为浮点数;否则返回空值。
`toBoolean($expr)
`
如果可能,将给定的输入转换为布尔值;否则返回空值。
`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})
`
返回 3D 笛卡尔坐标系中的一个点。
`point({latitude: $y, longitude: $x, height: $z})
`
返回 3D 地理坐标系中的一个点,纬度和经度以十进制度数表示,高度以米为单位。
`distance(point({x: $x1, y: $y1}), point({x: $x2, y: $y2}))
`
返回一个浮点数,表示两点之间的线性距离。返回的单位将与点坐标的单位相同,并且适用于 2D 和 3D 笛卡尔点。
`distance(point({latitude: $y1, longitude: $x1}), point({latitude: $y2, longitude: $x2}))
`
以米为单位返回两点之间的测地线距离。它也可用于 3D 地理点。
Neo4j 函数
时间函数
`date("2018-04-05")
`
返回从字符串解析的日期。
`localtime("12:45:30.25")
`
返回没有时区的时间。
`time("12:45:30.25+01:00")
`
返回指定时区的时间。
`localdatetime("2018-04-05T12:34:00")
`
返回没有时区的日期时间。
`datetime("2018-04-05T12:34:00[Europe/Berlin]")
`
返回指定时区的日期时间。
`datetime({epochMillis: 3360000})
`
将 3360000 作为 UNIX 纪元时间转换为正常日期时间。
`date({year: $year, month: $month, day: $day})
`
也可以使用命名组件的映射调用所有时间函数。此示例从年、月和日组件返回日期。每个函数都支持一组不同的可能组件。
`datetime({date: $date, time: $time})
`
可以通过组合其他类型来创建时间类型。本示例根据日期和时间创建日期时间。
`date({date: $datetime, day: 5})
`
可以通过从更复杂的类型中进行选择以及覆盖单个组件来创建时间类型。此示例通过从日期时间中进行选择以及覆盖日期组件来创建日期。
`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(不含)范围内的随机数,[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()
`
以 10 为底的对数、自然对数、e 的参数幂,以及 e 的值。
字符串函数
`toString($expression)
`
表达式的字符串表示。
`replace($original, $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)
`
非空值的数量。
`count(DISTINCT variable)
`
所有聚合函数也采用 DISTINCT 运算符,它从值中删除重复项。
`collect(n.property)
`
从值中列出,忽略空值。
`sum(n.property)
`
求和数值。类似的函数有 avg()、min()、max()。
`percentileDisc(n.property, $percentile)
`
离散百分位。连续百分位数是 percentileCont()。百分位参数是从 0.0 到 1.0。
`stDev(n.property)
`
总体样本的标准差。对于整个人口使用 stDevP()。
Neo4j 模式操作
索引
`CREATE INDEX FOR (p:Person) ON (p.name)
`
在带有标签 Person 和属性名称的节点上创建索引。
`CREATE INDEX index_name FOR ()-[k:KNOWS]-() ON (k.since)
`
使用名称 index_name 为类型为 KNOWS 和属性的关系创建索引。
``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]}}
``
使用索引提供程序 native-btree-1.0 和给定的 spatial.cartesian 设置在带有标签 Person 和属性姓氏的节点上创建索引。其他索引设置将具有其默认值。
`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 和分析器瑞典语的节点上创建全文索引。节点上的全文索引只能由过程 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 和属性名称上创建唯一的属性约束。如果使用已存在的名称更新或创建具有该标签的任何其他节点,则写入操作将失败。此约束将创建随附索引。
`CREATE CONSTRAINT uniqueness ON (p:Person)
ASSERT p.age IS UNIQUE
`
在标签 Person 和属性 age 上创建唯一属性约束,名称为 uniqueness。如果任何其他具有该标签的节点被更新或创建时的年龄已经存在,则写入操作将失败。此约束将创建随附索引。
`CREATE CONSTRAINT ON (p:Person)
ASSERT p.surname IS UNIQUE
OPTIONS {indexProvider: 'native-btree-1.0'}
`
使用索引提供程序 native-btree-1.0 为随附的索引在标签 Person 和属性姓氏上创建唯一的属性约束。
`CREATE CONSTRAINT ON (p:Person)
ASSERT p.name IS NOT NULL
`
(★) 在标签Person 和属性名称上创建节点属性存在约束,如果约束已经存在则抛出错误。如果创建带有该标签的节点而没有名称,或者如果从带有 Person 标签的现有节点中删除了 name 属性,则写入操作将失败。
`CREATE CONSTRAINT node_exists IF NOT EXISTS ON (p:Person)
ASSERT p.name IS NOT NULL
`
(★) 如果标签 Person 和属性名称上的节点属性存在约束或任何名称为 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 类型和property 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 标签的现有节点上的名字和/或姓氏标签以违反这些约束,则写入操作将失败。
`CREATE CONSTRAINT node_key ON (p:Person)
ASSERT (p.name, p.surname) IS NODE KEY
`
(★) 在标签Person 和属性name 和surname 上创建节点键约束,名称为node_key。如果创建具有该标签的节点时没有姓名和姓氏,或者两者的组合不是唯一的,或者如果修改了具有 Person 标签的现有节点上的姓名和/或姓氏标签以违反这些约束,则写入操作将失败。
``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 并为随附索引提供空间.wgs-84 设置。其他索引设置将具有其默认值。
`DROP CONSTRAINT uniqueness
`
删除名为 uniqueness 的约束,如果约束不存在则抛出错误。
`DROP CONSTRAINT uniqueness IF EXISTS
`
如果存在,则删除名称为 uniqueness 的约束,如果不存在,则不执行任何操作。
表现
- 尽可能使用参数而不是文字。这允许 Cypher 重用您的查询,而不必解析和构建新的执行计划。
- 始终为可变长度模式设置上限。有可能让查询变得疯狂并错误地触及图中的所有节点。
- 仅返回您需要的数据。避免返回整个节点和关系 - 相反,选择您需要的数据并仅返回该数据。
- 使用
PROFILE/EXPLAIN来分析查询的性能。有关这些主题和其他主题(例如规划器提示)的更多信息,请参阅查询调优。
Neo4j 多数据库
数据库管理
`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,如果存在。
Neo4j 安全性
用户管理
`CREATE USER alice SET PASSWORD $password
`
创建一个新用户和密码。此密码必须在第一次登录时更改。
`ALTER USER alice SET PASSWORD $password CHANGE NOT REQUIRED
`
为用户设置新密码。该用户下次登录时无需更改此密码。
`ALTER USER alice IF EXISTS SET PASSWORD CHANGE REQUIRED
`
如果指定的用户存在,则强制该用户在下次登录时更改其密码。
`ALTER USER alice SET STATUS 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
`
列出系统中的用户,按名称和状态过滤,并根据是否暂停进一步细化。(★) 状态仅为企业版。
`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'
`
列出角色,按角色名称过滤,并根据名称是否包含"我的"进一步细化。
`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
`
将所有属性的读取权限和主图中的遍历权限授予角色。在这里,这两种权限都适用于图中具有指定标签/类型的所有节点和关系。
(★) Graph写权限
`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
`
将所有图上指定标签的 set label 权限撤消给角色。
`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
`
从角色撤销所有授予和拒绝的管理权限的权限。
(★)DBMS权限
`GRANT ALL ON DBMS TO my_role
`
授予对角色执行所有角色管理、用户管理、数据库管理和权限管理的权限