图数据库概念

简介

本指南涵盖了图数据库的基础知识。

Neo4j 使用属性图(property graph)数据库模型。图数据结构由节点(离散对象)组成,这些节点可以通过关系进行连接。下图展示了一个包含三个节点(圆圈)和三个关系(箭头)的图。

graph concept three nodes arr
图 1. 图结构概念

Neo4j 属性图数据库模型包含:

  • 节点用于描述领域中的实体(离散对象)。

  • 节点可以拥有零个或多个标签,用于定义(分类)它们属于哪种类型的节点。

  • 关系描述了源节点目标节点之间的连接。

  • 关系始终具有方向性(单向)。

  • 关系必须具有类型(单个类型),用于定义(分类)它们属于哪种类型的关系。

  • 节点和关系可以拥有属性(键值对),用以进一步描述它们。

在数学中,图论是研究图的学科。

在图论中:

  • 节点也被称为顶点或点。

  • 关系也被称为边、链接或线。

示例图

下面展示的示例图介绍了属性图的基本概念。

graph simple arr
图 2. 示例图

要创建该示例图,请使用 Cypher® 子句 CREATE

CREATE (:Person:Actor {name: 'Tom Hanks', born: 1956})-[:ACTED_IN {roles: ['Forrest']}]->(:Movie {title: 'Forrest Gump', released: 1994})<-[:DIRECTED]-(:Person {name: 'Robert Zemeckis', born: 1951})

节点

节点用于表示领域中的实体(离散对象)。

最简单的图是仅包含一个节点且没有关系的图。考虑以下仅包含单个节点的图:

graph single node arr
图 3. 节点

节点标签为:

  • Person

  • Actor(演员)

属性为:

  • name: Tom Hanks

  • born: 1956

可以使用以下 Cypher 查询来创建该节点:

CREATE (:Person:Actor {name: 'Tom Hanks', born: 1956})

节点标签

标签通过将节点分组(分类)到集合中来塑造领域,同一集合中的所有节点都具有特定的标签。

例如,所有代表用户的节点都可以标记为 User。有了这些标签,你就可以要求 Neo4j 仅对用户节点执行操作,例如查找所有具有特定名字的用户。

由于标签可以在运行时添加和删除,它们也可以用于标记节点的临时状态。例如,Suspended 标签可以用于表示处于暂停状态的银行账户,Seasonal 标签可以表示当前正值产季的蔬菜。

一个节点可以拥有零个到多个标签。

在示例图中,使用节点标签 PersonActorMovie 来描述(分类)这些节点。可以添加更多标签来表示数据的不同维度。

下图展示了多标签的使用。

graphdb simple labels multi arr
图 4. 多标签

关系

关系描述了源节点目标节点之间是如何关联的。节点也可以与自身建立关系。

一个关系:

  • 连接源节点目标节点

  • 具有方向性(单向)。

  • 必须具有类型(单个类型),用于定义(分类)它是哪种类型的关系。

  • 可以拥有属性(键值对),用于进一步描述该关系。

关系将节点组织成结构,使图能够表现为列表、树、映射或复合实体——任何结构都可以组合成更复杂、互连程度更高的结构。

graph example relationship arr
图 5. 关系

关系类型:ACTED_IN

属性为:

  • roles: ['Forrest']

  • performance: 5

roles 属性拥有一个包含单个项目('Forrest')的数组值。

可以使用以下 Cypher 查询来创建该关系:

CREATE ()-[:ACTED_IN {roles: ['Forrest'], performance: 5}]->()

你必须先创建或引用源节点目标节点,才能创建关系。

关系始终具有方向。但是,在不重要的情况下可以忽略方向。这意味着除非为了正确描述数据模型,否则无需添加相反方向的重复关系。

节点可以拥有指向其自身的关系。如果要表达 Tom Hanks KNOWS(认识)他自己,可以表示为:

graphdb nodes and rel self arr
图 6. 指向单个节点的关系

关系类型

一个关系必须有且仅有一个关系类型。

下方是一个 ACTED_IN 关系,其中 Tom Hanks 节点作为源节点Forrest Gump 作为目标节点

graphdb nodes and rel arr
图 7. 关系类型

请注意,Tom Hanks 节点拥有一个出站关系,而 Forrest Gump 节点拥有一个入站关系。

属性

属性是用于在节点和关系上存储数据的键值对。

属性的值部分:

  • 可以容纳不同的数据类型,如 number(数字)、string(字符串)或 boolean(布尔值)。

  • 可以容纳包含字符串、数字或布尔值的同构列表(数组)。

示例 1. 数字
CREATE (:Example {a: 1, b: 3.14})
  • 属性 ainteger(整数)类型,值为 1

  • 属性 bfloat(浮点数)类型,值为 3.14

示例 2. 字符串和布尔值
CREATE (:Example {c: 'This is an example string', d: true, e: false})
  • 属性 cstring(字符串)类型,值为 'This is an example string'

  • 属性 dboolean(布尔值)类型,值为 true

  • 属性 eboolean(布尔值)类型,值为 false

示例 3. 列表
CREATE (:Example {f: [1, 2, 3], g: [2.71, 3.14], h: ['abc', 'example'], i: [true, true, false]})
  • 属性 f 包含一个数组,值为 [1, 2, 3]

  • 属性 g 包含一个数组,值为 [2.71, 3.14]

  • 属性 h 包含一个数组,值为 ['abc', 'example']

  • 属性 i 包含一个数组,值为 [true, true, false]

有关可用数据类型的完整说明,请参阅 Cypher 手册 → 值与类型

遍历与路径

遍历(Traversal)是你查询图以寻找答案的方式,例如:“我的朋友喜欢什么我还没拥有的音乐?”或“如果这个电源断开,哪些 Web 服务会受到影响?”

遍历图意味着根据某些规则跟随关系访问节点。在大多数情况下,只会访问图的一个子集。

示例 4. 路径匹配。

要找出汤姆·汉克斯(Tom Hanks)在微型示例数据库中参演了哪些电影,遍历将从 Tom Hanks 节点开始,跟随连接到该节点的任何 ACTED_IN 关系,最终以 Movie 节点 Forrest Gump 作为结果(参见黑线)。

graphdb traversal arr

遍历结果可以作为长度为 1 的路径返回。

graphdb path arr

最短的路径长度为 0。它包含单个节点且没有关系。

仅包含单个节点的路径长度为 0

graphdb path zero arr
图 8. 长度为零的路径

包含一个关系的路径长度为 1

graphdb path example loop arr
图 9. 长度为一的路径

模式 (Schema)

Neo4j 中的 模式 指的是索引和约束。

Neo4j 通常被描述为模式可选,这意味着不必一定要创建索引和约束。你可以在不预先定义模式的情况下创建数据(节点、关系和属性)。当需要提高性能或获得建模优势时,可以随时引入索引和约束。

索引

索引用于提高性能。要查看如何使用索引的示例,请参阅 使用索引。有关如何在 Cypher 中使用索引的详细说明,请参阅 Cypher 手册 → 索引

约束

约束用于确保数据符合领域规则。要查看如何使用约束的示例,请参阅 使用约束。有关如何在 Cypher 中使用约束的详细说明,请参阅 Cypher 手册 → 约束

命名规范

节点标签、关系类型和属性(键部分)区分大小写,例如,属性 name 与属性 Name 是不同的。

推荐以下命名规范:

表 1. 命名规范
图实体 推荐风格 示例

节点标签

帕斯卡命名法 (PascalCase)

:VehicleOwner 而不是 :vehicle_owner

关系类型

全大写下划线 (Screaming snake case)

:OWNS_VEHICLE 而不是 :ownsVehicle

属性

驼峰命名法 (camelCase)

firstName 而不是 first_name

有关精确的命名规则,请参阅 Cypher 手册 → 命名规则与建议