
2.3 Neo4j图数据中基本元素与概念
2.3.1 节点
节点(Node)是图数据库中的一个基本元素,用以表示一个实体记录,就像关系数据库中的一条记录一样。在Neo4j中节点可以包含多个属性(Property)和多个标签(Label),如图2-36所示。

图2-36 带有属性和标签的节点
下面介绍一个最简单的节点,它只有一个属性,属性名是name,属性值是Tom,如图2-37所示。

图2-37 只有属性的简单节点
2.3.2 关系
关系(Relationship)同样是图数据库中的基本元素。当数据库中已经存在节点后,需要将节点连接起来构成图。关系就是用来连接两个节点,关系也称为图论的边(Edge),其始端和末端都必须是节点,关系不能指向空也不能从空发起。关系和节点一样可以包含多个属性,但关系只能有一个类型(Type),如图2-38所示;一个节点可以被多个关系指向或作为关系的起始节点,如图2-39所示多个关系指向同一节点。

图2-38 带有类型和属性的关系

图2-39 多个关系指向同一节点
关系必须有开始节点(Start node)和结束节点(End node),两头都不能为空,如图2-40所示。

图2-40 关系的起始节点和结束节点
节点可以被关系串联或并联起来,如图2-41、图2-42所示。由于关系可以是有方向的,所以可在由节点、关系组成的图中进行遍历操作。

图2-41 关系串联节点

图2-42 关系并联节点
在图的遍历操作中我们可以指定关系遍历的方向或者指定为无方向,因此在创建关系时不必为两个节点创建相互指向的关系,而是在遍历时不指定遍历方向即可。
特别注意一个节点可以存在指向自己的关系,如图2-43所示。

图2-43 关系的起始、结束节点为同一节点
2.3.3 属性
上面提到节点和关系都可以有多个属性。属性是由键值对组成的,就像Java的哈希表一样,属性名类似变量名,属性值类似变量值。属性值可以是基本的数据类型,或者由基本数据类型组成的数组。
需要注意的是属性值没有null的概念,如果一个属性不需要了可以直接将整个键值对都移除,在使用Cypher或Java API时(详见“第4章Neo4j程序开发”),可用IS NULL关键字判断属性是否存在。表2-1列出了Neo4j中属性值的基本数据类型。
表2-1 属性值类型

2.3.4 路径
当使用节点和关系创建了一个图后,在此图中任意两个节点间都是可能存在路径的,如图2-44所示。图中任意两节点都存在由节点和关系组成的路径,路径也有长度的概念,也就是路径中关系的条数。

图2-44 路径
当然也可以说单独一个节点就可以组成长度为0的路径,如图2-45所示。

图2-45 长度为0的路径
如果是两个简单的节点,中间只存在一条关系,那这条路径的长度就是1,如图2-46所示。

图2-46 长度为1的路径
2.3.5 遍历(Traversal)
遍历一张图就是按照一定的规则,根据它们之间的关系,依次访问所有相关联的节点的操作。
对于遍历操作不必自己实现,因为Neo4j提供了一套高效的遍历API,可以指定遍历规则,然后让Neo4j自动按照遍历规则遍历并返回遍历的结果。遍历规则可以是广度优先,也可以是深度优先。
想对遍历框架有一个深入的了解,请参见“第3章Neo4j之Cypher”的有关章节;想了解更多的Java代码范例,请参见“第4章Neo4j程序开发”的有关章节。