Neo4j全语法指南

253 阅读5分钟

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 的具体意义和用途:

  1. 临时引用节点

    • 在同一个查询中,可以通过 p 操作或返回该节点:
      CREATE (p:Person {name: "Bob"}) RETURN p;
      
    • 如果没有变量名,创建后无法直接引用该节点(除非再通过属性查询)。
  2. 用于后续操作

    • 在复杂查询中,变量可以连接多个操作。例如:
      CREATE (p:Person {name: "Bob"})-[:WORKS_AT]->(c:Company {name: "Neo4j"})
      RETURN p, c;
      
      这里 pc 分别引用两个节点,方便建立关系。
  3. 简化查询语句

    • 避免重复书写长表达式,例如:
      MATCH (p:Person {name: "Bob"})
      SET p.age = 30
      RETURN p;
      
      如果不使用 p,可能需要重复匹配条件。

标签(Label) 的区别

变量(如 p标签(如 Person:Admin
临时别名,仅作用于当前查询永久分类,存储到数据库中
用于查询中引用节点用于索引、约束和分类节点
类似编程中的指针类似数据库中的表名

注意事项

  1. 变量名是局部的

    • 不同查询中可以使用相同的变量名(如 p),它们互不影响。
  2. 非唯一性

    • 变量名不会限制节点的唯一性。多个节点可以用同一个变量名(取决于查询逻辑):
      MATCH (p:Person) RETURN p; // 这里 p 可能匹配到多个 Person 节点
      
  3. 非存储属性

    • 数据库不会保存变量名。执行完查询后,变量 p 就消失了,只有标签和属性会被保留。

总结

  • p 是临时变量:仅用于当前查询中引用节点,类似编程中的“指针”。
  • 实际存储的是标签和属性:如 Person:Admin{name: "Bob"} 会被存入数据库。
  • 用途:简化查询、连接多个操作、返回结果等。