赞
踩
Neo4j是由 Java 实现的开源 NoSQL 图数据库。Neo4j实现了专业数据库级别的图数据模型的存储。与普通的图处理或内存数据库不同,Neo4j 提供了完整的数据库特性,包括 ACID 事务的支持、集群支持、备份与故障转移等,这使其适合于企业级生产环境下各种应用。
Neo4j 还提供了一些特殊的功能
揭开 Neo4j 所采用什么样的体系结构
Neo4j 最初的设计动机是为了更好地描述实体之间的联系。现实生活中,每个实体都与周围的其他实体有千丝万缕的关系,这些关系里存在着大量的潜在信息。但是传统的关系型数据库更加注重刻画实体内部属性,实体与实体之间关系通过外键来实现,因此需要大量的 join 操作,而 join 操作通常又非常耗时。随着现实世界中关系的急剧增加,导致关系型数据库已经逐渐地难以承载查询海量数据深层次关系需要大量数据库操作带来复杂性,Neo4j 在这种情况应运而生
Neo4j 有一个重要的特点,就是用来保证关系查询的速度,既免索引邻接,数据库中每个节点都会维护与它相邻节点的引用。因此每个节点都相当于与它相邻节点的微索引,这比使用全局索引的代价要小很多。这就意味着查询时间和图的整体规模无关,只与它附近节点的数量成正比。在关系型数据库中使用全局索引连接各个节点,这些索引每个遍历都会增加一个中间层,因此会导致非常大的计算成本。而免索引邻接为图数据库提供了快速高效的图遍历能力
对比图
RDBMS 关系图要查找 Alice 所购买的东西,首先要执行关系表索引查询,时间成本 O(log(n)),n 为索引表的长度。这对于偶尔的浅层次查询是可以接受的,但是当查询的层次变深或者是执行反向查询时代码将变得不可接受。
Neo4j关系图使用了免索引近邻机制,每个节点都有直接或简介指向其相邻节点的指针。要查找 Alice 买过的东西,只需要在Alice 的关系链表中遍历,每次遍历成本为 O(1)
免索引邻接针对 RDBMS 中关系查询两个缺点做了改进
利用免索引邻接机制,在图数据库上进行关系查找效率非常高,这种高效是建立在图数据库注重关系的架构设计之上的。
节点(Node)是图数据库中的一个基本元素,用以表示一个实体记录,就像关系数据库中的一条记录一样。在 Neo4j 中节点可以包含多个属性(Property)和多个标签(Label)
这是一个最简单的节点,它只有一个属性,属性名是 name , 属性值是 Tom
关系(Relationship)同样是图数据库中的基本元素。当数据库中已经存在节点后,需要将节点连接起来构成图。关系就是用来连接两个节点,关系也成为图论的边(Edge), 其始端和末端都必须是节点,关系不能指向空也不能从空发起。关系和节点一样可以包含多个属性,单关系只能有一个类型(Type)
一个节点可以被多个关系指向或作为关系的起始关系
多个关系指向同一个节点
关系必须有开始节点(Start node) 和结束节点(End node),两头都不能为空
由于关系是有方向的,所以可在由几点、关系组成的图中进行遍历
上面提到节点和关系都可以有多个属性。属性是有键值对组成的,就像 Java 的哈希表咿呀,属性名类似变量名,属性值类似变量值。属性值可以是基本的数据类型,或者由基本数据类型组成的数组
当是有节点和关系创建一个图后,在此图中任意两个几点间都是可能存在路径的
任意两节点都存在由节点和关系组成的路径,路径也有长度的概念,也就是路径中关系的条数,当然也可以说单独一个节点就可以组成长度为0的路径
遍历一张图就是按照一定规则,根据它们之间的关系,依次访问是有相关联的节点的操作。
对于遍历操作不必自己实现,因为 Neo4j 提供了一套高效的遍历 API ,可以指定遍历规则,然后让 Neo4j 自动按照遍历规则遍历并返回遍历的结果。遍历规则可以是广度优先,也可以是深度优先
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。