Neo4j 全语法指南
下面我将详细介绍 Neo4j 图数据库的完整语法结构,包括最完整的语法形式。
1. 节点操作
创建节点
完整 CREATE 语法:
CREATE (node_name:label_name1:label_name2...
{
property1_name: property1_value,
property2_name: property2_value,
...
propertyN_name: propertyN_value
}
)
示例:
CREATE (p:Person:Employee
{
name: 'John Doe',
age: 35,
email: 'john@example.com',
join_date: date('2020-01-15')
}
)
匹配节点
完整 MATCH 语法:
MATCH (node_name:label_name
{
property1_name: property1_value,
...
}
)
WHERE condition
RETURN node_name
示例:
MATCH (p:Person
{
name: 'John Doe'
}
)
WHERE p.age > 30
RETURN p
2. 关系操作
创建关系
完整 CREATE 关系语法:
CREATE (node1_name:label1
{
property1: value1
}
)
-[rel_name:REL_TYPE
{
rel_property1: rel_value1,
...
}
]->
(node2_name:label2
{
property1: value1
}
)
示例:
CREATE (p:Person {name: 'Alice'})
-[r:KNOWS {since: 2015, met_at: 'Conference'}]->
(f:Person {name: 'Bob'})
匹配关系
完整 MATCH 关系语法:
MATCH (node1_name)-[rel_name:REL_TYPE
{
rel_property1: rel_value1,
...
}
]->(node2_name)
WHERE condition
RETURN rel_name
示例:
MATCH (p1:Person)-[r:KNOWS {since: 2015}]->(p2:Person)
WHERE p1.name = 'Alice'
RETURN r
3. 更新操作
SET 更新属性
完整 SET 语法:
MATCH (node_name:label
{
property: value
}
)
SET node_name.property1 = new_value1,
node_name.property2 = new_value2,
...
node_name.propertyN = new_valueN
示例:
MATCH (p:Person {name: 'John Doe'})
SET p.age = 36,
p.email = 'john.doe@newdomain.com',
p.title = 'Senior Developer'
REMOVE 删除属性
完整 REMOVE 语法:
MATCH (node_name:label)
REMOVE node_name.property1,
node_name.property2,
...
node_name.propertyN
示例:
MATCH (p:Person {name: 'John Doe'})
REMOVE p.title, p.temporary_id
4. 删除操作
删除节点
完整 DELETE 语法:
MATCH (node_name:label
{
property: value
}
)
DETACH DELETE node_name
示例:
MATCH (p:Person {name: 'John Doe'})
DETACH DELETE p
删除关系
完整 DELETE 关系语法:
MATCH (node1_name)-[rel_name:REL_TYPE]->(node2_name)
DELETE rel_name
示例:
MATCH (p1:Person {name: 'Alice'})-[r:KNOWS]->(p2:Person {name: 'Bob'})
DELETE r
5. 索引和约束
创建索引
完整 CREATE INDEX 语法:
CREATE [BTREE|TEXT|POINT|RANGE|LOOKUP] INDEX [index_name]
[IF NOT EXISTS]
FOR (n:label_name)
ON (n.property_name1, n.property_name2, ...)
[OPTIONS {option_map}]
示例:
CREATE BTREE INDEX person_name_index
FOR (p:Person)
ON (p.name, p.surname)
创建约束
完整 CREATE CONSTRAINT 语法:
CREATE CONSTRAINT [constraint_name]
[IF NOT EXISTS]
FOR (n:label_name)
REQUIRE n.property_name IS [UNIQUE|NOT NULL|NODE KEY|RELATIONSHIP KEY|PROPERTY TYPE]
[OPTIONS {option_map}]
示例:
CREATE CONSTRAINT unique_person_email
FOR (p:Person)
REQUIRE p.email IS UNIQUE
6. 查询子句
WHERE 子句
完整 WHERE 语法:
WHERE condition [AND|OR|XOR|NOT condition]*
条件可以包含:
- 属性比较:
property = value,property <> value,property > value等 - 正则表达式:
property =~ 'regex' - 存在性检查:
exists(property) - 字符串操作:
property STARTS WITH,property ENDS WITH,property CONTAINS - 列表操作:
property IN list,size(list) > value - 路径模式:
(a)-->(b),NOT (a)-->(b)
RETURN 子句
完整 RETURN 语法:
RETURN [DISTINCT] expression [AS alias][, ...]
[ORDER BY expression [ASC|DESC][, ...]]
[SKIP skip_value]
[LIMIT limit_value]
示例:
RETURN DISTINCT p.name AS employee_name, p.age
ORDER BY p.age DESC
SKIP 10
LIMIT 5
WITH 子句
完整 WITH 语法:
WITH expression [AS alias][, ...]
[WHERE condition]
示例:
MATCH (p:Person)
WITH p, p.age * 2 AS double_age
WHERE double_age > 60
RETURN p.name, double_age
7. 聚合函数
完整聚合语法:
aggregate_function([DISTINCT] expression) [AS alias]
常用聚合函数:
count()sum()avg()min()max()collect()percentileDisc()stDev()
示例:
MATCH (p:Person)
RETURN p.department, count(p) AS employees, avg(p.age) AS avg_age
8. 路径查询
可变长度路径
完整语法:
MATCH path = (start_node)-[rel:REL_TYPE*min..max]->(end_node)
示例:
MATCH path = (a:Person)-[:KNOWS*1..3]->(b:Person)
WHERE a.name = 'Alice'
RETURN path
最短路径
完整语法:
MATCH path = shortestPath((start_node)-[rel:REL_TYPE*]->(end_node))
示例:
MATCH path = shortestPath((a:Person)-[:KNOWS*]->(b:Person))
WHERE a.name = 'Alice' AND b.name = 'Charlie'
RETURN path
9. 函数
标量函数
- 字符串函数:
substring(),replace(),split(),trim(),toUpper(),toLower() - 数学函数:
abs(),ceil(),floor(),round(),rand(),log(),sqrt() - 时间函数:
date(),datetime(),localdatetime(),time(),localtime(),duration() - 空间函数:
point(),distance() - 类型转换:
toInteger(),toFloat(),toString()
列表函数
keys(),labels(),nodes(),relationships(),range()head(),last(),tail(),size(),reverse()reduce(),extract(),filter()
10. 事务控制
完整语法:
:begin
// Cypher statements
:commit
// or
:rollback
示例:
:begin
CREATE (p:Person {name: 'New Person'})
CREATE (c:Company {name: 'New Company'})
CREATE (p)-[:WORKS_AT]->(c)
:commit
11. 用户和权限管理
创建用户
CREATE USER username
[IF NOT EXISTS]
SET PASSWORD 'password'
[CHANGE [NOT] REQUIRED]
[SET STATUS {ACTIVE|SUSPENDED}]
[SET HOME DATABASE database]
角色管理
CREATE ROLE rolename
[IF NOT EXISTS]
[AS COPY OF existingrole]
GRANT ROLE rolename TO username
REVOKE ROLE rolename FROM username
权限管理
GRANT
{ACCESS|START|STOP|CREATE|DELETE|MATCH|MERGE|SET|REMOVE|INDEX|CONSTRAINT|WRITE|ALL}
ON {HOME GRAPH|GRAPH graphname|DEFAULT GRAPH}
[{NODES label|RELATIONSHIPS type}]
TO rolename
以上是 Neo4j 的主要完整语法结构。实际使用时可以根据需要简化部分语法,但这些完整形式展示了所有可能的选项和结构。
注意:
在 Cypher 查询 CREATE (p:Person:Admin {name: "Bob"}); 中,p 并不是节点的“名称”,而是一个临时变量(variable),仅在当前查询或上下文中用于引用该节点。它的作用类似于编程中的临时指针或别名,不会存储到数据库中,也不会成为节点的永久属性。
变量 p 的具体意义和用途:
-
临时引用节点
- 在同一个查询中,可以通过
p操作或返回该节点:CREATE (p:Person {name: "Bob"}) RETURN p; - 如果没有变量名,创建后无法直接引用该节点(除非再通过属性查询)。
- 在同一个查询中,可以通过
-
用于后续操作
- 在复杂查询中,变量可以连接多个操作。例如:
这里CREATE (p:Person {name: "Bob"})-[:WORKS_AT]->(c:Company {name: "Neo4j"}) RETURN p, c;p和c分别引用两个节点,方便建立关系。
- 在复杂查询中,变量可以连接多个操作。例如:
-
简化查询语句
- 避免重复书写长表达式,例如:
如果不使用MATCH (p:Person {name: "Bob"}) SET p.age = 30 RETURN p;p,可能需要重复匹配条件。
- 避免重复书写长表达式,例如:
与 标签(Label) 的区别
变量(如 p) | 标签(如 Person:Admin) |
|---|---|
| 临时别名,仅作用于当前查询 | 永久分类,存储到数据库中 |
| 用于查询中引用节点 | 用于索引、约束和分类节点 |
| 类似编程中的指针 | 类似数据库中的表名 |
注意事项
-
变量名是局部的
- 不同查询中可以使用相同的变量名(如
p),它们互不影响。
- 不同查询中可以使用相同的变量名(如
-
非唯一性
- 变量名不会限制节点的唯一性。多个节点可以用同一个变量名(取决于查询逻辑):
MATCH (p:Person) RETURN p; // 这里 p 可能匹配到多个 Person 节点
- 变量名不会限制节点的唯一性。多个节点可以用同一个变量名(取决于查询逻辑):
-
非存储属性
- 数据库不会保存变量名。执行完查询后,变量
p就消失了,只有标签和属性会被保留。
- 数据库不会保存变量名。执行完查询后,变量
总结
p是临时变量:仅用于当前查询中引用节点,类似编程中的“指针”。- 实际存储的是标签和属性:如
Person:Admin和{name: "Bob"}会被存入数据库。 - 用途:简化查询、连接多个操作、返回结果等。