图数据库概念

简介

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

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

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. 节点

节点标签是

  • 人物

  • 演员

属性是

  • 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 节点具有*传入*关系。

属性

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

属性的值部分

  • 可以包含不同的数据类型,例如 numberstringboolean

  • 可以包含同质列表(数组),例如,包含字符串、数字或布尔值。

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

  • 属性 b 的类型为 float,值为 3.14

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

  • 属性 d 的类型为 boolean,值为 true

  • 属性 e 的类型为 boolean,值为 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 手册 → 值和类型

遍历和路径

遍历是您查询图以找到问题答案的方式,例如:“我的朋友喜欢哪些我还没有的音乐?”,或者“如果此电源出现故障,哪些 Web 服务会受到影响?”。

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

示例 4. 路径匹配。

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

graphdb traversal arr

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

graphdb path arr

可能的最短路径长度为零。它包含一个节点,没有关系。

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

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

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

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

模式

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

Neo4j 通常被描述为*模式可选*,这意味着无需创建索引和约束。您可以不预先定义模式就创建数据——节点、关系和属性。索引和约束可以在需要时引入,以获得性能或建模上的优势。

索引

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

约束

约束用于确保数据遵循领域规则。有关如何使用约束的示例,请参阅使用约束。有关如何在 Cypher 中使用约束的详细描述,请参阅Cypher 手册 → 约束

命名约定

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

推荐以下命名约定

表 1. 命名约定
图实体 推荐样式 示例

节点标签

驼峰命名法,首字母大写

:VehicleOwner 而不是 :vehicle_owner

关系类型

大写,使用下划线分隔单词

:OWNS_VEHICLE 而不是 :ownsVehicle

属性

小驼峰命名法,首字母小写

firstName 而不是 first_name

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

© . All rights reserved.