Neo4j

Neo4j 是一个高性能的NoSQL图形数据库,它使用图形结构来存储数据,
并支持通过Cypher查询语言进行数据查询。

Neo4j特别适合处理复杂的关系数据,如社交网络、推荐系统、知识图谱等。

它提供了一种灵活且强大的数据模型,可以轻松地表示实体和它们之间的关系。

主要特点

  1. 图形数据模型:Neo4j使用节点(Node)关系(Relationship)属性(Property)来表示数据,这种模型非常适合表示实体之间的关系。
  2. Cypher查询语言:Cypher是一种声明式查询语言,用于在Neo4j中检索数据。它易于学习,并且支持强大的模式匹配。
  3. 高性能:Neo4j能够提供快速的数据读写操作,支持大规模的数据集和复杂的查询。
  4. 可扩展性:Neo4j支持水平扩展,可以通过增加更多的服务器来提高性能和存储能力。
  5. 集成和连接器:Neo4j提供了多种连接器,可以轻松地与其他系统和数据库集成。
  6. 开发者友好:Neo4j有丰富的文档、社区支持和开发工具,如Neo4j Bloom、Neo4j Browser等。

安装和设置

1
docker volume create neo4j_data
1
2
3
4
5
6
7
docker run \
--name neo4j \
--restart always \
--publish=7474:7474 --publish=7687:7687 \
--env NEO4J_AUTH=neo4j/your_password \
--volume=neo4j_data:/data \
neo4j:5.15.0

数据库操作示例

  1. 创建数据库:在Neo4j Browser中,执行以下命令创建一个新的数据库。

    1
    CREATE DATABASE mydatabase;
  2. 切换数据库:切换到刚刚创建的数据库。

    1
    USE DATABASE mydatabase;
  3. 创建节点和关系:使用Cypher创建节点和关系。

    1
    CREATE (n:Person {name: 'Alice'})-[:KNOWS]->(m:Person {name: 'Bob'});
  4. 查询数据:使用Cypher查询数据。

    1
    MATCH (p:Person)-[:KNOWS]->(friend:Person) WHERE p.name = 'Alice' RETURN friend.name;
  5. 关闭数据库:在完成操作后,关闭数据库连接。

    1
    DROP DATABASE mydatabase;

学习资源

图数据模型

节点(Node)

节点是图形数据模型中的基本实体,它代表一个特定的对象或概念。

在Neo4j中,节点通常由一个唯一的标识符(ID)和一个或多个标签(Label)组成。

标签用于分类节点,并且可以包含关键字和描述性信息。

例如,在一个社交网络中,每个用户可以是一个节点,节点可能有“Person”标签。

关系(Relationship)

关系表示节点之间的连接。

在Neo4j中,关系由两个节点之间的有向边(Edge)表示,并且可以有方向(箭头表示)。

关系也可以有标签,用于描述两个节点之间的特定关系。

例如,在社交网络中,用户之间的“朋友”关系可以用一个有向边表示,从一个人指向另一个人。

属性(Property)

属性是附加在节点或关系上的键值对,用于存储节点的额外信息。

属性可以用于存储任何类型的数据,如字符串、数字、日期等。

例如,一个用户的节点可能有“姓名”、“年龄”和“电子邮件”等属性。

示例

假设我们正在构建一个社交网络的图形数据库,其中包含用户和他们之间的朋友关系。以下是这个网络的一些图形数据模型元素:

  • 节点
    • 用户1(ID: 1,标签: Person,属性: 姓名: Alice,年龄: 30)
    • 用户2(ID: 2,标签: Person,属性: 姓名: Bob,年龄: 25)
  • 关系
    • 用户1与用户2之间的“朋友”关系(从用户1指向用户2)
  • 属性
    • 用户1的属性:姓名: Alice,年龄: 30
    • 用户2的属性:姓名: Bob,年龄: 25

创建节点和关系

首先,我们需要创建两个节点(用户1和用户2)以及它们之间的“朋友”关系。

1
CREATE (user1:Person {name: 'Alice', age: 30})-[:FRIEND]->(user2:Person {name: 'Bob', age: 25});

这个Cypher命令创建了一个从用户1到用户2的“朋友”关系,并给两个用户节点添加了姓名和年龄属性。

查询节点和关系

一旦节点和关系被创建,我们就可以使用Cypher来查询它们。例如,我们可以查询Alice的所有朋友:

1
MATCH (a:Person)-[:FRIEND]->(friend:Person) WHERE a.name = 'Alice' RETURN friend.name;

这个查询将返回所有与Alice有“朋友”关系的用户名称。

查询节点的属性

我们也可以查询节点的属性。例如,查询Alice的年龄:

1
MATCH (a:Person) WHERE a.name = 'Alice' RETURN a.age;

这个查询将返回Alice的年龄。

查询关系的属性

如果关系有属性,我们也可以查询它们。例如,如果我们给“朋友”关系添加了一个属性“since”,表示两个用户成为朋友的时间:

1
MATCH (a:Person)-[r:FRIEND]->(friend:Person) WHERE a.name = 'Alice' RETURN r.since;

这个查询将返回Alice和她的朋友之间的“since”属性值。

更新节点和关系的属性

如果我们想要更新节点的属性,可以使用SET关键字。例如,更新Alice的年龄:

1
MATCH (a:Person) WHERE a.name = 'Alice' SET a.age = 31;

这个命令将Alice的年龄更新为31岁。

Cypher

Cypher 是 Neo4j 图形数据库的查询语言,它是一种声明式、事务性的查询语言,专门用于在图形数据库中检索数据。

Cypher 的语法类似于 SQL,但是它被设计用来利用图形数据的结构化查询,特别是针对节点、关系和属性的操作。

Cypher 基础语法

  • 点(Node):使用圆括号 () 来表示节点,可以包含标签和属性。
  • 关系(Relationship):使用中划线 ----- 来表示节点之间的关系,可以包含关系类型和方向。
  • 属性(Property):使用冒号 : 来表示节点或关系的属性。
  • WHERE 子句:用于过滤查询结果,类似于 SQL 中的 WHERE 子句。
  • RETURN 子句:用于返回查询结果中感兴趣的列,类似于 SQL 中的 SELECT 子句。
  • ORDER BY 子句:用于对查询结果进行排序。
  • LIMIT/OFFSET 子句:用于限制查询结果的行数或跳过特定的行数。

示例查询

以下是一些基本的 Cypher 查询示例:

  1. 查找所有具有特定标签的节点
    1
    MATCH (n) WHERE n:Person RETURN n.name;
  2. 查找两个节点之间的特定关系
    1
    MATCH (p:Person)-[:FRIEND]->(friend:Person) WHERE p.name = 'Alice' RETURN friend.name;
  3. 查找节点的所有邻居
    1
    MATCH (p:Person)-[:FRIEND]->(friend) RETURN p.name, friend.name;
  4. 更新节点的属性
    1
    MATCH (p:Person) WHERE p.name = 'Alice' SET p.age = 31;
  5. 删除节点和关系
    1
    MATCH (p:Person) WHERE p.name = 'Alice' DELETE p;