目录
查找所有节点
MATCH (n) RETURN n
创建节点
CREATE (:Person {name: "Alice", age: 25})
这会创建一个 Person
标签的节点,并赋予 name
和 age
属性。
为什么Person前面有个冒号?
- 在 Cypher 语法中,
:
号用于标识标签(Label)。 - 如果你在
MATCH
、CREATE
等语句中写Person
,Neo4j 可能会把它当作一个变量,而:Person
确保 Neo4j 知道这是一个标签。
创建带有关系的节点
CREATE (a:Person {name: "Alice"})-[:FRIENDS_WITH]->(b:Person {name: "Bob"})
这将创建 Alice
和 Bob
两个 Person
节点,并建立 FRIENDS_WITH
关系。
为什么FRIENDS_WITH
前面要加个冒号?
在 Cypher 里,关系必须有明确的类型,所以 :
号用于指定关系的名称。如果关系类型前不加 :
,Neo4j 会报错,因为它无法识别关系的名称!
注意
如果 Alice
和 Bob
已经存在,上述 CREATE
语句仍然会创建新的 Alice
和 Bob
节点,而不是复用已有的节点。这样可能会导致数据库中出现多个 Alice
和 Bob
节点,数据冗余。
MERGE (a:Person {name: "Alice"})
MERGE (b:Person {name: "Bob"})
MERGE (a)-[:FRIENDS_WITH]->(b)
如上图所示,出现了两个Alice和两个Bob
如何避免重复创建?
使用 MERGE
代替 CREATE
如果你希望只创建不存在的节点,可以用 MERGE
:
MERGE (a:Person {name: "Alice"})
MERGE (b:Person {name: "Bob"})
MERGE (a)-[:FRIENDS_WITH]->(b)
MERGE
的作用:
- 如果
Alice
或Bob
不存在,就创建它们。 - 如果
Alice
和Bob
已经存在,则不会重复创建。 MERGE (a)-[:FRIENDS_WITH]->(b)
确保关系也是唯一的。
用 ON CREATE
/ ON MATCH
设置额外属性
MERGE
还能配合 ON CREATE
和 ON MATCH
添加额外逻辑:
MERGE (a:Person {name: "Alice"})
ON CREATE SET a.createdAt = timestamp()
ON MATCH SET a.lastSeen = timestamp()
MERGE (b:Person {name: "Bob"})
ON CREATE SET b.createdAt = timestamp()
ON MATCH SET b.lastSeen = timestamp()
MERGE (a)-[:FRIENDS_WITH]->(b)
作用:
- 如果
Alice
和Bob
第一次创建,添加createdAt
时间戳。 - 如果
Alice
和Bob
已经存在,更新lastSeen
。 ON CREATE
:当节点或关系被创建时执行。这通常用于设置只在节点首次创建时才需要的属性。ON MATCH
:当节点或关系已经存在时执行。通常用于更新已有节点的属性。a
和b
是节点变量,它们用来引用你在查询中创建或匹配的节点。可以把它们理解为占位符,用来代表查询中的具体节点或实体。
删除节点
如果你想删除某个节点(但不能有任何关系):
MATCH (p:Person {name: "Alice"}) DELETE p
如果该节点有关系,先删除关系:
MATCH (p:Person {name: "Alice"})-[r]-() DELETE r, p
疑问解答Q&A
Q:为什么这里的r前面没有冒号,它不是关系吗?
A:这是因为
r
是关系的变量,而不是关系类型。我们需要区分关系的类型和关系的变量。在 Cypher 中,冒号(:
)用于表示标签(Label)或关系类型(Relationship Type)。而在这里,r
是关系的变量,并不是关系类型,所以不需要冒号。
Q:我什么时候该使用关系类型?什么时候该使用关系变量呢?
A:如果你想对节点的特定类型的关系进行操作(比如:朋友关系、工作关系、喜欢关系等),你就需要使用关系类型。关系类型是用冒号
:
来指定的。如果你想对一个节点的所有关系进行操作,而不关心这些关系的具体类型,你就需要使用关系变量。关系变量是用来引用某个特定关系实例的占位符。
删除所有节点及其关系
MATCH (n) DETACH DELETE n
MATCH (n)
:匹配所有节点。DETACH DELETE n
:DETACH
关键字确保删除节点时,也会同时删除与该节点相关的所有关系。DELETE
用于删除节点本身。
这个查询会删除数据库中所有的节点和它们的关系。
注意事项:
- 执行此操作后,所有数据都将丢失,不可恢复。请确保你已经备份了重要数据,或者你确实希望清空整个数据库。