精华 Neo4j官方教程:第3节,图数据库概念
发布于 9 天前 作者 pangguoming 112 次浏览 来自 分享

教程目录 引自:https://neo4j.com/docs/getting-started/appendix/graphdb-concepts/

图数据库概念

简介

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

Neo4j 使用属性图数据库模型。图数据结构由节点(离散对象)组成,这些节点可以通过关系连接。下图是一个包含三个节点(圆圈)和三个关系(箭头)的图的示例。 image ![图 1. 图结构的概念](插入图 1 的链接)

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

  • 节点:描述域的实体(离散对象)。
  • 标签:节点可以有零个或多个标签,用于定义(分类)它们是什么类型的节点。
  • 关系:描述源节点和目标节点之间的连接。
  • 方向:关系始终具有方向(单向)。
  • 类型:关系必须具有类型(一种类型),用于定义(分类)它们是什么类型的关系。
  • 属性:节点和关系可以具有属性(键值对),用于进一步描述它们。

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

在图论中:

  • 节点也称为顶点或点。
  • 关系也称为边、链接或线。

示例图

下图介绍了属性图的基本概念: image

![图 2. 示例图](插入图 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})

节点

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

最简单的图是单个节点,没有关系。 考虑以下图,它由一个节点组成。 image ![图 3. 节点](插入图 3 的链接)

节点标签是:

  • Person
  • Actor

属性是:

  • name: Tom Hanks
  • born: 1956

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

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

节点标签

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

例如,所有表示用户的节点都可以标记为标签 User。 这样,您可以要求 Neo4j 仅对您的用户节点执行操作,例如查找具有给定名称的所有用户。

由于标签可以在运行时添加和删除,因此它们也可以用于标记节点的临时状态。 Suspended 标签可用于表示已暂停的银行帐户,而 Seasonal 标签可以表示当前处于季节性的蔬菜。

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

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

下图显示了多个标签的使用。 image ![图 4. 多个标签](插入图 4 的链接)

关系

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

关系:

  • 连接源节点和目标节点。
  • 具有方向(单向)。
  • 必须具有类型(一种类型),用于定义(分类)它是什么类型的关系。
  • 可以具有属性(键值对),用于进一步描述关系。

关系将节点组织成结构,使图可以类似于列表、树、地图或复合实体 - 它们中的任何一个都可以组合成更复杂、更丰富地互连的结构。 image ![图 5. 关系](插入图 5 的链接)

关系类型:ACTED_IN

属性是:

  • roles: [‘Forrest’]
  • performance: 5

roles 属性具有一个数组值,其中包含一个项目(‘Forrest’)。

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

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

您必须创建或引用源节点和目标节点才能创建关系。

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

一个节点可以与自身建立关系。 要表达 Tom Hanks 认识自己,可以表示为: image ![图 6. 与单个节点的关系](插入图 6 的链接)

关系类型

关系必须只有一个关系类型。

下面是一个 ACTED_IN 关系,其中 Tom Hanks 节点作为源节点,Forrest Gump 作为目标节点。 image ![图 7. 关系类型](插入图 7 的链接)

观察到 Tom Hanks 节点具有传出关系,而 Forrest Gump 节点具有传入关系。

属性

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

属性的值部分:

  • 可以保存不同的数据类型,例如数字、字符串或布尔值。
  • 可以保存包含同类列表(数组),例如字符串、数字或布尔值。

示例 1. 数字

CREATE (:Example {a: 1, b: 3.14})

属性 a 的类型为整数,值为 1

属性 b 的类型为浮点数,值为 3.14

示例 2. 字符串和布尔值

CREATE (:Example {c: 'This is an example string', d: true, e: false})

属性 c 的类型为字符串,值为 'This is an example string'

属性 d 的类型为布尔值,值为 true

属性 e 的类型为布尔值,值为 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 手册 → 值和类型](链接到 Cypher 手册)。

遍历和路径

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

遍历图意味着按照某些规则通过跟随关系来访问节点。 在大多数情况下,仅访问图的子集。

示例 4. 路径匹配。

要根据小型示例数据库找出 Tom Hanks 参演了哪些电影,遍历将从 Tom Hanks 节点开始,跟随连接到该节点的任何 ACTED_IN 关系,并以 Movie 节点 Forrest Gump 作为结果结束(参见黑线): image 遍历结果可以作为长度为 1 的路径返回: image 最短的可能路径的长度为零。 它包含一个节点,没有关系。

仅包含单个节点的路径的长度为 0。 image ![图 8. 长度为零的路径](插入图 8 的链接)

包含一个关系的路径的长度为 1。 image ![图 9. 长度为 1 的路径](插入图 9 的链接)

模式

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

Neo4j 通常被描述为“模式可选”,这意味着没有必要创建索引和约束。 您可以创建数据 - 节点、关系和属性 - 而无需预先定义模式。 可以在需要时引入索引和约束,以获得性能或建模优势。

索引

索引用于提高性能。 要查看如何使用索引的示例,请参阅使用索引。 有关如何在 Cypher 中使用索引的详细说明,请参阅 [Cypher 手册 → 索引](链接到 Cypher 手册中的索引部分)。

约束

约束用于确保数据符合域的规则。 要查看如何使用约束的示例,请参阅使用约束。 有关如何在 Cypher 中使用约束的详细说明,请参阅 [Cypher 手册 → 约束](链接到 Cypher 手册中的约束部分)。

命名约定

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

建议使用以下命名约定:

表 1. 命名约定

图实体 推荐风格 示例
节点标签 驼峰式,以大写字符开头 :VehicleOwner 而不是 :vehicle_owner
关系类型 大写,使用下划线分隔单词 :OWNS_VEHICLE 而不是 :ownsVehicle
属性 小驼峰式,以小写字符开头 firstName 而不是 first_name

有关精确的命名规则,请参阅 [Cypher 手册 → 命名规则和建议](链接到 Cypher 手册中的命名规则和建议部分)。

回到顶部