图数据库概念
简介
本指南涵盖图数据库基础知识。
Neo4j 使用*属性图* 数据库模型。图数据结构由**节点**(离散对象)组成,这些对象可以通过**关系**连接起来。以下是包含三个节点(圆圈)和三个关系(箭头)的图的图像。
Neo4j 属性图数据库模型由以下部分组成:
-
**节点** 描述域的实体(离散对象)。
-
**节点** 可以具有零个或多个**标签**来定义(分类)它们是什么类型的节点。
-
**关系** 描述*源节点*和*目标节点*之间的连接。
-
**关系** 始终具有方向(单向)。
-
**关系** 必须具有**类型**(一种类型)来定义(分类)它们是什么类型的关系。
-
节点和关系可以具有**属性**(键值对),它们进一步描述了它们。
在数学中,图论是研究图的学科。 在图论中
|
示例图
下面显示的示例图介绍了属性图的基本概念
要创建示例图,请使用 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})
节点
节点用于表示域的实体(离散对象)。
最简单的图是一个没有关系的单个节点。考虑以下图,它包含单个节点。
节点标签是
-
Person
-
Actor
属性是
-
name: Tom Hanks
-
born: 1956
可以使用 Cypher 使用以下查询创建节点
CREATE (:Person:Actor {name: 'Tom Hanks', born: 1956})
节点标签
标签通过将节点分组(分类)到集合中来塑造域,在这些集合中,具有特定标签的所有节点都属于同一集合。
例如,所有代表用户的节点都可以用标签User
标记。有了它,你可以让 Neo4j 只对你的用户节点执行操作,例如查找具有给定名称的所有用户。
由于标签可以在运行时添加和删除,因此它们也可以用于标记节点的临时状态。Suspended
标签可以用来表示被暂停的银行账户,而Seasonal
标签可以用来表示当前处于季节的蔬菜。
节点可以具有零个到多个标签。
在示例图中,节点标签Person
、Actor
和Movie
用于描述(分类)节点。可以添加更多标签来表达数据的不同维度。
以下图显示了使用多个标签的情况。
关系
关系描述*源节点*和*目标节点*之间的连接是如何相关的。节点可以与自身具有关系。
关系
-
连接*源节点*和*目标节点*。
-
具有方向(单向)。
-
必须具有**类型**(一种类型)来定义(分类)它是什么类型的关系。
-
可以具有属性(键值对),它们进一步描述了关系。
关系将节点组织成结构,使图能够类似于列表、树、地图或复合实体——它们中的任何一个都可以组合成更复杂、相互连接丰富的结构。
关系类型:ACTED_IN
属性是
-
roles: ['Forrest']
-
performance: 5
roles
属性具有一个包含单个项目 ('Forrest'
) 的数组值。
可以使用 Cypher 使用以下查询创建关系
CREATE ()-[:ACTED_IN {roles: ['Forrest'], performance: 5}]->()
必须创建或引用*源节点*和*目标节点*才能创建关系。 |
关系始终具有方向。但是,在方向不有用时可以忽略方向。这意味着,除非需要正确描述数据模型,否则不需要添加反方向的重复关系。
节点可以与自身建立关系。要表达Tom Hanks
KNOWS
自己,可以表示为
属性
属性是键值对,用于存储节点和关系上的数据。
属性的值部分
-
可以保存不同的数据类型,例如
number
、string
或boolean
。 -
可以保存一个包含字符串、数字或布尔值的同构列表(数组)。
CREATE (:Example {a: 1, b: 3.14})
-
属性
a
的类型为integer
,值为1
。 -
属性
b
的类型为float
,值为3.14
。
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
。
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 手册 → 值和类型。 |
遍历和路径
遍历是指您查询图的方式,以找到问题的答案,例如:“我的朋友喜欢什么音乐,但我还没有?”或“如果这个电源供应器出现故障,哪些网络服务会受到影响?”
遍历图意味着根据某些规则,沿着关系访问节点。在大多数情况下,只访问图的一部分。
要根据小型示例数据库找出汤姆·汉克斯主演的电影,遍历将从 Tom Hanks
节点开始,沿着连接到该节点的任何 ACTED_IN
关系前进,最终得到 Movie
节点 Forrest Gump
作为结果(参见黑色线条)
遍历结果可以作为长度为 1
的路径返回
最短的路径长度为零。它包含单个节点,没有关系。
仅包含单个节点的路径长度为 0
。
包含一个关系的路径长度为 1
。
模式
Neo4j 中的模式是指索引和约束。
Neo4j 通常被称为可选模式,这意味着不需要创建索引和约束。您可以在没有预先定义模式的情况下创建数据 - 节点、关系和属性。可以在需要时引入索引和约束,以获得性能或建模优势。
索引
索引用于提高性能。要查看有关如何使用索引的示例,请参阅 使用索引。有关如何在 Cypher 中使用索引的详细说明,请参阅 Cypher 手册 → 索引。
约束
约束用于确保数据符合域的规则。要查看有关如何使用约束的示例,请参阅 使用约束。有关如何在 Cypher 中使用约束的详细说明,请参阅 Cypher 手册 → 约束。
命名约定
节点标签、关系类型和属性(关键部分)区分大小写,这意味着例如属性 name
与属性 Name
不同。
建议使用以下命名约定
图实体 | 推荐样式 | 示例 |
---|---|---|
节点标签 |
驼峰式命名法,以大写字母开头 |
|
关系类型 |
大写字母,使用下划线分隔单词 |
|
属性 |
小驼峰式命名法,以小写字母开头 |
|
有关精确的命名规则,请参阅 Cypher 手册 → 命名规则和建议。