Neo4j 使用属性图数据库模型。



图数据结构由可以通过关系连接的节点(离散对象)组成。



示例 1. 图结构的概念。



具有三个节点(圆圈)和三个关系(箭头)的图形。

neo4j包镜像源 neo4j optional_neo4j包镜像源

 

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


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



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




在图论中:




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



1. 示例图


下面显示的示例图,介绍了属性图的基本概念:


示例 2. 示例图。


neo4j包镜像源 neo4j optional_键值对_02

 

要创建示例图,请使用 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. 节点。


neo4j包镜像源 neo4j optional_键值对_03


节点标签为:


  • 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可以表示当前时令蔬菜。


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


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


下图显示了多个标签的使用。


示例 5. 多个标签。


neo4j包镜像源 neo4j optional_neo4j_04


4. 关系


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


关系:


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


关系将节点组织成结构,允许图形类似于列表、树、地图或复合实体——其中任何一个都可以组合成更复杂、更丰富的互连结构。


示例 6. 关系。


neo4j包镜像源 neo4j optional_键值对_05


关系类型: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. 与单个节点的关系。


neo4j包镜像源 neo4j optional_neo4j_06


5. 关系类型


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


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


示例 8. 关系类型。


neo4j包镜像源 neo4j optional_数组_07

 

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


6. 属性


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


属性的值部分:


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


示例 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的类型。integer1
  • 该属性具有值为b的类型。float3.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的类型。booleantrue
  • 该属性具有值为e的类型。booleanfalse


示例 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得到结果(见虚线):

neo4j包镜像源 neo4j optional_neo4j_08

 


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

neo4j包镜像源 neo4j optional_2d_09

 


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


示例 13. 长度为零的路径。


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

neo4j包镜像源 neo4j optional_数组_10

 


示例 14. 长度为 1 的路径。


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

neo4j包镜像源 neo4j optional_数组_11

 


8. 架构


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


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


9. 索引


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


10. 约束


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


11. 命名约定


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


建议使用以下命名约定:

表 1. 命名约定

图实体

推荐款式

例子

节点标签

驼峰式,以大写字符开头

:VehicleOwner而不是:vehice_owner

关系类型

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

:OWNS_VEHICLE而不是:ownsVehicle

财产

小写驼峰式,以小写字符开头

firstName而不是first_name

具体命名规则请参考Cypher 手册 → 命名规则和建议

官方地址

neo4j包镜像源 neo4j optional_neo4j_12

https://neo4j.com/docs/getting-started/current/graphdb-concepts/