neo4j文档学习记录
2022-07-14 14:19:00 # 开发

入门指南

Neo4j

Neo4j 是世界领先的图形数据库。该架构旨在优化管理、存储和遍历节点和关系。图数据库采用属性图方式,对遍历性能和操作运行时间都有好处。

Cypher

Cypher 是 Neo4j 的图形查询语言,允许用户从图形数据库存储和检索数据。它是一种声明性的、受 SQL 启发的语言,用于使用 ASCII 艺术语法描述图形中的视觉模式。该语法提供了一种视觉和逻辑方式来匹配图中节点和关系的模式。

使用Neo4j

设置使用 Neo4j 和 Cypher 开发应用程序的环境的最简单方法是使用 Neo4j Desktop。从https://neo4j.com/download/下载

Cypher使用

名称是区分大小写的,:PERSON,:Person:person是三个不同的标签,以及nN是两个不同的变量。

查询是使用各种子句构建的,以下是一些用于从图中读取的子句示例:

  • MATCH:要匹配的图形模式。这是从图表中获取数据的最常用方法。
  • WHERE: 本身不是一个子句,而是MATCH,OPTIONAL MATCH和的一部分WITH。向模式添加约束,或过滤通过WITH.
  • RETURN: 返回什么。

查询更新

使用以下查询创建一个简单的示例图:

1
2
3
4
5
6
7
CREATE (john:Person {name: 'John'})
CREATE (joe:Person {name: 'Joe'})
CREATE (steve:Person {name: 'Steve'})
CREATE (sara:Person {name: 'Sara'})
CREATE (maria:Person {name: 'Maria'})
CREATE (john)-[:FRIEND]->(joe)-[:FRIEND]->(steve)
CREATE (john)-[:FRIEND]->(sara)-[:FRIEND]->(maria)

image-20220714150548083

构造一个查询,查询john朋友的朋友

1
2
MATCH (john {name: 'John'})-[:FRIEND]->()-[:FRIEND]->(fof)
RETURN john.name, fof.name

获取用户列表,从列表中找到具有名称的所有节点,匹配他们的朋友并仅返回那些具有以**’S’开头的‘name’**属性的follower user。

1
2
3
MATCH (user)-[:FRIEND]->(follower)
WHERE user.name IN ['Joe', 'John', 'Sara', 'Maria', 'Steve'] AND follower.name =~ 'S.*'
RETURN user.name, follower.name

image-20220714151802994

这些是用于更新图形的子句示例:

  • CREATE(和DELETE):创建(和删除)节点和关系。
  • SET(和REMOVE):为属性设置值并在节点上添加标签 usingSET和 useREMOVE删除它们。
  • MERGE:匹配现有的或创建新的节点和模式。这与独特的约束一起特别有用。

这是一个更新图表的示例,将聚合数据写入图表:

1
2
3
4
MATCH (n {name: 'John'})-[:FRIEND]-(friend)
WITH n, count(friend) AS friendsCount
SET n.friendsCount = friendsCount
RETURN n

image-20220714154820494

路径匹配

Neo4j Cypher利用关系同构进行路径匹配,是减少结果集大小和防止无限遍历的非常有效的方法。在 Neo4j 中,所有关系都有一个方向。

同态:如果查询正在寻找长度路径n并且不关心方向,n则将返回一个长度路径,一遍又一遍地重复两个节点。

例如,查找所有具有 5 个关系的路径并且不关心关系方向:

1
2
3
4
MATCH p = ()-[*5]-()
RETURN nodes(p)

如果使用同态,这将返回两个结果记录[a,b,a,b,a,b],以及[b,a,b,a,b,a]。

节点同构:对于每个路径匹配记录,不能多次返回同一节点。

在另一个双节点示例中,例如(a:Node)-[r:R]->(b:Node); 使用节点同构约束只能找到长度为 1 的路径。

1
2
3
4
MATCH p = ()-[*1]-()
RETURN nodes(p)

如果使用节点同构,这将返回两个结果记录[a, b],以及[b, a]。

关系同构:对于每个路径匹配记录,不能多次返回相同的关系。

在另一个双节点示例中,例如(a:Node)-[r:R]->(b:Node); 使用关系同构约束只能找到长度为 1 的路径。

1
2
3
4
MATCH p = ()-[*1]-()
RETURN nodes(p)

这将返回两个结果记录[a, b],以及[b, a].

Cypher 利用关系同构进行路径匹配:寻找用户朋友的朋友,并且不能返回用户本身。创建如下数据

1
2
3
4
5
6
CREATE
(adam:User {name: 'Adam'}),
(pernilla:User {name: 'Pernilla'}),
(david:User {name: 'David'}),
(adam)-[:FRIEND]->(pernilla),
(pernilla)-[:FRIEND]->(david)

寻找Adam朋友的朋友

1
2
MATCH (user:User {name: 'Adam'})-[r1:FRIEND]-()-[r2:FRIEND]-(friend_of_a_friend)
RETURN friend_of_a_friend.name AS fofName

image-20220714161410979

如果查询应该返回用户,则可以将匹配分布在多个MATCH子句中,如下所示:

1
2
3
MATCH (user:User {name: 'Adam'})-[r1:FRIEND]-(friend)
MATCH (friend)-[r2:FRIEND]-(friend_of_a_friend)
RETURN friend_of_a_friend.name AS fofName

目前先看到这,后续的语法学完之后再补充。

参考

https://neo4j.com/docs/