入门指南
Neo4j
Neo4j 是世界领先的图形数据库。该架构旨在优化管理、存储和遍历节点和关系。图数据库采用属性图方式,对遍历性能和操作运行时间都有好处。
Cypher
Cypher 是 Neo4j 的图形查询语言,允许用户从图形数据库存储和检索数据。它是一种声明性的、受 SQL 启发的语言,用于使用 ASCII 艺术语法描述图形中的视觉模式。该语法提供了一种视觉和逻辑方式来匹配图中节点和关系的模式。
使用Neo4j
设置使用 Neo4j 和 Cypher 开发应用程序的环境的最简单方法是使用 Neo4j Desktop。从https://neo4j.com/download/下载
Cypher使用
名称是区分大小写的,
:PERSON
,:Person
和:person
是三个不同的标签,以及n
和N
是两个不同的变量。
查询是使用各种子句构建的,以下是一些用于从图中读取的子句示例:
MATCH
:要匹配的图形模式。这是从图表中获取数据的最常用方法。WHERE
: 本身不是一个子句,而是MATCH
,OPTIONAL MATCH
和的一部分WITH
。向模式添加约束,或过滤通过WITH
.RETURN
: 返回什么。
查询更新
使用以下查询创建一个简单的示例图:
1 | CREATE (john:Person {name: 'John'}) |
构造一个查询,查询john朋友的朋友
1 | MATCH (john {name: 'John'})-[:FRIEND]->()-[:FRIEND]->(fof) |
获取用户列表,从列表中找到具有名称的所有节点,匹配他们的朋友并仅返回那些具有以**’S’开头的‘name’**属性的follower user。
1 | MATCH (user)-[:FRIEND]->(follower) |
这些是用于更新图形的子句示例:
CREATE
(和DELETE
):创建(和删除)节点和关系。SET
(和REMOVE
):为属性设置值并在节点上添加标签 usingSET
和 useREMOVE
删除它们。MERGE
:匹配现有的或创建新的节点和模式。这与独特的约束一起特别有用。
这是一个更新图表的示例,将聚合数据写入图表:
1 | MATCH (n {name: 'John'})-[:FRIEND]-(friend) |
路径匹配
Neo4j Cypher利用关系同构进行路径匹配,是减少结果集大小和防止无限遍历的非常有效的方法。在 Neo4j 中,所有关系都有一个方向。
同态:如果查询正在寻找长度路径n
并且不关心方向,n
则将返回一个长度路径,一遍又一遍地重复两个节点。
例如,查找所有具有 5 个关系的路径并且不关心关系方向:
1 | MATCH p = ()-[*5]-() |
节点同构:对于每个路径匹配记录,不能多次返回同一节点。
在另一个双节点示例中,例如(a:Node)-[r:R]->(b:Node)
; 使用节点同构约束只能找到长度为 1 的路径。
1 | MATCH p = ()-[*1]-() |
关系同构:对于每个路径匹配记录,不能多次返回相同的关系。
在另一个双节点示例中,例如(a:Node)-[r:R]->(b:Node)
; 使用关系同构约束只能找到长度为 1 的路径。
1 | MATCH p = ()-[*1]-() |
Cypher 利用关系同构进行路径匹配:寻找用户朋友的朋友,并且不能返回用户本身。创建如下数据
1 | CREATE |
寻找Adam朋友的朋友
1 | MATCH (user:User {name: 'Adam'})-[r1:FRIEND]-()-[r2:FRIEND]-(friend_of_a_friend) |
如果查询应该返回用户,则可以将匹配分布在多个MATCH
子句中,如下所示:
1 | MATCH (user:User {name: 'Adam'})-[r1:FRIEND]-(friend) |
目前先看到这,后续的语法学完之后再补充。