Neo4j 使用属性图数据库模型。
图数据结构由可以通过关系连接的节点(离散对象)组成。
示例 1. 图结构的概念。
具有三个节点(圆圈)和三个关系(箭头)的图形。
Neo4j 属性图数据库模型包括:
- 节点描述域的实体(离散对象)。
- 节点可以有零个或多个标签来定义(分类)它们是什么类型的节点。
- 关系描述了源节点和目标节点之间的连接。
- 关系总是有一个方向(一个方向)。
- 关系必须有一个类型(一种类型)来定义(分类)它们是什么类型的关系。
- 节点和关系可以具有进一步描述它们的属性(键值对)。
在数学中,图论是对图的研究。 在图论中:
|
1. 示例图
下面显示的示例图,介绍了属性图的基本概念:
示例 2. 示例图。
要创建示例图,请使用 Cypher 子句CREATE
。
<span style="color:#2d3748"><span style="background-color:#ffffff"><code class="language-cypher"><span style="color:#718096">CREATE</span> (:<span style="color:#3182ce">Person</span>:Actor {name: <span style="color:#2f855a">'Tom Hanks'</span>, born: <span style="color:#3182ce">1956</span>})-[:<span style="color:#3182ce">ACTED_IN</span> {roles: [<span style="color:#2f855a">'Forrest'</span>]}]->(:<span style="color:#3182ce">Movie</span> {title: <span style="color:#2f855a">'Forrest Gump'</span>})<-[:<span style="color:#3182ce">DIRECTED</span>]-(:<span style="color:#3182ce">Person</span> {name: <span style="color:#2f855a">'Robert Zemeckis'</span>, born: <span style="color:#3182ce">1951</span>})</code></span></span>
2.节点
节点用于表示域的实体(离散对象)。
最简单的图是没有关系的单个节点。考虑下图,由单个节点组成。
示例 4. 节点。
节点标签为:
Person
Actor
属性是:
name: Tom Hanks
born: 1956
可以使用 Cypher 使用以下查询创建节点:
<span style="color:#2d3748"><span style="background-color:#ffffff"><code class="language-cypher"><span style="color:#718096">CREATE</span> (:<span style="color:#3182ce">Person</span>:Actor {name: <span style="color:#2f855a">'Tom Hanks'</span>, born: <span style="color:#3182ce">1956</span>})</code></span></span>
3.节点标签
标签通过将节点分组(分类)为集合来塑造域,其中具有特定标签的所有节点都属于同一集合。
例如,所有代表用户的节点都可以用 label 标记User
。有了这些,您可以要求 Neo4j 仅在您的用户节点上执行操作,例如查找具有给定名称的所有用户。
由于标签可以在运行时添加和删除,它们也可以用于标记节点的临时状态。Suspended
标签可以用来表示被暂停的银行账户,标签Seasonal
可以表示当前时令蔬菜。
一个节点可以有零到多个标签。
在示例图中,节点标签 、Person
和Actor
用于Movie
描述(分类)节点。可以添加更多的标签来表达数据的不同维度。
下图显示了多个标签的使用。
示例 5. 多个标签。
4. 关系
关系描述了源节点和目标节点之间的连接是如何相关的。节点可能与自身有关系。
关系:
- 连接源节点和目标节点。
- 有一个方向(一个方向)。
- 必须有一个类型(一种类型)来定义(分类)它是什么类型的关系。
- 可以具有进一步描述关系的属性(键值对)。
关系将节点组织成结构,允许图形类似于列表、树、地图或复合实体——其中任何一个都可以组合成更复杂、更丰富的互连结构。
示例 6. 关系。
关系类型:ACTED_IN
属性是:
roles: ['Forrest']
performance: 5
该roles
属性有一个数组值,其中包含一个项目 ( 'Forrest'
)。
可以使用 Cypher 使用以下查询创建关系:
<span style="color:#2d3748"><span style="background-color:#ffffff"><code class="language-cypher"><span style="color:#718096">CREATE</span> ()-[:<span style="color:#3182ce">ACTED_IN</span> {roles: [<span style="color:#2f855a">'Forrest'</span>], performance: <span style="color:#3182ce">5</span>}]->()</code></span></span>
您必须创建或引用源节点和目标节点才能创建关系。 |
关系总是有方向的。但是,在没有用处的地方可以忽略方向。这意味着不需要添加相反方向的重复关系,除非需要正确描述数据模型。
一个节点可以和它自己有关系。表达Tom Hanks
KNOWS
他自己将被表达为:
示例 7. 与单个节点的关系。
5. 关系类型
关系必须只有一种关系类型。
下面是一个ACTED_IN
关系,Tom Hanks
节点作为源节点,Forrest Gump
作为目标节点。
示例 8. 关系类型。
观察该Tom Hanks
节点具有传出关系,而该Forrest Gump
节点具有传入关系。
6. 属性
属性是用于在节点和关系上存储数据的键值对。
属性的值部分:
- 可以保存不同的数据类型,例如
number
、string
或boolean
. - 可以保存包含例如字符串、数字或布尔值的同构列表(数组)。
示例 9. 数字
<span style="color:#2d3748"><span style="background-color:#ffffff"><code class="language-cypher"><span style="color:#718096">CREATE</span> (:<span style="color:#3182ce">Example</span> {a: <span style="color:#3182ce">1</span>, b: <span style="color:#3182ce">3.14</span>})</code></span></span>
- 该属性具有值为
a
的类型。integer
1
- 该属性具有值为
b
的类型。float
3.14
示例 10. 字符串和布尔值
<span style="color:#2d3748"><span style="background-color:#ffffff"><code class="language-cypher"><span style="color:#718096">CREATE</span> (:<span style="color:#3182ce">Example</span> {c: <span style="color:#2f855a">'This is an example string'</span>, d: <span style="color:#3182ce">true</span>, e: <span style="color:#3182ce">false</span>})</code></span></span>
- 该属性具有值为
c
的类型。string
'This is an example string'
- 该属性具有值为
d
的类型。boolean
true
- 该属性具有值为
e
的类型。boolean
false
示例 11. 列表
<span style="color:#2d3748"><span style="background-color:#ffffff"><code class="language-cypher"><span style="color:#718096">CREATE</span> (:<span style="color:#3182ce">Example</span> {f: [<span style="color:#3182ce">1</span>, <span style="color:#3182ce">2</span>, <span style="color:#3182ce">3</span>], g: [<span style="color:#3182ce">2.71</span>, <span style="color:#3182ce">3.14</span>], h: [<span style="color:#2f855a">'abc'</span>, <span style="color:#2f855a">'example'</span>], i: [<span style="color:#3182ce">true</span>, <span style="color:#3182ce">true</span>, <span style="color:#3182ce">false</span>]})</code></span></span>
- 该属性
f
包含一个值为 的数组[1, 2, 3]
。 - 该属性
g
包含一个值为 的数组[2.71, 3.14]
。 - 该属性
h
包含一个值为 的数组['abc', 'example']
。 - 该属性
i
包含一个值为 的数组[true, true, false]
。
有关可用数据类型的详细说明,请参阅Cypher 手册 → 值和类型。 |
7.遍历和路径
遍历是您如何查询图表以找到问题的答案,例如:“我的朋友喜欢哪些我还没有拥有的音乐?”或“如果电源出现故障,哪些 Web 服务会受到影响? ”。
遍历图是指按照一定的规则遵循关系来访问节点。在大多数情况下,仅访问图的一个子集。
示例 12. 路径匹配。
为了根据小型示例数据库找出汤姆汉克斯演过哪些电影,遍历将从Tom Hanks
节点开始,遵循ACTED_IN
与节点连接的任何关系,并最终Forrest Gump
得到结果(见虚线):
遍历结果可以作为长度为的路径返回1
:
最短可能路径的长度为零。它包含一个节点并且没有任何关系。
示例 13. 长度为零的路径。
仅包含单个节点的路径的长度为0
。
示例 14. 长度为 1 的路径。
包含一个关系的路径的长度为1
。
8. 架构
Neo4j 中的模式是指索引和约束。
Neo4j 通常被描述为schema optional,这意味着不需要创建索引和约束。您可以创建数据——节点、关系和属性——而无需预先定义模式。可以在需要时引入索引和约束,以获得性能或建模优势。
9. 索引
索引用于提高性能。要查看如何使用索引的示例,请参阅使用索引。有关如何在 Cypher 中使用索引的详细说明,请参阅Cypher 手册 → 索引。
10. 约束
约束用于确保数据符合域的规则。要查看如何使用约束的示例,请参阅使用约束。有关如何在 Cypher 中使用约束的详细说明,请参阅Cypher 手册 → 约束。
11. 命名约定
节点标签、关系类型和属性(关键部分)区分大小写,例如,表示该属性name
与该属性不同Name
。
建议使用以下命名约定:
表 1. 命名约定
图实体 | 推荐款式 | 例子 |
节点标签 | 驼峰式,以大写字符开头 |
|
关系类型 | 大写,使用下划线分隔单词 |
|
财产 | 小写驼峰式,以小写字符开头 |
|
具体命名规则请参考Cypher 手册 → 命名规则和建议。
官方地址https://neo4j.com/docs/getting-started/current/graphdb-concepts/